DirectX - 矩阵到四元数

时间:2013-01-25 02:17:07

标签: 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 = 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

这个四元数并不代表任何旋转......然而,矩阵确实有旋转......这个旋转是什么?为什么功能不能提供准确的结果?

2 个答案:

答案 0 :(得分:2)

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

编辑:

如果您正在寻找Yaw,Pitch and Roll,您可以从四元数中提取它: http://sunday-lab.blogspot.com/2008/04/get-pitch-yaw-roll-from-quaternion.html

答案 1 :(得分:1)

你的矩阵:

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

这是带有y和z交换的单位矩阵:你的场景是Y-Up或Z-Up,而Blender期望D3D相反,所以它使用这个矩阵来交换y和z。如果您愿意,可以将其视为轮换,但最终结果是相同的。