從數學上表示旋轉,可以有三種表示方法:矩陣法,歐拉角法和四元數法,我們之前已經介紹了矩陣法,它有個問題,就是容易造成萬向節死鎖,所謂萬向節死鎖,就是當繞一個軸旋轉到90度的時候,再繞另外兩個軸旋轉的結果都是一樣的,也就是說少了一個自由度,另外矩陣法其中有無用的數據,造成內存的浪費。
歐拉角法是由歐拉在十八世紀提出,它由三個角表示:俯仰角,yaw偏航角,roll滾轉角。
struct Euler{
btScalar yaw;
btScalar pitch;
btScalar roll;
};
歐拉角的表示方法很簡潔,只用三個角度就可以表示旋轉,但是它也有萬向節死鎖的情況,而且進行線性插值的時候,由於角度有360度週期的問題,所以變化往往會有不好的效果,所以就有另外一種四元數的表示方法。四元數是一種超複數,它的表示就是有三個虛部的複數,表示法如下:
由於i,k,j的表示很像笛卡爾座標系的三個軸,所以可以合在一起表示一個向量,即旋轉軸,於是可以用四元數表示旋轉如下:
關於四元數更多數學上的介紹可以參考:http://www.cnblogs.com/mengdd/archive/2013/08/05/3238223.html
cocos2d-x中使用Quaternion類表示四元數,定義如下:
class CC_DLL Quaternion
{
public:
/**
* The x-value of the quaternion's vector component.
*/
float x;
/**
* The y-value of the quaternion's vector component.
*/
float y;
/**
* The z-value of the quaternion's vector component.
*/
float z;
/**
* The scalar component of the quaternion.
*/
float w;
.........
}
下一篇介紹模型,網格和材質能力不足,水平有限,如有錯誤,歡迎指出。