2012-10-24 67 views
7

原始的問題

我想用 'gluPerspective', 'glViewport' 和 'gluLookAt' 操縱我的相機和屏幕。gluPerspective,glViewport,gluLookAt和GL_PROJECTION和GL_MODELVIEW Matricies

哪個函數適用於哪種矩陣模式?我應該按照什麼順序使用它們?

例如,我試圖建立我的屏幕和攝像頭這樣的:(但它不工作!)

glMatrixMode(GL_PROJECTION) // Apply following to projection matrix - is this correct? 
glLoadIdentity(); // Reset first 
glPerspective(45.0, (double)w/(double)h, 1.0, 200.0); // Set perspective 
glViewport(0, 0, w, h); // Set viewport 

glMatrixMode(GL_MODELVIEW); // Apply following to modelview - should glViewport come under here? 
glLoadIdentity(); // Reset first 
gluLookAt(px, py, pz, cx, cy, cz, ux, uy, uz); // Set position, centre and then up vectors 
// This surely comes after calling GL_MODELVIEW? 

我已經看了看周圍的在線文檔,我理解的功能,只是不是他們應該去的地方,以什麼順序!

一段時間後...

這是幾個月後的現在,我加入了快速編輯,以顯示我用它來渲染的東西用OpenGL系統。這是爲了幫助未來看到這個問題的其他人。

我主要使用兩種方法。

方法1:

此方法組都在一起。

// Firstly, the window may have been resized so re-create the viewing area 
glViewport(0, 0, width_of_window_rendering_area, height_of_window_rendering area); 

這將重新創建用於在窗口內部的整個區域上呈現的視口。隨着SFML,你會做類似window.width()或window.height(),或類似的東西取決於你使用(過剩,GLFW,SDL等)的窗口工具包...

// The second step is to add a projection matrix. There are three main ones I like to use 
// Uncomment the one you want 
glMatrixMode(GL_PROJECTION); // Tell OpenGL to manipulate the correct matrix stack 
glLoadIdentity(); // Reset the projection matrix, or bad things happen after multiple calls to below functions! 
// glOrtho(...) // Uncomment to use 2D rendering 
// gluPerspective(...) // Uncomment to use (easy) 3D rendering 
glFrustrum(...) // Uncomment to use (harder/less intuitive?) 3D rendering 
glMatrixMode(GL_MODELVIEW); // I always prefer to leave OpenGL in the modelview manipulation mode. 
    // I consider it the "default" and safest mode to leave OpenGL in, as any rogue 
    // calls to functions changing its contents is likely to mess up your geometry 
    // which should be visible as a problem on the screen, which tells you you need 
    // to fix something! Manipulating the other matrix stacks may not show obvious 
    // problems. 

你會需要選擇「glOrtho」,「gluPerspective」和「glFrustrum」中的三個中的一個。還有'gluOrtho2D',但小心使用! (我更喜歡用'glOrtho'來指定自己的近遠飛機。)你需要用函數的參數替換'...'。

// The third step is to clear the screen and set your camera/geometry position 
glClear(GL_COLOR_BUFFER_BIT); // use bitwise OR ('||') with 'GL_DEPTH_BUFFER_BIT' and 'GL_STENCIL_BUFFER_BIT' if required 
gluLookAt(...); 
// I like to use gluLookAt, or at least I _italic_used to! Now I implement my own camera... 
// That is another fun thing you should try if you are comfortable with 3D geometry and hard math! 

// The fourth step is to draw your scene. You may want to put lighting stuff first or in with the drawing 
glutWireTeapot(...); 

方法2:

第二種方法是與上述相同,但移動第一步驟到一個單獨的功能。然後,您必須檢測窗口大小調整事件並調用此函數。隨着過剩,你可以指定一個回調。使用SFML,您可以在調整窗口大小時檢測事件。我忘記SDL如何工作,但它是相似的。我還沒有知道glfw是如何工作的。

希望這會幫助你。

一些OpenGL新手(可能是我一次包括在內)嘗試在PROJECTION矩陣上指定相機轉換。 不要這樣做 - 我把它弄亂燈光和其他可能的東西。

+0

你在那裏看起來適合我。也許你的錯誤在別處。 – Tim

+0

確保您的場景位於您在glPerspective中指定的近平面和遠平面之間。 – Max

+0

如果你瞭解這些功能,你就會明白他們去了哪裏。例如,你似乎相信'glViewport'會創建一個矩陣。它不是。 –

回答

3

我定義我的重塑回調函數爲:

呼叫glViewport(...)在開始一次。

然後用單位矩陣重裝投影矩陣:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

然後:

glPerspective(...) 
glMatrixMode(GL_MODELVIEW); 

gluLookAt(...)可以隨時隨地後,如果您需要更改攝像頭的位置被調用。

適用於我的簡單目的。

+0

謝謝,這是我正在尋找的答案。 如果我打電話給gluLookAt兩次,它會再次移動相機嗎?以同樣的方式,兩次調用glRotatef將兩次旋轉相機/場景,gluLookAt會做同樣的事情嗎? – user3728501

+0

對不起,另一個問題:glViewPort是否編輯矩陣?我應該在任何調用glViewPort之前調用glMatrixMode(GL_PROJECTION)? – user3728501

+0

是的,它會旋轉整個場景兩次。但是,如果將它放在顯示回調函數中,那麼請記住重複調用顯示函數,您必須在顯示回調函數的開頭加載帶有單位矩陣的模型視圖矩陣。 – Max