我试图了解在OpenGL中创建空间:
对象空间
世界空间
相机空间
投影空间
我对这些阶段的理解是否正确?
" cube"正在笛卡尔坐标系的中心创建,通过键入顶点坐标直接在程序内部。
坐标转换为" world"内的坐标,这意味着将其移动到屏幕上的任何位置。
嗯,实际上,我希望您检查一下我对这两个术语的理解。
现在,我在黑屏上创建一个三角形。 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轴?但它还不是对象空间的一部分吗?
答案 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)
。从物体到世界空间的矩阵称为“模型”矩阵。
(0, 0, -10)
的相机,则您的“视图”矩阵必须是(0, 0, 10)
的翻译。这样,世界上所有的物体都是向前10个单位,使它看起来像是向后10个单位。
4)投影空间是我们如何将正确的视角应用于场景(假设您没有使用正交投影)。这几乎总是由平截头体表示,而this article可以比我更好地解释。基本上你是将3d空间映射到另一个倾斜的空间。
然后OpenGL处理剪辑空间和屏幕空间。
默认情况下它适用于
GL_MODELVIEW
标志,但那是第二阶段 - 世界空间。这是否意味着调用glVertex3f()
会在对象空间中创建一个三角形?
您始终在对象空间中使用glVertex3f()
设置顶点。 (这实际上是一种非常古老而缓慢的方式,但这不是这个问题的重点)
当您设置GL_MODELVIEW
时,它只会更改模型矩阵(可以使用glLoadMatrix
,glTranslate
,glRotate
,glScale
等进行操作。 )。
一行一行,您的代码正在执行以下操作:
Z轴已经存在,这只是设置投影矩阵,为您提供透视,告诉OpenGL使用整个窗口进行渲染。这不是对象空间,而是将对象空间转换为投影空间的方式。
另外还有一个注意事项,你正在使用非常老的OpenGL(1992年旧版)。 glTranslate等很久以前就被弃用了,现在只是从API中删除了。你仍然可以使用它们的唯一原因是因为驱动程序为了兼容性而保留它们。我建议你研究使用现代(3.0+)OpenGL。现代图形管道比立即模式快几个数量级(glBegin,glVertex,glEnd)。