2009-11-04 68 views
4

我一直在研究遊戲引擎。我剛剛開始使用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值的問題。儘管改變這些值已經解決了這個問題,但我可能不得不更多地瞭解這兩個函數之間的關係。

回答

4

您需要一個視圖矩陣和一個投影矩陣。你可以做的兩種方式是一個:

  1. 裝入矩陣本身,使用glMatrixMode()glLoadMatrixf(),你用你自己的庫來計算矩陣之後。

  2. glMatrixMode(GL_MODELVIEW)glTranslate()/glRotate()使用組合來創建視圖矩陣,並glMatrixMode(GL_PROJECTION)glFrustum()創建您的投影矩陣。請記住 - 您的視圖矩陣是相機位置的負向平移(因爲它應該將世界相對於相機原點移動),以及應用的任何旋轉(俯仰/偏轉)。

希望這有助於,如果我有更多的時間,我會給你寫一個適當的例子!

+0

感謝您在正確的方向推動。如果您可以查看我的代碼和屏幕截圖,我在帖子中進行了編輯。有些東西並不完全正確:) – 2009-11-04 12:54:54

+0

實際上,問題確實與我選擇的近距離和遠距離參數對glFrustum的值以及傳遞到glTranslated中的Z值有關。謝謝。 – 2009-11-04 13:33:45

2

您可以選擇使用矩陣堆棧作爲對象層次做到這一點,

但相機是層級裏面,所以你必須把堆棧上的逆變換繪製對象和OpenGL僅使用矩陣前從3D到相機。

1

如果你還沒有檢查過,那麼下面的項目可能會詳細解釋什麼「tsalter」在他的帖子中寫道。

Camera從OGL SDK(CodeColony)

也看紅書的解釋上觀看和如何模型視圖和投影矩陣將幫助您創建相機。它開始於實際攝像機和與OpenGL API相對應的很好的比較。 Chapter 3 - Viewing