1

我正在尝试使用 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

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

4

2 回答 2

2

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

编辑:

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

于 2013-01-30T22:12:31.250 回答
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。如果愿意,您可以将其视为轮换,但最终结果是相同的。

于 2013-01-30T21:16:46.460 回答