Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL中的对象、世界、摄影机和投影空间_Opengl_Graphics - Fatal编程技术网

OpenGL中的对象、世界、摄影机和投影空间

OpenGL中的对象、世界、摄影机和投影空间,opengl,graphics,Opengl,Graphics,我试图理解在OpenGL中创建空间: 对象空间 世界空间 摄像机空间 投影空间 我对这些阶段的理解正确吗 “立方体”是在笛卡尔坐标系的中心创建的,通过键入顶点坐标直接在程序内部创建 坐标被转换为“世界”内部的坐标,这意味着将其移动到屏幕上的任何位置 事实上,我想让你检查一下我对这两个术语的理解 现在,我正在黑屏上创建一个三角形。openGL代码如何适应这些空间 默认情况下,它在GL\u MODELVIEW标志上工作,但这是第二个阶段-世界空间。这是否意味着调用glVertex3f()会在对象

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

  • 对象空间

  • 世界空间

  • 摄像机空间

  • 投影空间


  • 我对这些阶段的理解正确吗

  • “立方体”是在笛卡尔坐标系的中心创建的,通过键入顶点坐标直接在程序内部创建

  • 坐标被转换为“世界”内部的坐标,这意味着将其移动到屏幕上的任何位置

  • 事实上,我想让你检查一下我对这两个术语的理解


    现在,我正在黑屏上创建一个三角形。openGL代码如何适应这些空间

    默认情况下,它在
    GL\u MODELVIEW
    标志上工作,但这是第二个阶段-世界空间。这是否意味着调用
    glVertex3f()
    会在对象空间中创建一个三角形

    世界空间部分在哪里


    另外,我已经读到最后两个空格不是openGL管道的一部分(或者不管它叫什么)。 但是,OpenGL包含诸如
    GL\u投影
    之类的标志,例如:

    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\u MODELVIEW
    标志上工作,但这是第二个阶段-世界空间。这是否意味着调用
    glVertex3f()
    会在对象空间中创建一个三角形

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

    设置
    GL\u MODELVIEW
    时,仅更改模型矩阵(可使用
    glLoadMatrix
    glTranslate
    glRotate
    glScale
    等进行操作)


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

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


    还有一个附带说明,您正在使用非常非常古老的OpenGL(1992年旧版)。glTranslate等很久以前就被弃用了,现在刚刚从API中删除。您仍然可以使用它们的唯一原因是驱动程序为了兼容性而将它们保留在那里。我建议您考虑使用modern(3.0+)OpenGL。现代图形管道比即时模式(glBegin、glVertex、GLAND)快几个数量级。

    我希望您不要真正“键入”对象几何体(非常简单的几何体除外)。您应该从文件中加载它们。