首页 > 解决方案 > mOffsetMatrix 在 Assimp 中实际上做了什么?

问题描述

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

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

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

标签: c++openglassimp

解决方案


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

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

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


推荐阅读