關於OpenGL中四元數的使用問題


  最近由於需要做一個陀螺產品的姿態演示系統,雖然目前還有問題尚待解決,但還是先做個記錄吧。

  由於水平有限,可能寫出來的東西問題也很多,望網友指正。

 

  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矩陣的函數,但是我這樣做的結果是,旋轉度數遠遠超過預想的值。

 

  目前我的程序就卡在這里了,明天繼續分析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM