首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分解矩阵的重组矩阵不匹配

分解矩阵的重组矩阵不匹配
EN

Stack Overflow用户
提问于 2012-03-11 03:27:28
回答 1查看 629关注 0票数 1

这是一个矩阵知识问题,我正在谈论XNA,但仅供参考

我在XNA上分解了一个矩阵,得到了分解后的值,然后尝试从这些值重新创建矩阵,结果矩阵与原始矩阵不匹配

我试着使四元数正常化

我试着从四元数生成旋转矩阵

我尝试交换转换SRT、STR、TRS、TSR、RST、RTS的顺序

我为什么要这么做?我正在创建自己的模型导入器,并使用相同的模型将我的结果与XNA进行比较,因此我读取的源SRT与XNA的分解值几乎相同(一些十进制差异),但我的结果矩阵与XNA不匹配,因此我回到基础并尝试分解/重组XNA矩阵,但我发现它也不匹配

这些是原始的XNA矩阵值

代码语言:javascript
复制
?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为真

代码语言:javascript
复制
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

代码语言:javascript
复制
//lDecRotation.Normalize();

Matrix lRecompose = Matrix.CreateScale(lDecScale) * 
Matrix.CreateFromQuaternion(lDecRotation) * Matrix.CreateTranslation(lDecTranslation);

四元数未使用SRT标准化结果,与原始矩阵不匹配

代码语言:javascript
复制
?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的四元数归一化结果与原始矩阵不匹配

代码语言:javascript
复制
?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} }

这是我的模型导入器读到的内容

代码语言:javascript
复制
?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分解后的结果有一点不同

代码语言:javascript
复制
//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}
EN

回答 1

Stack Overflow用户

发布于 2014-12-17 13:06:35

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

顺便说一下,重组的正确顺序是先平移,然后旋转,然后缩放。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9649479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档