c++ - mOffsetMatrix 在 Assimp 中实际上做了什么?
问题描述
我很确定 mOffsetMatrix 将顶点从网格空间转换为骨骼空间,这一点得到了证实 http://assimp.sourceforge.net/lib_html/structai_bone.html
但后来我看到了这个,它说它实际上将顶点从骨骼空间转换到网格空间。 https://github.com/assimp/assimp/pull/1803
现在我很困惑。那么 mOffsetMatrix 到底是做什么的呢?
解决方案
骨骼的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)的逆矩阵,一般理解为从世界变换到视图空间。
推荐阅读
- nuget - 恢复nuget包冲突
- mysql - 如何优化具有多对多关系的 mysql COUNT() 查询(通过第三个表)
- flutter - Flutter-Web:url_launcher 链接小部件鼠标悬停
- javascript - 当包有声明文件时,如何将 Javascript 库导入 Typescript
- reactjs - 打字稿useState:带有参数的子项中的SetState
- python - 如何从 sqlalchemy 中的上层访问子类?
- ethereum - Solidity:扩展已经部署的合约
- javascript - 在画布中,有没有办法判断 img.src 何时完成加载?
- python - Pyspark's df.writeStream generates no output [SOLVED]
- pivot - TradingView 图表上的水平线