码迷,mamicode.com
首页 > 其他好文 > 详细

【转载】四元数-Quaterion

时间:2016-06-30 01:10:22      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

原文:四元数-Quaterion

 

  四元数(Quaterion)

本文遵循“署名-非商业用途-保持一致”创作公用协议
   
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)来表示直接,但是用欧拉角来处理旋转有个不可回避的问题:万向节死锁。我们可以通过将欧拉角转换到四元数来避免这个问题,一次将3个欧拉角变换到独立的3个四元数,然后将这3个四元数相乘就可以得到最终的旋转四元数。
Qx = (cos(yaw/2), sin(yaw/2), 0, 0)
Qy = (cos(pitch/2), 0, sin(pitch/2), 0)
Qz = (cos(roll/2), 0, 0, sin(roll/2)
Q = Qx * Qy * Qz
 
在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

【转载】四元数-Quaterion

标签:

原文地址:http://www.cnblogs.com/zhehan54/p/5628573.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!