这是一个Matrix知识问题,我说的是XNA,但仅作为参考
我在XNA上分解了一个矩阵并获得了分解的值,然后又尝试再次创建 来自这些值的矩阵和结果矩阵与原始矩阵不匹配
我试图规范化四元数
我尝试从Quaternion生成旋转矩阵
我尝试交换转换SRT,STR,TRS,TSR,RST,RTS的顺序
为什么我这样做?我正在创建自己的模型导入器,我正在比较我的结果 与XNA使用相同的模型,所以我读取几乎(一些小数差异)相同的源SRT作为XNA的分解值,但我的结果矩阵与XNA不匹配,所以我回到基础并尝试分解/重构XNA矩阵,但我发现它不匹配
这些是原始XNA矩阵值
?this.XNAModel.Bones[0].Transform
{{M11:1.331581E-06 M12:-5.551115E-17 M13:1 M14:0}
{M21:1 M22:-4.16881E-11 M23:-1.331581E-06 M24:0}
{M31:4.16881E-11 M32:1 M33:8.15331E-23 M34:0}
{M41:0.03756338 M42:37.46099 M43:2.230549 M44:1} }
分解,lFlag是真的
bool lFlag = this.XNAModel.Bones[0].Transform.Decompose(out lDecScale, out lDecRotation, out lDecTranslation);
//decomposed values
?lDecScale
{X:1 Y:1 Z:1}
?lDecRotation //quat
{X:-0.5000003 Y:-0.4999996 Z:-0.4999996 W:0.5000004}
?lDecTranslation
{X:0.03756338 Y:37.46099 Z:2.230549}
从分解的值中重构矩阵,我尝试了所有组合SRT
//lDecRotation.Normalize();
Matrix lRecompose = Matrix.CreateScale(lDecScale) *
Matrix.CreateFromQuaternion(lDecRotation) * Matrix.CreateTranslation(lDecTranslation);
使用SRT的四元数未归一化结果,并不匹配原始矩阵
?lRecompose
{{M11:1.430511E-06 M12:-5.960464E-08 M13:0.9999999 M14:0}
{M21:0.9999999 M22:1.192093E-07 M23:-1.370907E-06 M24:0}
{M31:-5.960464E-08 M32:0.9999999 M33:1.192093E-07 M34:0}
{M41:0.03756338 M42:37.46099 M43:2.230549 M44:1} }
使用SRT进行四元数标准化结果,并不匹配原始矩阵
?lRecompose
{{M11:1.192093E-06 M12:-5.960464E-08 M13:1 M14:0}
{M21:1 M22:-1.192093E-07 M23:-1.370907E-06 M24:0}
{M31:-5.960464E-08 M32:1 M33:-1.192093E-07 M34:0}
{M41:0.03756338 M42:37.46099 M43:2.230549 M44:1} }
这是我的模型导入器读取的内容
?this.ModelNew.Bones[0].Scale
{X:1 Y:1 Z:1}
?this.ModelNew.Bones[0].Rotation
{X:-0.0002303041 Y:-8.604798E-05 Z:-5.438289}
此结果与XNA中的分解结果之间存在微小差异
//My importer, based on the above Rotation Vector, converted to radians
?lQuat {X:-0.4999999 Y:-0.5 Z:-0.5 W:0.4999999}
//XNA
{X:-0.5000003 Y:-0.4999996 Z:-0.4999996 W:0.5000004}
?this.ModelNew.Bones[0 ].Translation
{X:0.03756338 Y:37.46099 Z:2.230549}
答案 0 :(得分:1)
根据图形API管理矩阵的方式以及建模软件如何导出矩阵,您可能需要在分解矩阵之前对其进行转置,然后在重新组合后转置结果以获得与原始矩阵相同的结果。 / p>
顺便说一下,重构的正确顺序是首先翻译,然后旋转,然后缩放。