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の部分は、回転の周りの軸を表します。あなたの例では、マトリックスは.707ラジアンまたは〜40.5度だけ(0,0,0)回転しています。

編集:

ヨー、ピッチ、ロールを探している場合は、クォータニオンから抽出できます: 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 に答える