2012-08-24 81 views
1

我遇到的問題如下。 當我旋轉我的太空船(俯仰)並以90度的角度旋轉它時,它直立起來,然後嘗試在y軸上再次旋轉它,模型現在以與滾動相同的方式旋轉在起始位置。旋轉模型'compas糾正'的問題

現在我的問題,我該如何解決這個問題?我如何確保我的模型在我想要滾動時總是滾動,當我想讓它滾動時始終保持滾動等等,而不是現在所做的。

我正在使用C++和opengl。

+3

您遇到了gimble lock。我建議看看四元數。我沒有太多的經驗,也沒什麼幫助,但我知道他們解決了靈活的鎖定問題。 http://www.flipcode.com/documents/matrfaq.html – Charlie

+1

聽起來像[gimbal lock](http://en.wikipedia.org/wiki/Gimbal_lock#Loss_of_a_degree_of_freedom_with_Euler_angles)。使用[quaternions](http://content.gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotation)來管理你的旋轉。 – genpfault

+0

謝謝,你們倆的確看起來是這個問題。 那麼這是否意味着我需要圍繞opengl的正常旋轉做出我自己的? 因此不再需要glRotatef(mRotation.x,1.0f,0.0f,0.0f);但我自己的整個修復? –

回答

1

正如已經指出的那樣,您看到Gimbal Lock是因爲您使用歐拉角來執行旋轉的結果。

然而,四元數不是唯一的解決方案。您可以改爲構造一個4x4矩陣來表示對象的當前方向,並且每次更改面向時都會應用相對旋轉。這並不完美,因爲您需要跟蹤每個對象的16個值而不是4個四元數,爲了處理浮點舍入錯誤,您需要定期對事物進行歸一化,以便您的方向矩陣不會變爲一個扭曲變換。另一方面,它在概念上簡單並且相當迅速。