我一直在研究遊戲引擎。我剛剛開始使用SDL,但使用OpenGL逐漸向3D功能發展。我所見過的大部分關於「如何完成任務」的文檔都使用了GLUT,而我並未使用它。在OpenGL中設置攝像頭
問題是如何在OpenGL中創建一個「相機」,我可以在3D環境中移動並正確顯示3D模型以及精靈(例如,具有固定位置和旋轉的精靈)。我應該關注哪些功能以便在OpenGL相機中設置相機,以及按照什麼順序調用相機?
這裏是一些背景信息,爲什麼我想要一個實際的相機。 (SpriteX-CameraX)和(SpriteY-CameraY)的座標繪製一個簡單的精靈,我創建一個SDL表面的GL紋理,並將其繪製到屏幕上。這工作得很好,但是當轉向實際的3D模型時,它並不適用。攝像機位置是X,Y,Z整數分量的自定義向量類(即不使用標準庫)。
我有一個由三角形組成的三維立方體,本身我可以繪製並旋轉它,實際上我可以通過在繪製模型時傳遞相機位置來移動立方體(雖然以一種尷尬的方式)並使用位置矢量的那些分量來計算模型位置。當我轉動模型時,問題變得明顯。模型的起源不是模型本身,而是似乎是屏幕的起源。一些谷歌搜索告訴我,我需要保存模型的位置,旋轉它的原點,然後將模型恢復到原始位置。
通過計算新頂點來計算應該在視口中繪製事物的位置,而不是通過計算新頂點的位置,我想創建一個OpenGL「相機」來爲我做這些,所以我只需要do是將我的Camera對象的座標傳遞給OpenGL相機,它會自動翻譯視圖。如果你使用GLUT,這個任務似乎非常簡單,但我不確定如何使用OpenGL設置攝像頭。
編輯#1(在一些評論後): 以下是一些建議,這裏是在我的程序中調用的更新方法。它已更新以創建透視圖和視圖矩陣。所有繪圖都在調用之前發生。當OpenGL執行時,會執行一組類似的方法(減去緩衝區交換)。 x,y,z座標是相機及其位置矢量的直線。如果攝像機處於(256,32,0),則256,32和0會傳入Update方法。目前,z被設置爲0,因爲目前沒有辦法改變該值。所繪製的3D模型是位置X = 320,Y = 240,Z = -128處的一組頂點/三角形+法線。當程序運行時,在FILL模式下,然後在LINE模式下繪製這個圖像,在FILL after movement模式下繪製另一個圖像時,將相機向右移動一點。它喜歡可能正常可能是原因,但我認爲它還有更多的事情需要我去思考一些非常重要的事情,或者不完全瞭解glFrustum的NEAR和FAR參數實際上做了什麼。
在我實施這些更改之前,我使用glOrtho並正確渲染了多維數據集。現在,如果我切換回glOrtho,一張臉會呈現(綠色),旋轉非常奇怪 - 可能是由於翻譯。立方體有6種不同的顏色,每邊各一個。紅色,藍色,綠色,青色,白色和紫色。
int VideoWindow::Update(double x, double y, double z)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(0.0f, GetWidth(), GetHeight(), 0.0f, 32.0f, 192.0f);
glMatrixMode(GL_MODELVIEW);
SDL_GL_SwapBuffers();
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glRotatef(0, 1.0f, 0.0f, 0.0f);
glRotatef(0, 0.0f, 1.0f, 0.0f);
glRotatef(0, 0.0f, 0.0f, 1.0f);
glTranslated(-x, -y, 0);
return 0;
}
編輯決賽: 原來,這個問題是與近東和glFrustum遠東參數和glTranslated的Z值的問題。儘管改變這些值已經解決了這個問題,但我可能不得不更多地瞭解這兩個函數之間的關係。
感謝您在正確的方向推動。如果您可以查看我的代碼和屏幕截圖,我在帖子中進行了編輯。有些東西並不完全正確:) – 2009-11-04 12:54:54
實際上,問題確實與我選擇的近距離和遠距離參數對glFrustum的值以及傳遞到glTranslated中的Z值有關。謝謝。 – 2009-11-04 13:33:45