2012-10-30 217 views
0

我想在原點旋轉之後翻譯在世界空間中的對象。問題是,在我旋轉一個物體的同時,它的局部座標系也旋轉了,所以它的軸不再與世界座標軸平行。因此,例如,如果我需要將對象繞y軸旋轉後將對象轉換爲點(3,0,5),我將無法做到這一點,因爲對象的局部座標系不是與世界座標系相同。例如:OpenGL的 - 翻譯後旋轉

glRotatef(45, 0.0, 1.0, 0.0); 
glTranslatef(3.0, 0.0, 5.0); 
glutSolidCube(1);    // This won't be at (3,0,5) like how I need it 

我如何克服這個問題?

回答

2

這不是OpenGL的屬性,而是矩陣數學。

當在頂點到OpenGL的固定功能流水線發送時,它得到由矩陣模型視圖和投影變換,即

v_eye = MODELVIEW · v 
v_clip = PROJECTION · v_eye 

現在模型視圖矩陣由所有那些子變換。而且它們不可交換,即操作順序很重要。例如

MODELVIEW = T_0 · R_0 · R_1 · T_1 · S_1 · R_2 

現在可以重寫v_eye計算如上

v_eye = T_0 · (R_0 · (R_1 · (T_1 · (S_1 · (R_2 · v))))) 

正如可以看到,在V乘以(就像矩陣)從右到左到你組成矩陣的堆疊modelview的。

然而,在OpenGL中發生的是,計算一個矩陣「MODELVIEW」,並且v僅用該4×4數字方案進行變換。 OpenGL不會「重新執行」所有的矩陣乘法步驟。

+0

感謝您的回覆。但是我仍然沒有看到如何在旋轉後將對象自由轉換爲特定的座標。 – Darius

+0

@ user1136506:首先旋轉對象,然後翻譯它。而且由於矩陣是正確的聯合,轉換爲在執行glTranslate之前調用glRotate。 – datenwolf

+0

我得到它的工作。我有錯誤的想法,但清理了很多東西,謝謝! – Darius

-1

的OpenGL聲明GPU以相反的順序執行。

所以先翻譯,然後旋轉。

+1

OpenGL語句不會直接轉換爲GPU操作。實際上,歷史上只有一個「GPU」並且OpenGL矩陣操作也從未在那一個上執行過。矩陣行爲的方式是,因爲它們是矩陣。而且它們不以相反的順序「運行」。 – datenwolf