zoukankan      html  css  js  c++  java
  • 四元数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

  • 相关阅读:
    QT 捕获事件(全局拦截)
    QT语言翻译
    QT,QLabel添加超链接
    解决VS+Qt不生成moc文件问题
    c++编译错误:invalid new-expression of abstract class type
    C++ 异常处理
    MATLAB 随机生成互不重叠的多个矩形
    sequential minimal optimization,SMO for SVM, (MATLAB code)
    How to decide on the correct number of clusters?
    python 将数据随机分为训练集和测试集
  • 原文地址:https://www.cnblogs.com/kesalin/p/quaterion.html
Copyright © 2011-2022 走看看