四元数(Quaternion)是由爱尔兰数学家 哈密顿(Hamilton)在1843年发明的概念。四元数的乘法不符合交换律(commutative law)。
四元数 可以描述为 (x * i, y * j, z * k, w) ,其中(x,y,z)表示虚部,w表示实部。
四元数 最大的价值在于 描述旋转,解决三维中的 万向节锁 的问题。
万向节锁:
三维中的旋转通常用绕 XYZ 三个轴的旋转来表示,这个旋转角度即 欧拉角,也就是经常说的 Pitch、Yaw、Roll。
采用欧拉角 描述旋转的 优点是直观简单(矩阵乘),容易理解,旋转过程分解为:按照一定的顺序(比如X、Y、Z) 依次独立地绕轴旋转。
这种独立的旋转带来了一个问题,也就是 未考虑到旋转之间的关联性。
假设 物体先绕转X轴旋转,然后再绕Y轴,最后绕Z轴选择,当绕Y轴旋转90度之后 万向节锁 的问题就出现了,因为X轴已经被求值了,它不再随同其他两个轴旋转,这样X轴与Z轴就指向同一个方向(它们相当于同一个轴了)。
欧拉角 与 四元数
欧拉角可以和四元数进行相互转换,一个四元数可以 由欧拉角(对应 φ,θ,ψ)变换得到:
同样,欧拉角 也可以通过四元数 变换得到:
代码可以参考作者定义的 四元数 类(Quaternion.h)
/* 四元数定义 - 用于旋转
lin