mOffsetMatrix 在 Assimp 中实际上做了什么?

Man*_*yen 3 c++ opengl assimp

我非常确定 mOffsetMatrix 将顶点从网格空间转换为骨骼空间,这一点得到了这个 http://assimp.sourceforge.net/lib_html/structai_bone.html的证实

但后来我看到了这个,它实际上将顶点从骨骼空间转换为网格空间。 https://github.com/assimp/assimp/pull/1803

现在我很困惑。那么mOffsetMatrix到底是做什么的呢?

小智 8

骨骼的 offsetMatrix 是该骨骼在绑定姿势处的全局变换的倒数。换句话说,如果遍历骨骼/节点层次结构,将每个骨骼/节点的局部变换( Assimp 中的mTransformation)分层应用到其子节点,我们将获得每个骨骼/节点的全局变换。特定骨骼的该矩阵的等于其偏移矩阵。正如此处所暗示的,它可以手动计算 - 不管怎样,它是恒定的,不应该每帧计算。

“offsetMatrix”这个名字虽然有点令人困惑(比如inverseBind会更清楚),但可能来自它的使用。我们用于蒙皮的变换是(B_keyframe * offsetMatrix),其中B_keyframe是某个目标位置处骨骼的全局变换,例如由动画剪辑提供。该复合变换实际上是从绑定姿势(定义网格顶点的位置)到 B_keyframe 的偏移量。当应用于顶点时,(B_keyframe * offsetMatrix) 会将顶点从绑定位置“移动”到 B_keyframe 变换到的任何位置。
请注意,如果 B_keyframe 等于绑定变换(例如,如上所述根据骨架的 mTransformation:s 计算),则 (B_keyframe * offsetMatrix) 为恒等,并且顶点不会从绑定姿势中的原始位置移动。

当谈到offsetMatrix时,我个人更喜欢“从网格空间到骨骼空间”的定义。为什么?因为 offsetMatrix 的逆 - (全局)骨骼变换(在绑定姿势) - 最直观地理解为从骨骼到网格/模型空间的变换。反过来,offsetMatrix从网格/模型空间变换到骨骼空间
与渲染中的视图矩阵对比:它是相机世界变换(T*R)的逆矩阵,一般理解为从世界空间到视图空间的变换。