四元數基礎函數
一、定義。ui
typedef struct D3DXQUATERNION { FLOAT x; FLOAT y; FLOAT z; FLOAT w;} 3DXQUATERNION;3d
DIRECTX9文檔中定義,令q爲一四元數,theta爲繞軸axis旋轉的角度,則:orm
q.x = sin(theta/2) * axis.x
q.y = sin(theta/2) * axis.y
q.z = sin(theta/2) * axis.z
q.w = cos(theta/2)ip
能夠簡單寫爲:q = [sin(theta/2)axis, sin(theta/2)w] 或者 [x,y,z,w] 或者[v,w]文檔
二、負四元數-q 。it
-q = [-q.x, -q.y, -q.z, -q.w]io
3D幾何意義:軸變換了方向,角度也換了方向,恰好 -q = q。這個特性比較鬱悶,在3D中任意方位,都有2種不一樣的四元數表示方法,居然不是惟一的。基礎
三、單位四元數q = [0,0,0,1].變量
3D幾何意義:好像還看不出有什麼幾何意義。補充:用處是爲了表示旋轉0角度,通常用在變量初始化,和矩陣的單位初始話一個道理。
D3DXQuaternionIdentity
D3DXQuaternionIsIdentity
四、四元數的長度或者模 ||q||。
D3DXQuaternionLengthSq 長度的平方 = x*x + y*y + z*z + w*w;
D3DXQuaternionLength 長度,上式的平方根。
根據3D中四元數的定義,只有單位長度的四元數纔有意義。儘管在DIRECTX中不少公式並不要求單位四元數,可是咱們必須明白,只有單位四元數纔有意義。補充:單位四元數的長度爲1.
D3DXQuaternionNormalize,這個公式是求標準四元數,相似矢量的正則化。
五、共軛: [-x, -y, -z, w]。逆:共軛除於長度,記爲q-1 。
共軛: D3DXQuaternionConjugate
逆:D3DXQuaternionInverse
3D幾何意義:至關於轉了一個相反的角。因爲3D中只有單位長度的四元數纔有意義,共軛和逆是同樣的。
六、四元數的點積。
D3DXQuaternionDot
q1.q2 = [v1,w1].[v2,w2]=v1.v2 + w1.w2 = x1x2+y1y2+z1z2+w1w2;
3D幾何意義:絕對值越大,2個方位越近似,夾角的餘弦。補充:對於單位四元數,有-1 <= a.b <= +1,咱們通常只關心其絕對值,和矢量點乘相似,絕對值越大,表示2個角度的角位移越小(即類似)。
七、四元數的叉積,通常咱們說四元數的乘,指的就是這個叉積。
D3DXQuaternionMultiply
[v1,w1] X [v2,w2] = [w1v2 + w2v1 + v1 X v2, w1w2 - v1.v2];
=[ w1x2 + x1w2 + z1y2 - y1z2,
w1y2 + y1w2 + x1z2 - z1x2,
w1z2 + z1w2 + y1x2 - x1y2,
w1w2 - x1x2 - y1y2 - z1z2 ]
特性:
a、 結合律 (ab)c = a(bc). 交換律不知足ab != ba
b、 ||q1 q2|| = ||q1|| ||q2|| 這個說明:單位四元數相乘的結果仍是單位四元數。
c、 (ab)-1 = b-1a-1. 這個和矩陣的逆是同樣的。同理:
(Q1Q2...Q(n-1)Qn)-1 = Qn-1Q(n-1)-1...Q2-1Q1-1
八、四元數的差:一個方位到另外一個方位的角位移。方位a旋轉到b的角位移爲d,則ad = b. 通過推導:d = a-1b
這個差找不到相應的DIRECTX公式。
在DirectX中提供了從歐拉角到四元數,從四元數到矩陣(Direct3D用旋轉來實現旋轉)的變換函數。下面參看:/Microsoft DirectX SDK/Include/d3dx9math.h的函數聲明
=======================================================================================
從四元數變換到軸與旋轉角
// Compute a quaternin's axis and angle of rotation. Expects unit quaternions.
void WINAPI D3DXQuaternionToAxisAngle
( CONST D3DXQUATERNION *pQ, D3DXVECTOR3 *pAxis, FLOAT *pAngle );
從旋轉矩陣構造一個四元數
// Build a quaternion from a rotation matrix.
D3DXQUATERNION* WINAPI D3DXQuaternionRotationMatrix
( D3DXQUATERNION *pOut, CONST D3DXMATRIX *pM);
從一個軸與旋轉角構造一個四元數
// Rotation about arbitrary axis.
D3DXQUATERNION* WINAPI D3DXQuaternionRotationAxis
( D3DXQUATERNION *pOut, CONST D3DXVECTOR3 *pV, FLOAT Angle );
從歐拉角構造一個四元數
// Yaw around the Y axis, a pitch around the X axis,
// and a roll around the Z axis.
D3DXQUATERNION* WINAPI D3DXQuaternionRotationYawPitchRoll
( D3DXQUATERNION *pOut, FLOAT Yaw, FLOAT Pitch, FLOAT Roll );
下面咱們來看看如何使用:若某物體要繞Y軸旋轉fYaw,繞X軸旋轉fPitch,繞Z軸旋轉fRoll,那麼對應的旋轉矩陣matRot能夠這麼計算:
D3DXQUATERNION qR;
D3DXMATRIX matRot;
D3DXQuaternionRotationYawPitchRoll(&qR, fYaw, fPitch, fRoll);
D3DXMatrixRotationQuaternion(&matRot, &qR);
//Rotation about arbitrary axis.繞軸旋轉
D3DXQUATERNION* WINAPI D3DXQuaternionRotationAxis
( D3DXQUATERNION *pOut, CONST D3DXVECTOR3 *pV, FLOAT Angle );
矩陣分解爲比例,旋轉和位移三個份量:HRESULT WINAPI D3DXMatrixDecompose ( D3DXVECTOR3 *pOutScale, D3DXQUATERNION *pOutRotation, *pOutTranslation, CONST D3DXMATRIX *pM );