来自分解矩阵的重组矩阵不匹配

时间:2012-03-10 19:27:28

标签: opengl-es xna directx

这是一个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}

1 个答案:

答案 0 :(得分:1)

根据图形API管理矩阵的方式以及建模软件如何导出矩阵,您可能需要在分解矩阵之前对其进行转置,然后在重新组合后转置结果以获得与原始矩阵相同的结果。 / p>

顺便说一下,重构的正确顺序是首先翻译,然后旋转,然后缩放。