OpenGL如何在摄像机处于观察视锥内时进行投影?

时间:2016-05-28 03:54:59

标签: opengl 3d

关于近距离和远距离剪裁平面的投影,我有几个难题 我制作了一个立方体,正面为蓝色,位于+ z轴,背面为红色,位于-z轴,立方体的边长为0.5。 制作模型和视图矩阵单位矩阵,以正交投影为例。 当设置近和远剪裁平面负值时,结果面显示如下:

orthogonal projection

让我困惑的是:
1。OpenGL Projection Matrix声明,近平面是投影平面,是不是? OpenGL中的实际投影平面是什么? 2.使用glOrtho或类似的API时:

glOrtho(GLdouble left,  GLdouble right, 
   GLdouble bottom,  GLdouble top,  
   GLdouble nearVal,  GLdouble farVal);   

近剪裁平面始终为 -nearVal ,远剪裁平面解释为 -farVal 。它与相机的外观方向无关,因为相机位置和方向影响视图矩阵,在视图转换后,我们可以说OpenGL中的摄像头总是指向-Z轴,这就是我们解释nearVal和farVal的原因,我是对的吗?

3.在上图中,当摄像机在视锥体内时,如何投影到近平面?请帮助解释结果。

1 个答案:

答案 0 :(得分:2)

  

OpenGL中的实际投影平面是什么?

没有。 OpenGL只是做数学。您使用的投影取决于您提供的数学,因此取决于您提供的投影矩阵。

  

我是对的吗?

清除。后投影Z如何解释什么"更接近"手段取决于很多东西。这取决于您的投影矩阵。但这也取决于你的glDepthRange setting。默认情况下,将近平面映射到0,将远平面映射到1.然后,depth test设置。默认值为GL_LESS

如果你使用深度范围和深度测试的默认值,那么是的,你所说的是正确的。

  

在上图中,当摄像机位于视锥体内时,如何投影到近平面?请帮助解释结果。

投影始终朝向近平面方向。这意味着靠近近平面的物体将具有比那些更远的物体更深的深度值(假设默认为glDepthRange)。因此,当您反转两个平面的方向时,您可以反转哪些对象更接近"。

因此:

  1. 没有深度测试的渲染在两者之间不会发生变化,因为哪个对象更接近" 未使用。没有深度测试,唯一重要的事情就是呈现的顺序。

  2. 使用深度测试进行渲染意味着将考虑更接近哪个对象。因此,如果存在重叠,则最远的对象将不可见。

  3. 面部剔除基于投影后窗口空间中对象顶点的明显winding order。改变近/远平面顺序有效地反转窗口空间坐标的Z.但是基于窗口空间Z,绕组顺序;它只查看坐标的2D投影。因此,反转Z不会影响绕组顺序。

    这就是为什么你的蓝色物体在第三次测试中胜出的原因。

    将空间旋转180度与反转空间之间存在差异。后者相当于-1的等级。这代表了空间灵活性的变化,你可以通过严格的旋转来做到这一点。通过在此处否定Z,您可以反转空间。

  4. 您的相机来源"与正交投影或多或少无关。三角形背后的事实是"相机与投影数学无关。只要它在投影区域内,它就会可见。