经常在代码中看到Quaternions,也知道它是用来表达三维空间的旋转的,但一直没有更深的理解。这两天终于花点时间看了看维基百科的介绍,算是多了解了点。做个记录吧!

质上而言,四元数是一个数学概念,它可以用复数的形式表达为a + b*i + c*j + d*k. 再加上 i*i = j*j = k*k = i*k*j = -1的规则,就可以定义四元数的各种运算。

它最广泛的用途是在计算机图形学中用来表达三维空间的旋转操作,是除了旋转矩阵和欧拉角以外的另外一种表达方式 。

根据欧拉旋转定理,刚体在三维空间的任意一组旋转可等同于绕某一轴 (ux, uy, uz) 旋转某一角度 theta. 这一信息可用四元数表达为q = cos(1/2* theta) + (ux*i + uy*j + uz*k) sin(1/2 * theta).同样,这意味着任给一个四元数(a, b, c, d),我们可以反算出其旋转轴和旋转角度. 其中,theta = 2*acos(a), ux = b/sin(1/2*theta), uy = c/sin(1/2*theta), uz = d/sin(1/2*theta).
 
用四元数表达旋转,有很多优异的性质。例如,旋转n倍的theta角就是q的n次方,旋转反向的theta角就是q的共轭,等等。
 
特别的,和旋转矩阵相比,四元数表达有五个优势:
1. 它只需要4个参数,而旋转矩阵需要9个(当然,这9个参数并不是互相独立的,所以我们还需要另加5个方程定义矩阵的归一性和正交性)。
2. 给定任意一个轴和旋转角度,人们可以更方便的构造出四元数。用矩阵或是欧拉角都会更麻烦一些。
3. 和矩阵相比,四元数对数值计算的偏差不敏感,数值上的一个小误差只是旋转位姿的一个小变化而已。但对矩阵而言,这可能是致命的。因为这可能导致矩阵的不正交,从而使旋转矩阵失效。
4. 在计算机游戏和动画领域,四元数更易实现相机角度的连续微调,并能避免欧拉角表达带来的死锁问题(Gimbol Lock)。
5. 计算性能稍占优。有人对矩阵和四元数表达进行旋转操作的计算次数进行了比较。结果是,对旋转给定的向量而言,矩阵表达的效率稍占优势。但对于一连串的旋转操作而言,四元数表达更省时间。另外,四元数表达所需要的存储空间更小。
 
四元数表达和矩阵表达可以依照固定的公式进行互相转换。
 
最后,四元数的概念看上去并不等同于“旋量”。后者是更高维空间某数学概念的一个表达。
 
posted on 2014-04-12 12:03  Kai.Zhang  阅读(7805)  评论(0编辑  收藏  举报