对象世界,相机和投影空间在OpenGL(Object, world, camera and proj

2019-09-01 04:25发布

我想了解在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);

这是什么代码呢? 它集视角。 它创建z轴? 但是,是不是早已对象空间的一部分?

Answer 1:

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)投影空间是我们如何运用正确的视角场景(假设你不使用正投影)。 这几乎总是由截头表示, 这篇文章可以解释比我更好。 从本质上讲要映射三维空间到另一个空间扭曲。

OpenGL的再处理剪辑空间和屏幕空间。


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

您可以设置与顶点glVertex3f()在物体空间始终 。 (这其实是一个很老的和缓慢的方式做到这一点,但是这不是真的这个问题点)

当您设置GL_MODELVIEW ,它只是改变了模型矩阵(可与被操纵glLoadMatrixglTranslateglRotateglScale等)。


一行行,你的一段代码被执行以下操作:

  1. 所有的转化现在将影响投影矩阵。
  2. 清除旧的投影矩阵,并与单位矩阵代替它。
  3. 使用整个屏幕的视口。
  4. 投影矩阵设定为与图4​​5度垂直场的透视用的W / H的纵横比,近裁剪面的1个单位的路程,远裁剪面的100个单位的路程。
  5. 现在所有的转化再次影响了模型视图矩阵。

Z轴已经存在,这只是设置的投影矩阵,让你的角度,告诉OpenGL使用整个窗口来呈现。 这是不是对象的空间,这是你改造的对象空间投影空间的方式。


另外一个侧面说明,你用真的,真的很老的OpenGL(1992年左右)。 glTranslate等已废弃很久以前的事,现在只是从API中删除。 你仍然可以使用它们的唯一原因是因为司机让他们有兼容性的缘故。 我建议你考虑使用现代(3.0+)的OpenGL。 现代图形管线是几个数量级比立即模式(在glBegin,glVertex,glEnd)更快。



文章来源: Object, world, camera and projection spaces in OpenGL