Assimp中aiNode::mTransformation计算逻辑及与Blender差异问询
Assimp中aiNode::mTransformation的计算逻辑与Blender差异解析
核心差异来源
aiNode::mTransformation是节点相对于父节点的局部变换矩阵,但和Blender界面显示的变换参数无法直接对应,主要源于以下几点:
1. 坐标系与轴向上的转换
Blender默认使用Y轴向上的右手坐标系,而Assimp在导入模型时(尤其是处理FBX等格式),会自动进行坐标系转换(比如部分场景下会将Y轴向上转为Z轴向上,或调整轴的方向),这会直接改变变换矩阵的数值。
2. 变换顺序的差异
- Blender中物体的局部变换执行顺序是 缩放 → 旋转 → 平移,对应的矩阵计算为:
平移矩阵 × 旋转矩阵 × 缩放矩阵(矩阵乘法从右到左,先应用缩放,再旋转,最后平移)。 - Assimp的mTransformation矩阵构建顺序为 平移 → 旋转 → 缩放,对应的矩阵计算为:
缩放矩阵 × 旋转矩阵 × 平移矩阵,和Blender的变换顺序完全相反,这会导致矩阵数值出现明显差异。
3. 矩阵存储顺序不同
Blender内部使用行主序存储矩阵,而Assimp的aiMatrix4x4采用列主序存储。这意味着直接读取矩阵元素时,行列的顺序是颠倒的。比如Blender矩阵的第1行第2列元素,对应Assimp矩阵的第2行第1列元素。
4. 旋转参数的转换
Blender默认使用ZYX顺序的欧拉角表示旋转,而Assimp在将旋转转换为矩阵时,会先将欧拉角转为四元数,再转换为旋转矩阵,这个过程中如果欧拉角顺序不匹配,也会导致旋转部分的矩阵数值差异。
验证与修正方法
如果需要将Blender的变换参数和Assimp的mTransformation对应,可以手动按照以下步骤计算:
- 按照Blender的变换顺序(缩放→旋转→平移)构建行主序矩阵。
- 将行主序矩阵转换为列主序。
- 进行坐标系轴向的转换(比如将Y轴向上转为Assimp使用的坐标系)。
- 将得到的矩阵和Assimp读取的mTransformation对比,即可验证一致性。
内容的提问来源于stack exchange,提问作者SZYoo
相关产品推荐
相关产品推荐

