我正在尝试使用gltf 2.0资产实现骨架动画。
我目前能够变换骨架并正确渲染模型。编辑关节的变换(例如旋转(时,模型会按预期移动。
问题是,一旦我尝试使用动画采样器输出的变换,骨架就完全错误了。我的测试表明,动画第一个关键帧的变换矩阵将与初始姿势中关节的变换相匹配,但事实上它们完全不同!我还不清楚这些变换在渲染算法中的确切位置。
我的渲染算法大致如下:
render_scene() {
render_node(root_node, transform::IDENTIY)
}
render_node(node, outer_transform) {
next_transform = outer_transform * node.transform
if (node.has_skin) {
update_joint_matrices(next_transform, node.joints)
}
if (node.has_mesh) {
// draw calls
}
for child in node.children {
render_node(child, next_transform)
}
}
update_joint_matrices(outer_transform, joints) {
world_transforms = []
// Parent nodes are always processed before child nodes
for joint in joints {
if joint.is_root {
world_transforms[joint] = outer_transform * joint.transform
} else {
world_transforms[joint] = world_transforms[joint.parent] * joint.transform
}
}
joint_matrices = []
for joint in 0..world_transforms.len() {
joint_matrices[joint] = world_transforms[joint] * inverse_bind_matrices[joint]
}
// send joint matrices to the GPU
}
顶点着色器的相关部分如下所示:
void main() {
mat4 modelTransform;
modelTransform =
(inWeights.x * jointMatrices[int(inJoints.x)]) +
(inWeights.y * jointMatrices[int(inJoints.y)]) +
(inWeights.z * jointMatrices[int(inJoints.z)]) +
(inWeights.w * jointMatrices[int(inJoints.w)]);
}
gl_Position = projection * view * modelTransform * vec4(inPos, 1.0);
}
此外,规范中有一条我不太理解的注释:
只有关节变换应用于蒙皮网格;蒙皮网格节点的变换必须被忽略。
好的,我解决了这个问题。问题是我没有正确加载四元数。四元数应解释为原始XYZW值。