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

  • 相关阅读:
    Python 安装Twisted 提示python version 2.7 required,which was not found in the registry
    Openfire Strophe开发中文乱码问题
    css div 垂直居中
    How to create custom methods for use in spring security expression language annotations
    How to check “hasRole” in Java Code with Spring Security?
    Android 显示/隐藏 应用图标
    Android 当媒体变更后,通知其他应用重新扫描
    文件上传那些事儿
    专题:点滴Javascript
    主流动画实现方式总结
  • 原文地址:https://www.cnblogs.com/kesalin/p/quaterion.html
Copyright © 2011-2022 走看看