2010-07-03 82 views
2

我正在爲iPhone製作一個簡單的遊戲,並試圖實現在GLView周圍移動相機的效果。爲什麼我的對象在使用gluLookat for OpenGL ES 2.0後消失?

我使用頂點和顏色指針使用glDrawArrays繪製大約一百個對象。之後,我想將相機向右移動1個單位。這是我在我的drawView方法中的代碼片段。我將矩陣模式更改爲投影堆棧,然後在項目操作完成後又回到模型視圖模式(我可能會出錯,我是OpenGL的新手)。

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glTranslatef(1.0, 0.0, 0.0); 
glMatrixMode(GL_MODELVIEW); 

在任何情況下,結果絕對不是預期的。會發生什麼是我非常簡短地看到我的對象(也許是一個框架),然後他們消失。同樣的事情發生,如果我拿走上面的塊glTranslatef

我在做什麼錯?

提前致謝!

之前

alt text

alt text

回答

6

之一的OpenGL初學者混淆方面之間的投影矩陣與在模型視圖矩陣發生什麼事情會發生什麼區別(以及爲什麼你甚至需要他們兩個?)

的投影矩陣負責將頂點的座標轉換爲2D座標系中的點(它將世界濺射到您的虛擬膠片 - 視口上)。投影矩陣僅指定您的相機的行爲(例如:它應該是廣角鏡頭還是長焦鏡頭,還是完全正交的鏡頭,如建築斜圖?)。

另一方面,模型視圖矩陣負責指定頂點在3D空間中的位置。例如,要指定角色的胳膊相對於角色身體的位置,或該角色相對於世界的位置,則需要更改模型視圖矩陣。尤其要注意的是,相機的位置和方向上的變化屬於模型視圖矩陣(它是「視圖」的一部分)

它引起混淆的原因是在那天,您給OpenGL的頂點將乘以模型視圖矩陣,然後乘以投影矩陣。也就是說,給定一個模型視圖矩陣M,一個投影矩陣P和一個頂點v,該頂點的最終座標由下式給出:v這意味着無論您使用哪個矩陣,某些轉換似乎都可以工作。你應該注意這一點 - 當你使用更有趣的OpenGL技術時,你會遇到使用正確矩陣的情況。

然而,直到你達到那一點,讓我給你一個很好的經驗法則。在您習慣區分兩個矩陣之前,只需在投影矩陣上使用glOrthoglFrustumgluPerspective,他們的朋友也可以)。所有其他呼叫(glTranslateglScale,glRotate等)都屬於您應該對模型視圖矩陣執行的操作。

+0

我真的很喜歡這個答案,因爲它給出了這裏幕後發生的事情的整體解釋。任何書你會推薦? – 2010-07-05 17:07:24

+2

第3章「查看」OpenGL編程指南(「紅皮書」)討論了在OpenGL管道上發生的轉換。 – 2010-07-08 13:36:12

4

你可能想閱讀http://www.opengl.org/resources/faq/technical/viewing.htm(尤其是部分8.080)。

使用的東西大致如下:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
// setup your projection matrix here, e.g. with glFrustum or gluPerspective 
glFrustum(...) 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(...) // with your gluLookAt parameters, of course 
glTranslatef(1.0, 0.0, 0.0); 
// your drawing code here 

只是爲了澄清:gluLookAt創建這是爲了與模型視圖矩陣相乘的矩陣。如果你使用上面建議的函數調用順序,事情應該按預期工作。 我希望有所幫助。