mOffsetMatrix在Assimp中实际做了什么?

时间:2018-05-02 21:13:24

标签: c++ opengl assimp

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

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

现在我很困惑。那么mOffsetMatrix到底做了什么?

3 个答案:

答案 0 :(得分:3)

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

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

当涉及到offsetMatrix时,我个人更喜欢“从网格空间到骨骼空间”的定义。为什么?因为offsetMatrix的倒数-(全局)骨骼变换(绑定姿势)-最直观地理解为从骨骼到网格/模型空间的变换。反过来,offsetMatrix将从网格/模型空间转换为骨骼空间
与渲染中的View矩阵进行比较:它是摄影机的世界变换(T * R)的逆过程,通常被理解为从世界到视图空间的变换。

答案 1 :(得分:0)

文档错误。所以我需要更新我们的文档。见issue 1950

答案 2 :(得分:0)

以下是您的问题的答案(来自错误的解决方案):

  

这取决于你对变换的看法。如果矩阵   乘法在点之后(即点*变换点)   作为一个“行”向量)然后说它转换成是有道理的   “网格空间到骨骼空间”,因为它在网格空间中占据一个点   输出骨骼空间中的一个点。但是在使用矩阵预乘时   as assimp(转换*指向点是“列”向量)   将它想象为改变空间本身更有意义,   从“骨空间到网格空间”,网格空间中的点就可以了   使用。

     

这就是原始海报混淆的原因,因为他们正在思考   与assimp如何对待点转换相比,它倒退了。   这可能直接导致他们对锻炼的困惑   骨骼的转换矩阵,并认为这应该是   与mOffsetMatrix相同,实际上它是反向的。

     

这一点特别令人困惑,因为DirectX使用了后复制,   和OpenGL使用预乘。

     

这一切都说,我希望有人可以更新文档   这让每个人都清楚。指定起来非常困难   显然没有“官方”的思考方式   事情。我甚至无法在任何地方找到它来记录assimp对待   变换矩阵乘法...虽然矩阵表示法   在assimp docs的“Data Structures”页面上使用   与列向量的预乘。

希望这会对你有所帮助。