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

时间:2013-04-25 22:30:54

标签: opengl graphics

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

  1. 对象空间

  2. 世界空间

  3. 相机空间

  4. 投影空间


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

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

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

    3. 嗯,实际上,我希望您检查一下我对这两个术语的理解。


      现在,我在黑屏上创建一个三角形。 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);
      

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

1 个答案:

答案 0 :(得分: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)

2)世界空间是物体在你的世界中的位置。如果您希望此立方体位于(15, 10),则需要创建一个平移矩阵,当与每个顶点相乘时,将使顶点居中于(15, 10)。例如,第一个顶点将变为(15.5, 10.5, 0.5)。从物体到世界空间的矩阵称为“模型”矩阵。

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

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

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


  

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

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

当您设置GL_MODELVIEW时,它只会更改模型矩阵(可以使用glLoadMatrixglTranslateglRotateglScale等进行操作。 )。


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

  1. 现在所有转换都会影响投影矩阵。
  2. 清除旧的投影矩阵并将其替换为单位矩阵。
  3. 将整个屏幕用作视口。
  4. 将投影矩阵设置为具有45度垂直视野的视角,纵横比为w / h,近剪裁平面距离1个单位,远剪裁平面距离100个单位。
  5. 所有转换现在再次影响模型视图矩阵。
  6. Z轴已经存在,这只是设置投影矩阵,为您提供透视,告诉OpenGL使用整个窗口进行渲染。这不是对象空间,而是将对象空间转换为投影空间的方式。


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