我想了解在OpenGL创造空间:
对象空间
世界空间
摄像机空间
投影空间
是我这几个阶段的理解是否正确?
被在直角坐标系的中心,通过键入顶点坐标创建的“魔方”,直接在程序中。
该坐标转换到“世界”,这意味着它移动到屏幕上的任何地方的内部坐标。
嗯,其实我想请你检查我的这两个方面的理解。
现在,我创建的黑色屏幕上的三角形。 如何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)对象空间对象的顶点相对于对象的原点。 在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
,它只是改变了模型矩阵(可与被操纵glLoadMatrix
, glTranslate
, glRotate
, glScale
等)。
一行行,你的一段代码被执行以下操作:
- 所有的转化现在将影响投影矩阵。
- 清除旧的投影矩阵,并与单位矩阵代替它。
- 使用整个屏幕的视口。
- 投影矩阵设定为与图45度垂直场的透视用的W / H的纵横比,近裁剪面的1个单位的路程,远裁剪面的100个单位的路程。
- 现在所有的转化再次影响了模型视图矩阵。
Z轴已经存在,这只是设置的投影矩阵,让你的角度,告诉OpenGL使用整个窗口来呈现。 这是不是对象的空间,这是你改造的对象空间投影空间的方式。
另外一个侧面说明,你用真的,真的很老的OpenGL(1992年左右)。 glTranslate等已废弃很久以前的事,现在只是从API中删除。 你仍然可以使用它们的唯一原因是因为司机让他们有兼容性的缘故。 我建议你考虑使用现代(3.0+)的OpenGL。 现代图形管线是几个数量级比立即模式(在glBegin,glVertex,glEnd)更快。