我试图了解在 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)
购买相机,您的“ View ”矩阵必须是 (0, 0, 10)
的翻译.这样一来,世界上的所有物体都向前 10 个单位,让您看起来像是向后 10 个单位。4)投影空间是我们如何将正确的透视应用于场景(假设您没有使用正交投影)。这几乎总是用平截头体表示,this article可以比我更好地解释这一点。本质上,您是将 3d 空间映射到另一个倾斜空间。
OpenGL 然后处理剪辑空间和屏幕空间。
It works on
GL_MODELVIEW
flag by default, but that's the second stage - world space. Does that mean that callingglVertex3f()
creates a triangle in the object space?
您使用
glVertex3f()
设置顶点总是在对象空间中。 (这实际上是一种非常古老且缓慢的方法,但这并不是这个问题的重点)当您设置
GL_MODELVIEW
,它只是改变模型矩阵(可以使用 glLoadMatrix
、 glTranslate
、 glRotate
、 glScale
等进行操作)。逐行,您的代码正在执行以下操作:
Z 轴已经存在,这只是设置为您提供透视的投影矩阵,告诉 OpenGL 使用整个窗口进行渲染。这不是对象空间,而是将对象空间转换为投影空间的方式。
附带说明一下,您使用的是非常非常旧的 OpenGL(1992 年旧)。 glTranslate 等在很久以前就被弃用了,现在刚刚从 API 中删除。您仍然可以使用它们的唯一原因是驱动程序为了兼容性而将它们保留在那里。我建议您考虑使用现代(3.0+)OpenGL。现代图形管道比立即模式(glBegin、glVertex、glEnd)快几个数量级。
关于opengl - OpenGL中的对象、世界、相机和投影空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16225815/