OpenGL中的对象,世界,相机和投影空间

use*_*786 20 opengl graphics

我试图理解在OpenGL中创建空间:

  1. 对象空间

  2. 世界空间

  3. 相机空间

  4. 投影空间


我对这些阶段的理解是否正确?

  1. "立方体"正在笛卡尔坐标系的中心创建,通过键入顶点坐标直接在程序内部创建.

  2. 坐标转换为"世界"内的坐标,这意味着将其移动到屏幕上的任何位置.

嗯,实际上我希望你检查我对这两个术语的理解.


现在,我在黑屏上创建一个三角形.openGL代码如何适应这些空间?

GL_MODELVIEW默认情况下它适用于旗帜,但那是第二阶段 - 世界空间.这是否意味着调用glVertex3f()在对象空间中创建一个三角形?

世界空间在哪里?


另外,我已经读过最后两个空格不是openGL管道的一部分(或者不管它叫什么).但是,OpenGL包含标志GL_PROJECTION,例如:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h); // w - width, h - height
gluPerspective(45, ratio, 1, 100); // radio = w/h
glMatrixMode(GL_MODELVIEW);
Run Code Online (Sandbox Code Playgroud)

这段代码有什么作用?它设定了视角.它是否创建了z轴?但它不是已经是对象空间的一部分吗?

Rob*_*ani 38

1)对象空间是对象相对于对象原点的顶点.对于1x1x1立方体,您的顶点将是:

( 0.5,  0.5, 0.5)
(-0.5,  0.5, 0.5)
( 0.5, -0.5, 0.5)
(-0.5, -0.5, 0.5)
Run Code Online (Sandbox Code Playgroud)

等等

2)世界空间是物体在你的世界中的位置.如果你想要这个立方体(15, 10),你可以创建一个平移矩阵,当与每个顶点相乘时,它会使你的顶点居中(15, 10).例如,第一个顶点将成为(15.5, 10.5, 0.5).从物体到世界空间的矩阵称为"模型"矩阵.

3)眼睛空间(有时称为相机空间)是相对于观察者位置的世界.由于这必须是每个顶点乘以的矩阵,因此从技术上讲,它是摄像机方向的倒数.也就是说,如果你想要一个摄像头(0, 0, -10),你的"视图"矩阵必须是一个翻译(0, 0, 10).这样,世界上的所有物体都是向前10个单位,使它看起来像是向后10个单位.

4)投影空间是我们如何将正确的视角应用于场景(假设您没有使用正交投影).这几乎总是由平截头体表示,本文可以比我更好地解释.基本上,您将3d空间映射到另一个倾斜的空间.

然后OpenGL处理​​剪辑空间和屏幕空间.


GL_MODELVIEW默认情况下它适用于旗帜,但那是第二阶段 - 世界空间.这是否意味着调用glVertex3f()在对象空间中创建一个三角形?

glVertex3f()始终在对象空间中设置顶点.(这实际上是一种非常古老而缓慢的方法,但这不是这个问题的重点)

当设置GL_MODELVIEW,它只是改变了模型矩阵(可与被操纵glLoadMatrix,glTranslate,glRotate,glScale,等).


逐行,您的代码正在执行以下操作:

  1. 现在,所有变换都将影响投影矩阵.
  2. 清除旧的投影矩阵并将其替换为单位矩阵.
  3. 将整个屏幕用作视口.
  4. 将投影矩阵设置为具有45度垂直视野的透视图,其纵横比为w/h,近剪切平面距离1个单位,远距离平面距离100个单位.
  5. 所有转换现在再次影响模型视图矩阵.

Z轴已经存在,这只是设置投影矩阵,为您提供透视,告诉OpenGL使用整个窗口进行渲染.这不是对象空间,而是将对象空间转换为投影空间的方式.


另外还有一个注意事项,你使用的是真正老的OpenGL(1992年旧版).glTranslate等很久以前就被弃用了,现在只是从API中删除了.你仍然可以使用它们的唯一原因是因为驱动程序为了兼容性而保留它们.我建议你研究使用现代(3.0+)OpenGL.现代图形管道比立即模式(glBegin,glVertex,glEnd)快几个数量级.