Tags引力关联贴
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
来源:http://www.cppblog.com/kesalin/archive/2008/03/16/44606.html