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

正交投影的现代OpenGL问题

庾勇军
2023-03-14

我要直截了当地说。我已经做了一些研究,但仍然没有弄清楚这一点。

我有一个程序,用一种颜色画一个立方体的每个面。然后我在Y轴和X轴上旋转这个立方体(-分别为45°和45°)。

问题在于它没有像我预期的那样呈现,立方体在某个时候被剪切。

代码:

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f);

camera = glm::lookAt(
                     glm::vec3(+0.0f,+0.0f,+1.0f),
                     glm::vec3(0.0f,0.0f,0.0f),
                     glm::vec3(0.0f,1.0f,0.0f)
                     );

model = glm::mat4(1.0f);
model = glm::rotate(model, -45.0f, glm::vec3(0.0f, 1.0f, 0.0f));
model = glm::rotate(model, +45.0f, glm::vec3(1.0f, 0.0f, 0.0f));

mvp = projection * camera * model;

定义的所有顶点都是用±0.25制作的。所以我认为,至少用我的这些zNear和zFar值,它们仍然适合体积,但当我改变线时

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f);

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +2.0f, -1.0f);

它工作得很好

但是它不能与

projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -2.0f);

有人能解释一下为什么吗?我的意思是,我知道如果我放更多的值,投影立方体将有更大的体积,所以它会渲染得很好。我知道右下角的顶点在zNear和zFar为1.0和-1.0的立方体之外(应用矩阵后,顶点值大约为1.76),但如果我将zFar立方体扩展到-2.0f,它应该正好合适,不是吗?

我试着阅读红皮书和彼得·雪莉的《计算机图形学基础》。甚至自己做了母体,但结果一样。

无论如何,先谢了!

共有2个答案

贺栋
2023-03-14

通常,您希望近平面先于远平面。我不确定如果你出于某种原因使远平面为负,近平面为正,会发生什么......尝试交换它们。

壤驷康裕
2023-03-14

正在发生的是,立方体被相机的远剪辑平面剪辑。

超出远距离剪辑平面的任何内容都不会渲染。

在原始代码中,远剪辑平面设置为 1,非常接近相机。超出 1 个单位的任何内容都不会呈现。

在您的工作代码中,您将远剪辑平面设置为2,因此不会呈现超过2个单元的任何内容。

当立方体距离摄影机较近2个单位时,将渲染整个立方体。

 类似资料:
  • 本文向大家介绍OpenGL ES正交投影实现方法(三),包括了OpenGL ES正交投影实现方法(三)的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了OpenGL ES正交投影展示的具体代码,供大家参考,具体内容如下 绘制正方形 在最开始绘制的六边形里面好像看起来挺容易的,也没有出现什么问题,接下来不妨忘记前面绘制六边形的代码,让我们按照自己的理解来绘制一个简单的正方形。 按照我的理

  • 有很多关于3D的opengl投影矩阵的很棒的教程,但我不是在做3D。我真的很难根据自己的喜好进行正交投影设置。 int宽=320;int高=480; 我使用这些设置创建了一个视图投影矩阵。 创建此视图和投影矩阵并将它们传递给gpu之后。 然后我创建一个从的四边形,以便它的原点位于中心。 然后我为四边形制作一个比例矩阵,这样我就可以在屏幕上看到它了。它呈现为一个完美的正方形,但当然glViewpor

  • 举个简单的例子来说明正交投影与透视投影照相机的区别。使用透视投影照相机获得的结果是类似人眼在真实世界中看到的有“近大远小”的效果(如下图中的(a));而使用正交投影照相机获得的结果就像我们在数学几何学课上老师教我们画的效果,对于在三维空间内平行的线,投影到二维空间中也一定是平行的(如下图中的(b))。 (a)透视投影,(b)正交投影 那么,你的程序需要正交投影还是透视投影的照相机呢? 一般说来,对

  • 我制作了一个简单的OpenGL程序,在屏幕上绘制2D纹理。当你调整窗口大小时,它不能正确调整,所以要修复这个问题,我只需要再次运行投影矩阵代码: 但是,运行这段代码会扭曲图像。根据我的理解,为了使我能在屏幕上画出类似2D的效果,我的纹理是用正投影矩阵绘制的,这意味着有一个平面与窗口或类似我所画的东西“平行”。当我试图重新调整它以适应新的窗口大小时,它无法正确调整。这段代码出了什么问题?

  • 正交投影照相机(Orthographic Camera)设置起来较为直观,它的构造函数是: THREE.OrthographicCamera(left, right, top, bottom, near, far) 这六个参数分别代表正交投影照相机拍摄到的空间的六个面的位置,这六个面围成一个长方体,我们称其为视景体(Frustum)。只有在视景体内部(下图中的灰色部分)的物体才可能显示在屏幕上,

  • 问题内容: 我试图在OpenGL中使用gluUnProject,首先我需要获取projectoin,model_view和viewort矩阵。根据我在网上找到的例子 但是我收到错误消息“ ValueError:glGetFloatv需要1个参数(pname),收到2:(GL_PROJECTION_MATRIX,[])” 那么,我应该使用什么来获取这些矩阵? 问题答案: 也许: 之后在变量中应该是投