我想用骨骼动画渲染一个网格。在制作动画之前,我只想用动画的第一个关键帧渲染网格,即渲染网格与骨骼层次变换到位。我忽略了 glTF 中的场景结构;我只是meshes[0]
用来获取网格并skins[0]
获取它的骨架。
我知道最终的skin
矩阵,作为制服馈送到顶点着色器,是计算出来的
for (bone in bones) {
bone.skin_xform = inverse(global_xform) * bone.global_xform * bone.inv_bind_xform;
}
当我这样做时,我看到我的模型在地面以下 11.4 (5.7 + 5.7) 个单位(平面在 Z = 0;世界有 +Z 向上)。当我只渲染没有任何蒙皮的网格时,即只有位置、法线和纹理坐标,它位于地面上。我还能够推断为什么在剥皮时会发生这种情况。
这是相关部分gltf
"skins" : [
{
"inverseBindMatrices" : 6,
"joints" : [
0,
...
}
],
"nodes" : [
{
"name" : "Root",
"rotation" : [
0,
0,
1,
0
],
"translation" : [
0,
0,
-5.709875583648682
]
},
{
"mesh" : 0,
"name" : "Body",
"skin" : 0
},
{
"children" : [
0,
1
],
"name" : "Armature",
"translation" : [
0,
0,
5.709875583648682
]
}
]
我已经阅读了 glTF 的文档、教程和参考指南 (PDF)。虽然文档根本没有谈到它,但教程和参考指南不得不说inverse(global_xform)
:
顶点必须使用网格附加到的节点的全局变换的逆进行变换,因为该变换已经使用模型-视图-矩阵完成,因此必须从蒙皮计算中取消。
据此,必须反转和使用Body
的全局变换。这导致translateZ(-5.7)
. 根已经有一个局部变换translateZ(-5.7)
,所以我理解网格到地面的 -11.4 偏移量。但是,如果我Body
按原样使用 's 全局变换,没有反转,则在上述公式中没有问题。
为什么参考指南要求我们反转根骨骼父级的全局变换?我错过了什么?当我从 Blender 导入这个模型时,我注意到骨架对象上的变换确实是translateZ(5.7)
.