關于四元數(Quaterion)
飄飄白云 2008-03-16
1843年,William Rowan Hamilton發明了四元數,但直到1985年才有一個叫Ken Shoemake的人將四元數引入計算機圖形學處理領域。四元數在3D圖形學中主要用于旋轉,骨骼動畫等。
簡單地來說,四元數描述了一次旋轉:繞任意一個軸旋轉一個角度。四元數的定義形式:(w, x, y, z)。假如,繞軸向量v(_x,_y,_z)正向(右手旋轉法則)旋轉角度p,則對應得四元數q為:
q = (cos(p/2), sin(p/2) * _x, sin(p/2) * _y, sin(p/2) * _z)
用四元數來表示旋轉,不如用歐拉角(偏航/yaw,俯仰/pitch,橫滾/ roll)來表示直接,但是用歐拉角來處理旋轉有個不可回避的問題:萬向節死鎖。我們可以通過將歐拉角轉換到四元數來避免這個問題。在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);
有關四元數更詳細的數學計算,轉換過程可以參考下面的鏈接:
http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/index.htm