クォータニオン

■クオータニオンは以下で定義されます。
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になりました。
ちょびっと使い方が分かった