天天看点

程序中的四元数表示法

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

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

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 

    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 

    //忽略其它无关紧要的 

    //、、、、、、、 

};

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

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

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

程序中的四元数表示法

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

x = s * xa 

y = s * xb 

z = s * xc 

w = cos(θ/2) 

s = sin(θ/2)

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

而quaterniontomatrix则是对应了

程序中的四元数表示法

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

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

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

这三个的特点。

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

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

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

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

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

简介:09年入行,喜欢游戏和编程,对3d游戏和引擎尤其感兴趣。 

版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

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