Opengl gluPerspective、GluViewport、gluLookAt以及GL_投影和GL_模型视图矩阵 原始问题

Opengl gluPerspective、GluViewport、gluLookAt以及GL_投影和GL_模型视图矩阵 原始问题,opengl,matrix,mode,glulookat,Opengl,Matrix,Mode,Glulookat,我想使用“gluPerspective”、“GluViewport”和“gluLookAt”来操纵我的相机和屏幕 我将哪些函数应用于哪个矩阵模式?我应该/必须以什么顺序使用它们 例如,我正试图像这样设置我的屏幕和相机:(但它不工作!) 我到处寻找在线文档,我了解这些功能,只是不知道它们应该放在哪里,按照什么顺序 过了一段时间。。。 现在已经过了几个月,我正在添加一个快速编辑来显示我使用OpenGL渲染东西的系统。这是为了帮助将来看到这个问题的其他人 我主要使用两种方法 方法1: 此方法将所有内容

我想使用“gluPerspective”、“GluViewport”和“gluLookAt”来操纵我的相机和屏幕

我将哪些函数应用于哪个矩阵模式?我应该/必须以什么顺序使用它们

例如,我正试图像这样设置我的屏幕和相机:(但它不工作!)

我到处寻找在线文档,我了解这些功能,只是不知道它们应该放在哪里,按照什么顺序

过了一段时间。。。 现在已经过了几个月,我正在添加一个快速编辑来显示我使用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()之类的操作,或者根据您使用的窗口工具包(glut、glfw、sdl等)执行类似操作

您需要从“glOrtho”、“glupperspective”和“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:

第二种方法与上述方法相同,但将第一步移动到单独的函数中。然后必须检测窗口大小调整事件并调用此函数。使用glut,可以指定回调。使用SFML,可以在调整窗口大小时检测事件。我忘了SDL是如何工作的,但它是相似的。我还没有学会glfw是如何工作的

希望这能对你有所帮助


一些OpenGL新手(可能包括我自己)试图在投影矩阵上指定摄影机的平移不要这样做-我认为这会弄乱照明和其他可能的事情。

我将重塑回调函数定义为:

在开始时调用
glViewport(…)
一次

然后使用单位矩阵重新加载投影矩阵:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
然后:

gluLookAt(…)
如果需要更改相机位置,可以随时调用


我的目的很简单。

你那里的东西看起来很适合我。可能您的错误在其他地方。请确保您的场景位于在glPerspective中指定的近平面和远平面之间。如果您了解这些函数,您将了解它们的去向。例如,您似乎相信
glViewport
创建了一个矩阵。它不工作。“但它不工作!”…故障?蓝屏?内核恐慌?清除你的主目录?监视器着火了?打印机着火了?引起了?哈哈,@genpfault-my,我是说黑屏,打印机很好!)谢谢,这就是我一直在寻找的答案。如果我给gluLookAt打两次电话,它会再次移动相机吗?同样,调用glRotatef两次会使摄影机/场景旋转两次,gllookat也会这样做吗?对不起,还有一个问题:glViewPort是否编辑矩阵?我应该在调用glViewPort之前调用glMatrixMode(GLU投影)吗?是的,它将旋转整个场景两次。但是,如果将其放入显示回调函数中,请记住显示函数是重复调用的,您必须在显示回调函数的开头加载带有标识矩阵的模型视图矩阵。谢谢@Max这非常有帮助,现在它工作得非常好。非常感谢您-它不仅工作得非常好,而且我现在真正理解了我应该做什么。不,在glViewport之前不需要调用glMatrixMode(GLU投影)。glViewport应该在调整窗口大小时调用,即需要调整视口大小。所以把它放在重塑回调函数中。
// 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( ... );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glPerspective(...)
glMatrixMode(GL_MODELVIEW);