我很确定mOffsetMatrix将顶点从网格空间转换为骨骼空间,这一点得到了确认 http://assimp.sourceforge.net/lib_html/structai_bone.html
然后我看到了这个,它说它实际上将顶点从骨空间转换为网格空间。 https://github.com/assimp/assimp/pull/1803
现在我很困惑。那么mOffsetMatrix到底做了什么?
答案 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”页面上使用 与列向量的预乘。
希望这会对你有所帮助。