最近由於需要做一個陀螺產品的姿態演示系統,雖然目前還有問題尚待解決,但還是先做個記錄吧。
由於水平有限,可能寫出來的東西問題也很多,望網友指正。
1.表示旋轉的方法主要有:歐拉角、旋轉矩陣和四元數
歐拉角:比較直觀、較易理解。陀螺的輸出就是這種形式的數據,也就是將物體的旋轉分解為沿XYZ三個軸向的旋轉。問題在於“萬向節鎖”,即由於旋轉順序的原因,在某些情況下,會導致兩個旋轉軸向面重合(這個好像說的比較玄乎,優酷上有個視頻上詳細介紹的,有興趣的可以看一下http://v.youku.com/v_show/id_XNzkyOTIyMTI=.html)
旋轉矩陣:這個在OpenGL里面基本躲不開,考慮矢量的旋轉,以變換矩陣的形式表示。
四元數:我也是這次才接觸到這個概念。定義是:q=w+xi+yj+zk,物理意義可以理解為:(x,y,z)表示一個向量,物體繞這個向量旋轉w角度。
2.歐拉角轉換到四元數,與前一個四元數相乘,然后再轉回歐拉角,這樣是可以表示旋轉的。問題有兩點:
一,四元數轉換到歐拉角的時候,Pitch只能在[-π/2,π/2]之間,要想全角度,必須針對各種情況分析;
二,即使全角度轉換正確,最后在OpenGL中操作的時候還是會遇到萬向節鎖的問題,並未能避免。
3.參考Nehe的OpenGL教程中軌跡球的那一章,來實現旋轉。目前碰到的問題就出在這了。
Nehe教程的主要處理過程是這樣的:
Quat4fT ThisQuat; ArcBall.drag(&MousePt, &ThisQuat); // Update End Vector And Get Rotation As Quaternion Matrix3fSetRotationFromQuat4f(&ThisRot, &ThisQuat); // Convert Quaternion Into Matrix3fT Matrix3fMulMatrix3f(&ThisRot, &LastRot); // Accumulate Last Rotation Into This One Matrix4fSetRotationFromMatrix3f(&Transform, &ThisRot); // Set Our Final Transform's Rotation From This One
首先將鼠標拖拽的起始點和終止點的坐標轉換為三維向量,再根據這兩個向量生成一個四元數ThisQuat,這個四元數的(x,y,z)是兩個向量的叉乘,w是兩個向量的點乘。
我覺得奇怪的地方在下面那三句:為什么要先把四元數轉換成3*3的矩陣相乘,再轉換成4*4的矩陣?而不是直接轉成4*4的矩陣相乘呢?因為我在查閱相關資料的時候,有直接將四元數轉換為4*4矩陣的函數,但是我這樣做的結果是,旋轉度數遠遠超過預想的值。
目前我的程序就卡在這里了,明天繼續分析。