クォータニオン
■クオータニオンは以下で定義されます。 Q(w;x,y,z) (w:実部、虚部:x,y,z) ■クオータニオン同士の掛け算は以下で定義されます。 A(a;U) B(b;V) AB=(ab-U・V;aV+bU+U×V) ■三次元座標の点Pはクオータニオンで以下に定義されます。 P(0;x,y,z) ■クオータニオンで点Pの回転を表現すると(α、β、γは回転軸) P = (0;x,y,z) Q = (cos(θ/2);αsin(θ/2),βsin(θ/2),γsin(θ/2)) R = (cos(θ/2);-αsin(θ/2),-βsin(θ/2),-γsin(θ/2)) RPQ = (0;x',y',z') となるみたいです。 ※ベクトルの内積 A・B = ax*bx+ay*by+az*bz ※ベクトルの外積 A×B = (ay*zb-by*az, az*bx-bz*ax, ax*by-bx*ay)
参考になったサイト
http://www015.upp.so-net.ne.jp/notgeld/quaternion.html
紙と鉛筆で計算したら違う結果になった。。。あれ?
実際にプログラムで試してみた。
P(2,0,0)をz軸中心に+90度回転させたらP'(0,2,0)になるはずですよね!
D3DXQUATERNION p, q, r; q.x = 0.0f; q.y = 0.0f; q.z = sin(D3DXToRadian(90/2)); q.w = cos(D3DXToRadian(90/2)); D3DXQuaternionConjugate(&r, &q); // 共役を取得 // 点P(2, 0, 0)を表すクオータニオン p.x = 2.0f; p.y = 0.0f; p.z = 0.0f; p.w = 0.0f; D3DXQUATERNION ans = r * p * q;
結果はans.x = 0, ans.y = 1.99999 ans.z = 0, ans.w = 0になりました。
ちょびっと使い方が分かった