当前位置: 首页 > 知识库问答 >
问题:

gluViewport, gluLookAt和GL_PROJECTION和GL_MODELVIEW矩阵

太叔经赋
2023-03-14

我想使用“gluPerspective”、“glViewport”和“gluLookAt”来操作我的相机和屏幕。

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

例如,我正在尝试这样设置我的屏幕和相机:(但它不起作用!)

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?

我四处寻找在线文档,我了解这些html" target="_blank">功能,只是不知道它们应该去哪里以及以什么顺序!

几个月后,我添加了一个快速编辑,以显示我使用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等)...

// 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( ... );

方法二:

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

希望这对你有所帮助。

一些 OpenGL 新手(可能一度包括我自己)尝试在 PROJECTION 矩阵上指定相机转换。不要这样做 - 我把它弄乱了照明和可能其他东西。

共有1个答案

谢翰学
2023-03-14

我将整形回调函数定义为:

在开始时调用glViewport(...)一次。

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

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

然后:

glPerspective(...)
glMatrixMode(GL_MODELVIEW);

< code>gluLookAt(...)可在您需要更改摄像机位置时随时调用。

为我简单的目的工作。

 类似资料:
  • 我在OpenGL中有一个立方体。我用旋转矩阵乘以立方体旋转。我还使用gluLookAt使相机在x轴上围绕立方体旋转,如下图所示。 哪里 我正在努力让相机在围绕y轴旋转的立方体上下旋转。

  • 嘿,伙计们,这是我的家庭作业问题:编写一个方法,在对话框中使用以下标题显示n×n矩阵:公共静态无效printMatrix(int n) 矩阵中的每个元素都是0或1,这是随机生成的。3×3矩阵可能如下所示: 0 1 0 0 0 0 1 1 1 到目前为止,我可以很容易地在扫描仪上打印出我的问题,但我不知道如何在对话框中完成。 此刻,我得到的错误:错误:无效类型不允许在这里JOptionPane.sh

  • 本章节主要给大家引入视图矩阵和投影矩阵两个新的概念,如果你没有图形学基础,对这两个概念暂时还没有认知,也没有关系。通过前面的学习相信你对平移、旋转等矩阵有了一定的认知,至于投影和视图矩阵和平移、旋转等模型矩阵一样也会对WebGL顶点进行坐标变换,至于如何变换下面会逐步讲解。 在学习本章节之前,如果你对Three.js已经有了一定的了解,可以尝试从WebGL视图矩阵和投影矩阵的角度去深入理解Thre

  • 我在查看一些代码时发现了以下内容: 有什么区别呢?顺便说一句:我对矩阵很陌生

  • 问题内容: 如何获得此矩阵的转置。任何更简单的算法都可以执行此操作… 第一个问题: 第二个问题: Zip给我下面的输出如下,当我不知道数组中有多少个元素时,我如何压缩,在这种情况下,我知道3个元素a [0],a [1],a [2],但是如何我压缩一个[n]个元素 问题答案: 问题答案: 感谢AFG的帮助

  • 本文向大家介绍Python中矩阵创建和矩阵运算方法,包括了Python中矩阵创建和矩阵运算方法的使用技巧和注意事项,需要的朋友参考一下 矩阵创建 1、from numpyimport *; a1=array([1,2,3]) a2=mat(a1) 矩阵与方块列表的区别如下: 2、data2=mat(ones((2,4))) 创建一个2*4的1矩阵,默认是浮点型的数据,如果需要时int类型,可以使用