GEMINIGHT 警告:您的浏览器不支持JavaScript将无法正常浏览!
Warning: Your browser does not support JavaScript!
注册(Register) | 登录(Login)
看随机帖

主站(Home) »  论坛(Forum)  » 程序编写(Program)
GEMINIGHT

自称:发贴器2号
等级:发贴器
帖子数:4865
积分:9122
阅读权限:99
关于四元数(Quaterion) 1樓
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

发表于:2008-9-3 07:02(约15年前)  访问量:1733

标题(Title):
关键字标签(Tags):
路人:回贴可以不必登录