Math DirectX-矩阵到四元数

Math DirectX-矩阵到四元数,math,matrix,directx,quaternions,Math,Matrix,Directx,Quaternions,我试图使用directX的D3DXQuaternionRotationMatrix()函数从矩阵中检索旋转四元数。该矩阵由Blender(一种开源3D图形环境)生成,用于重新定向网格对象以在DirectX中使用。问题是上述函数只返回四元数中的“w”值。下面是矩阵,后面是函数: D3DXMATRIX mA; ._11 = 1; ._12 = 0; ._13 = 0; ._14 = 0; ._21 = 0; ._22 = 0; ._23 = 1; ._24 = 0; ._31 = 0; ._32 =

我试图使用directX的D3DXQuaternionRotationMatrix()函数从矩阵中检索旋转四元数。该矩阵由Blender(一种开源3D图形环境)生成,用于重新定向网格对象以在DirectX中使用。问题是上述函数只返回四元数中的“w”值。下面是矩阵,后面是函数:

D3DXMATRIX mA;
._11 = 1;
._12 = 0;
._13 = 0;
._14 = 0;
._21 = 0;
._22 = 0;
._23 = 1;
._24 = 0;
._31 = 0;
._32 = 1;
._33 = 0;
._34 = 0;
._41 = 0;
._42 = 0;
._43 = 0;
._44 = 1;

D3DXQUATERNION qA;
D3DXQuaternionRotationMatrix( &qA, &mA );
D3DXQuaternionConjugate( &qA, &qA );

result:

qA.x = 
qA.y = 
qA.z = 0;
qA.w = 0.707
这个四元数不代表任何旋转…但是,矩阵有旋转…这个旋转是什么?为什么函数不能提供准确的结果?

您的矩阵:

1; 0; 0; 0;
0; 0; 1; 0;
0; 1; 0; 0;
0; 0; 0; 1;

这是y和z交换的身份矩阵:您的场景是y向上或z向上,Blender希望D3D是相反的,因此它使用此矩阵交换y和z。如果愿意,可以将其视为旋转,但最终结果是相同的。

四元数的W表示以弧度表示的旋转。X、Y和Z部分表示旋转所围绕的轴。在您的示例中,矩阵围绕(0,0,0)旋转0.707弧度或~40.5度

编辑:

如果要查找偏航、俯仰和横摇,可以从四元数中提取:

为什么旋转矩阵为4x4?我对“旋转”矩阵的每次体验都是3x3:俯仰和偏航,三个欧拉角,等等。它来自搅拌机开发人员编写的导出脚本……第四行(._41->._44)是翻译数据……它是一个转换矩阵……D3DXMatrixDecompose()函数不提供结果,因为矩阵不是仿射的。。。