网上讨论四元素法表示转动的文章不少,但似乎总不能讲清楚。例如在CSDN上有
http://blog.csdn.net/pizi0475/article/details/6261679
其中谈到:
四元数一般定义如下:
q=w+xi+yj+zk
其中w是实数,x,y,z是虚数,其中:
i*i=-1
j*j=-1
k*k=-1
也可以表示为:
q=[w,v]
其中v=(x,y,z)是矢量,w是标量,虽然v是矢量,但不能简单的理解为3D空间的矢量,它是4维空间中的的矢量,也是非常不容易想像的。
四元数也是可以归一化的,并且只有单位化的四元数才用来描述旋转(面向),四元数的单位化与Vector类似,
首先||q|| = Norm(q)=sqrt(w2 + x2 + y2 + z2)
因为w2 + x2 + y2 + z2=1
所以Normlize(q)=q/Norm(q)=q / sqrt(w2 + x2 + y2 + z2)
说了这么多,那么四元数与旋转到底有什么关系?我以前一直认为轴、角的描述就是四元数,如果是那样其与旋转的关系也不言而喻,但并不是这么简单,轴、角描述到四元数的转化:
w = cos(theta/2)
x = ax * sin(theta/2)
y = ay * sin(theta/2)
z = az * sin(theta/2)
其中(ax,ay,az)表示轴的矢量,theta表示绕此轴的旋转角度,为什么是这样?和轴、角描述到底有什么不同?这是因为轴角描述的“四元组”并不是一个空间下的东西,首先(ax,ay,az)是一个3维坐标下的矢量,而theta则是级坐标下的角度,简单的将他们组合到一起并不能保证他们插值结果的稳定性,因为他们无法归一化,所以不能保证最终插值后得到的矢量长度(经过旋转变换后两点之间的距离)相等,而四元数在是在一个统一的4维空间中,方便归一化来插值,又能方便的得到轴、角这样用于3D图像的信息数据,所以用四元数再合适不过了。
我看不懂后面一段的意思,也不知道为什么不用theta全角,而用theta/2?
------解决方案--------------------
使用四元数替代由欧拉角的三月组,主要是因为在三元组中做插值会遇到无法解决的“万向锁”问题。
四元数的产生是和复数相关的,它实际可以理解为是1个实部和三个虚部组成的复数:
[w , (x,y,z)] = [cos(alfa), (ax, ay, az)sin(alfa)];
从四元组推导对应的欧拉角为:
p= asin(...); h = atan(...); b = atan(...);
如果alfa = theta;由于asin和atan的值域为[-90, 90]不能覆盖所有角度。
所以采用alfa = theta / 2;
所以很多标准的复数性质可以应用到四元数上,四元数之间可以平滑插值是它替代欧拉角的主要原因。
------解决方案--------------------
这样的问题多半是出于使用过程中积累的经验,有时候你偏要问个问什么还不好回答。