原始的問題
我想用 '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矩陣上指定相機轉換。 不要這樣做 - 我把它弄亂燈光和其他可能的東西。
你在那裏看起來適合我。也許你的錯誤在別處。 – Tim
確保您的場景位於您在glPerspective中指定的近平面和遠平面之間。 – Max
如果你瞭解這些功能,你就會明白他們去了哪裏。例如,你似乎相信'glViewport'會創建一個矩陣。它不是。 –