在3D程序中,通常用quaternion来计算
3D物体的旋转角度,与
Matrix相比,
quaternion更加高效,占用的储存空间更小,此外也更便于插值。在数学上,
quaternion表示复数
w+xi+yj+zk,其中
i,j,k都是虚数单位:
i*i = j*j = k*k= -1
i*j = k, j*i = -k
可以把quaternion看做一个标量和一个3D向量的组合。实部w表示标量,虚部表示向量标记为V,或三个单独的分量(
x,y,z)。所以
quaternion可以记为
[ w, V]
或
[ w,(
x,y,x)。对
quaternion最大的误解在于认为
w表示旋转角度,
V表示旋转轴。正确的理解应该是
w与旋转角度有关,
v与旋转轴有关。例如,要表示以向量
N为轴,轴旋α度
,相对的
quaternion应该是:
q = [ cos(α/ 2) , sin(α/ 2) N]
=[ cos(α/ 2) , ( sina(α/ 2) Nx, sin(α/ 2)Ny, sin(α
/ 2)Nz ) ]
为了计算方便,一般要求N为单位矢量。对quaternion来说使用四个值就能记录旋转,而不是
Matrix所需的十六个值。为什么用
quaternion来计算旋转很方便呢
?先说过
quaternion是一个复数
,如果你还记得一点点复数的知识
,那么应该知道复数乘法
(叉乘
)的几何意义实际上就是对复数进行旋转。对最简单的复数
p= x + yi来说,和另一个复数
q = ( conα,
sinα
)相乘,则表示把
p沿逆时针方向旋转α:
p’ = pq
当然,x+yi的形式只能表示2D变换,对3D变换来说就需要使用 quaternion了,而且计算也要复杂一点。为了对3D空间中的一个点p(x,y,z)进行旋转,需要先把它转换为quaternion形式
p = [0, ( x, y, z)],接下来前面讨论的内容,定义
q = cos(α
/ 2) , sin(α
/ 2) N为旋转
quaternion,这里
N为单位矢量长度的旋转轴,α为旋转角度。那么旋转之后的点
p’则为:
p’ = qpq-1