(连载)边喝咖啡边学Unity――第二章 预备知识体系(2)(三)

2015-01-27 06:04:39 · 作者: · 浏览: 39
角中间进行插值,这对我们加入动画非常恼火);万象锁问题。

接下来我们认识最后一种表达角位移的方式:

四元数(Quaternion)表达角位移

关于四元数是什么留给读者自行延伸阅读,这里只提出四元数实质上是对复数(a,b,c,d)的一种几何解释。

复数(a,b,c,d)有一个实部a,3个虚部分别为b,c,d。复数可以进行加、减、点乘、叉乘,可以求它的共轭复数,也可以计算复数的模和求逆。

四元数如何表达角位移呢,我们让n为旋转轴方向的单位向量,,那么四元数q=[ \]

表达了这个角位移。其中nx ny nz分别是旋转轴在轴线上的投影向量。

我们特别提出四元数的插值(slerp)。四元数的插值过程我们只需要知道有一个开始状态q,结束状态p,插值参数t(0<=t<=1),那么slerp函数可以非常快速平滑地在q与p两个状态中插入一个旋转状态。其数学、几何解释也请读者自行延伸阅读。

优点:slerp提供了2个方位间最为平滑的插值;角位移的连接和求逆更为迅速(相比矩阵);每个角位移占用4个数的内存开销,中等开销;

缺点:最难于使用(光理解它就已经比较科幻了);可能存在一组四元数表达出不合法的角位移。

我们了解了角位移的3种表达方式,具体在开发中使用哪一种来表达需要理解他们各自的优越点,根据实际情况选择。而这3种方式表达的角位移可以进行互相转换,其数学过程较为复杂,我们可以直接调用现有的API来完成。

几何图元

明天继续….