我非常确定mOffsetMatrix会将顶点从网格空间转换为骨骼空间,这一点已经证实了这一点。
http://assimp.sourceforge.net/lib_html/structai_bone.html
但是后来我看到了,它表示实际上是将顶点从骨骼空间转换为网格空间。
https://github.com/assimp/assimp/pull/1803
现在我很困惑。那么mOffsetMatrix到底是做什么的呢?
最佳答案
骨骼的 offsetMatrix 是绑定(bind)姿势处该骨骼的全局变换的逆。换句话说,如果遍历骨骼/节点层次结构,将每个骨骼/节点的局部变换(Assimp中的mTransformation)应用于其子级,我们将获得每个骨骼/节点的全局变换。特定骨骼的此矩阵的逆等于其offsetMatrix。正如此处所暗示的,它可以手动计算-无论它是恒定的,都不应该每帧计算一次。
名称“offsetMatrix”虽然有些困惑(例如 inverseBind 会更清晰),但可能来自其用法。我们用于蒙皮的变换是( B_keyframe * offsetMatrix ),其中 B_keyframe 是某个目标位置的骨骼的全局变换,例如通过动画剪辑。这种复合变换实际上是从绑定(bind)姿势(定义网格顶点的位置)到B_keyframe的偏移。当应用于顶点时,(B_keyframe * offsetMatrix)会将顶点从绑定(bind)位置“移动”到B_keyframe转换到的任何位置。
请注意,如果B_keyframe等于绑定(bind)转换,例如根据上面的骨骼的mTransformation:s计算得出,则(B_keyframe * offsetMatrix)是恒等式,并且顶点不会从绑定(bind)姿势的原始位置移动。
对于offsetMatrix,我个人更喜欢“从网格空间到骨骼空间”的定义。为什么?因为offsetMatrix的逆过程((全局)骨骼变换(绑定(bind)姿势))最直观地理解为从骨骼到网格/模型空间的变换。反过来,offsetMatrix将从网格/模型空间转换为骨骼空间。
与渲染中的View矩阵进行比较:它是摄影机的世界变换(T * R)的逆过程,通常被理解为从世界到 View 空间的变换。