程序中的四元数表示法

简介:

网上有很多四元数相关的文章。

百度百科 http://baike.baidu.com/view/319754.htm

某位的博客 http://caterpillar.onlyfun.net/Gossip/ComputerGraphics/QuaternionsRotate.htm

但当你看完这些后。再看着下面这样的代码,你能快速回过神来么?

class     CQuaternion 

public: 
    CQuaternion(const float fScalar,const Vector3& rVec) 
    { 
        mVector=rVec ; 
        mScalar=fScalar; 
    }

    void FromAxisAngle (const Vector3& rAxis, const F32 Angle) 
    { 
        F32 fSin, fCos; 
        //取得一个弧度角的SIN COS值 
        SinCos( Angle*0.5f, fSin, fCos); 
        mVector = rAxis*fSin; 
        mScalar = fCos; 
    } 
private: 
    float mScalar; 
    float mVector; 
}

class CMatrix44 

public: 
    enum      { _X_,_Y_,_Z_,_W_ }; 
    void QuaternionToMatrix(const CQuaternion& q) 
    { 
        F32 s,xs,ys,zs,wx,wy,wz,xx,xy,xz,yy,yz,zz; 
        s = q.Length2(); 
        s = (s>0 ? 2.f/s : 0);

        xs = q.Vect[_X_]*s;        ys = q.Vect[_Y_]*s;        zs = q.Vect[_Z_]*s; 
        wx = q.Scalar*xs;        wy = q.Scalar*ys;        wz = q.Scalar*zs; 
        xx = q.Vect[_X_]*xs;    xy = q.Vect[_X_]*ys;    xz = q.Vect[_X_]*zs; 
        yy = q.Vect[_Y_]*ys;    yz = q.Vect[_Y_]*zs;    zz = q.Vect[_Z_]*zs;

        (*this)[0].Set(1.f-(yy+zz),xy+wz,      xz-wy,      0.f);  // col 0 
        (*this)[1].Set(xy-wz,      1.f-(xx+zz),yz+wx,      0.f);  // col 1 
        (*this)[2].Set(xz+wy,      yz-wx,      1.f-(xx+yy),0.f);  // col 2 
    } 
    //忽略其它无关紧要的 
    //、、、、、、、 
};

//========================================================

不用多说,肯定有回过神来的,也有没有回过神来的。

正如上面那某位的博客里面讲到的。

quaternionsRotate-1

对于旋转轴A,绕其旋转一定的角度,则可以表示为

x = s * Xa 
y = s * Xb 
z = s * Xc 
w = cos(θ/2) 
s = sin(θ/2)

这正是我们FromAxisAngle 所做的事情。

 

而QuaternionToMatrix则是对应了

quaternionsRotate-4

 

我想说明的是,数学库本身并不在于代码。而是在于数学公式,代码仅是将其用另一种符号表示出来而已。只要仔细去看,定能明白其中的道理。

 

关于文中介绍的公式推导以及万向锁,可以GOOGLE和百度。

另外,编程中还经常用到欧拉角和矩阵的转换。

 

这三个的特点。

矩阵运算的数据相对来说比较直观,容易调试和诊断。但数据存储量大,特别是旋转的时候,会浪费很多空间。

欧拉角储存小,但有万向锁,并且插值不够平滑。

四元数据量介于二者之间。但插值容易。

在骨骼动画中,可以在文件中存储欧拉角,加载后将旋转数据转换为四元数。最后动画计算时统一采用矩阵运算。

要说的东西很多,一言难尽。今天就到这里吧。

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2010/12/19/1910879.html

目录
相关文章
|
6天前
|
算法 测试技术 C#
【二进制求公约数】【数学】【数论】2543. 判断一个点是否可以到达
【二进制求公约数】【数学】【数论】2543. 判断一个点是否可以到达
|
7月前
第7章 符号计算——7.8 符号代数方程求解
第7章 符号计算——7.8 符号代数方程求解
|
7月前
第7章 符号计算——7.9 符号微分方程求解
第7章 符号计算——7.9 符号微分方程求解
|
C语言
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
171 1
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
06【C语言 & 趣味算法】牛顿迭代法求方程根(可回看)
06【C语言 & 趣味算法】牛顿迭代法求方程根(可回看)
06【C语言 & 趣味算法】牛顿迭代法求方程根(可回看)
编写程序,用牛顿法求方程x^3-x-1在1.5附近的根
编写程序,用牛顿法求方程x^3-x-1在1.5附近的根
125 0
编写程序,用牛顿法求方程x^3-x-1在1.5附近的根
四元数的定义与性质
四元数的定义与性质
234 0
四元数的定义与性质
|
算法
判断三角形的性质(直角或等腰)简便算法
判断三角形的性质(直角或等腰)简便算法
93 0
(C语言)经典例题之特殊整数求和与方形图案
(C语言)经典例题之特殊整数求和与方形图案
(C语言)经典例题之特殊整数求和与方形图案
LeetCode 06Z字形变换&07整数反转
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
99 0
LeetCode 06Z字形变换&07整数反转