2010-08-03 173 views
0

我是一個真正的noob誰剛開始學習3D編程,我很難學習3D空間旋轉。我的問題是,我似乎無法弄清楚如何使用它的本地座標旋轉對象。OpenGL-OpenTK旋轉問題

我有3D對象基本類,首先,我要實現,這將在一定軸與X度旋轉對象的功能。到目前爲止,我有以下內容:

public void RollDeg(float angle) 
    { 
     this.rotation = Matrix4.Mult(rotation, 
      Matrix4.CreateRotationX(MyMath.Conversions.DegToRad(angle))); 
    } 

    public void PitchDeg(float angle) 
    { 
     this.rotation = Matrix4.Mult(rotation, 
      Matrix4.CreateRotationY(MyMath.Conversions.DegToRad(angle))); 
    } 

    public void YawDeg(float angle) 
    { 
     this.rotation = Matrix4.Mult(rotation, 
      Matrix4.CreateRotationZ(MyMath.Conversions.DegToRad(angle))); 
    } 

'rotation'是一個4x4矩陣,它以單位矩陣開始。每次我想要滾動/俯仰/偏航物體時,我都會調用上述函數之一。

用於繪圖,我使用的是推動一個矩陣到模型視圖堆,與所述對象的平移,旋轉和縮放的矩陣相乘(以該順序),並開始繪製頂點另一功能。最後,我將矩陣從堆棧中彈出。

問題在於上面的函數在GLOBAL軸上旋轉對象,而不是在LOCAL上,即使從我的理解中,每次旋轉對象時,本地系統都會更改它的軸,然後當新的旋轉被應用在其他的頂部,局部軸被用於新的旋轉。

我讀了關於它背後的數學和如何旋轉對象的不同教程,但我找不到可以幫助我的東西。

如果任何人有時間,我會很感激,如果他能幫助我瞭解如何圍繞本地軸旋轉和,也許更重要的是,我做錯了什麼在我目前的執行。

+0

它只是[Gimbal鎖](http://en.wikipedia.org/wiki/Gimbal_lock)? [Quaternions](http://en.wikipedia.org/wiki/Quaternion)更有趣:) – sje397 2010-08-03 09:55:55

+0

@ sje377:不,不是Gimbal。每一次旋轉都是在全局完成的,這就是問題所在,我不是在談論重疊的軸。 @ Calvin1602:我知道,那是最讓我煩惱的事情:我無法弄清楚我失蹤的事情。沒有使用調試器。 也許我應該張貼/附上整個班級?這個問題可以隱藏在別的地方嗎? – cantrem 2010-08-03 10:12:55

+0

對不起,錯誤的評論,請參閱答案。但是關於調試器的話仍然堅持:用它 – Calvin1602 2010-08-03 10:16:15

回答

1

如果你想在這個順序執行的轉換:轉換 - >旋轉 - >規模(這使得完美的意義上說,它就是我們通常所需要的),你必須乘以你的矩陣以相反的順序。

在右手座標系(即openGL使用的一個座標系)中,矩陣乘法必須從右到左執行。這就是爲什麼:

ModelViewTransform =變換*查看*型號// < - 您可以通過模型開始,對不對?所以它是這樣的

請注意,在directX中,它們使用左手座標系。它有他的缺點,但它更直觀。

+0

oook,所以:有平均,有愚蠢的,有非常愚蠢的,有mindblowing愚蠢的,再有就是我: 我不得不看的右手座標系第一千次(感謝卡爾文)考慮顛倒旋轉矩陣乘法的順序。問題是我乘以「舊*新」而不是「新*舊」。我有RTS轉換這個討厭的問題,並解決它,即使與x/y/z順序,並解決它。我無法停下來驚歎自己:| 再次感謝! – cantrem 2010-08-03 10:46:36