四元数(Quaternions)

首先看下四元数怎么表示旋转, 沿任意轴u(Xa, Xb, Xc)旋转角度O, 对应四元数q(x, y, z, w), 其中 x = s*Xa, y = s*Ya, z = s*Za, w = cos(O/2), s = sin(O/2), 即q = (sin(O/2)*u, cos(O/2)) . 若p为一点或向量, p按照q旋转表示为qpq*. q*=(-x, –y, –z, w).


有多种方式可表示旋转,如 axis/angle、欧拉角(Euler angles)、矩阵(matrix)、四元组等。 相对于其它方法,四元数有其本身的优点:

  1. 四元数不会有欧拉角存在的 gimbal lock(万向节锁) 问题.
  2. 四元数由4个数组成,旋转矩阵需要9个数.
  3. 两个四元数之间更容易插值.
  4. 四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和正交化(orthogonalize),对四元数规范化更容易.
  5. 与旋转矩阵类似,两个四元组相乘可表示两次旋转.

这里我想再用通俗的语言解释下什么是欧拉变换和Gimbal Lock.

欧拉变换是Leonard Euler大大定义并命名的, 沿着head头顶方向(摇头) pitch耳朵方向(点头) roll目视方向(侧头)三个方向的旋转组合出特定的旋转. 旋转有三个自由度.

Gimbal Lock是欧拉变换的一个错误情况, 即造成一个自由度的丢失. 举个例子, 以head pitch roll的顺序旋转, head旋转h度, pitch旋转90度, roll方向旋转r度, 但其实x和z是作用在一个自由度上的, 旋转了h+r. 通过对应的变换矩阵能更清楚:

Lock(From Realtime Rendering), 可见旋转结果只与r+h有关, 由此推断出一个自由度的丢失.

 

 

REFERENCE

Quaternion(四元数)和旋转

Realtime Rendering

posted @ 2011-10-15 22:34  nickolas  阅读(1114)  评论(0编辑  收藏  举报