眼睛空间坐标究竟是什么?

dan*_*jar 28 opengl camera projection matrix coordinates

当我学习OpenGL时,我常常偶然发现所谓的眼睛空间坐标.

如果我是对的,你通常有三个矩阵.模型矩阵,视图矩阵和投影矩阵.虽然我不完全确定背后的数学是如何工作的,但我确实知道转换坐标到世界空间,视图空间和屏幕空间.

但是眼睛空间在哪里,我需要将哪些矩阵转换为眼睛空间?

rad*_*al7 59

也许以下插图显示了各种空间之间的关系将有助于:OpenGL转换管道

取决于您是否使用固定功能管道(glMatrixMode()例如,如果您调用)或使用着色器,操作是相同的 - 只需要在着色器中直接编码它们,或者OpenGL管道辅助工具在你的工作中.

虽然用固定功能管道来讨论事情是令人厌恶的,但它会使对话变得更简单,所以我将从那里开始.

在传统OpenGL(即OpenGL 3.1之前的版本,或使用兼容性配置文件)中,定义了两个矩阵堆栈:模型视图投影,当应用程序启动时,每个堆栈顶部的矩阵是一个单位矩阵(1.0 on对角线,0.0为所有其他元素).如果在该空间中绘制坐标,则可以在标准化设备坐标(NDC)中进行有效渲染,这样可以在X,Y和Z中剪切出范围[-1,1]之外的任何顶点.视口变换(如通过调用设置glViewport())是将NDC映射到窗口坐标(嗯,视口坐标,实际上,但通常视口和窗口的大小和位置相同),以及深度范围的深度值(即[0,1]) ] 默认情况下).

现在,在大多数应用中,指定的第一个变换是投影变换,它有两种类型:正交投影和透视投影.的正交投影保留了角,并且通常在科学和工程应用中使用,因为它不变形的线段的相对长度.在传统的OpenGL,正投影通过任一指定的glOrthogluOrtho2D.更常用的是透视变换,这模仿眼睛的工作原理(即,对象远离眼睛比接近更小),以及由任一指定glFrustumgluPerspective.对于透视投影,他们定义了视锥体,它是一个固定在眼睛位置的截头金字塔,用眼睛坐标指定.在眼睛坐标中,"眼睛"位于原点,并向下看-Z轴.您的远剪裁平面被指定为沿-Z轴的距离.如果在眼睛坐标中渲染,则在近视和远视剪裁平面之间以及视锥体内部指定的任何几何体都不会被剔除,并且将被变换为出现在视口中.这是透视投影图及其与图像平面的关系观察视锥体.

眼睛位于观察平截头体的顶点.

要讨论的最后一个转换是模型 - 视图变换,它负责移动坐标系(而不是对象;稍后更多关于它),使得它们相对于眼睛和观察平截头体处于良好的位置.常见的建模变换是平移,缩放,旋转剪切(其中OpenGL中没有本机支持).

一般而言,3D模型围绕局部坐标系建模(例如,指定球体在中心处的原点的坐标).建模变换用于将"当前"坐标系移动到新位置,以便在渲染本地建模对象时,它位于正确的位置.

建模变换和观察变换之间没有数学差异.这只是一般,造型变换用于具体型号,并通过控制glPushMatrix()glPopMatrix()操作,其中观看转型通常是先规定,并影响所有后续的建模操作.

现在,如果您正在使用这个现代OpenGL(核心配置文件版本3.1和转发),您必须自己逻辑地执行所有这些操作(您可能只指定一个转换,将模型视图和投影转换折叠成单个矩阵乘法) .矩阵通常指定为着色器uniforms.没有矩阵堆栈,模型视图和投影转换的分离,您需要使数学正确以模拟管道.(顺便说一下,透视分割和视口转换步骤是在你的顶点着色器完成后由OpenGL执行的 - 你不需要做数学[你可以,它不会伤害任何东西,除非你没有把w设置为1.0)您的gl_Position顶点着色器输出).

  • 哇,这是非常详细和清晰的描述.我知道这个话题很清楚.顺便说一下,我正在使用着色器. (3认同)
  • 实际上,NDC中的z坐标也在[-1,1]范围内,并且使用`glDepthRange`参数将视口变换放在[0,1]范围内.因此窗口坐标也不应被视为2D而是3D. (2认同)

Nic*_*las 38

眼睛空间,视图空间和相机空间都是同一事物的同义词:相对于相机的世界.


Rab*_*d76 5

在渲染中,场景的每个网格通常由模型矩阵、视图矩阵和投影矩阵进行变换。最后将投影场景映射到视口。

投影、视图和模型矩阵相互作用,在视口上呈现场景的对象(网格)。

  • 模型矩阵定义场景世界空间中单个对象(网格)的位置方向和比例。
  • 视图矩阵定义了场景内观察者(查看者)的位置和观看方向。
  • 投影矩阵定义了投影到视口上的相对于观察者(查看者)的面积(体积)。

坐标系:

  • 模型坐标(物体坐标)

    模型空间是坐标系,用于定义或调制网格。顶点坐标在模型空间中定义。

  • 世界坐标

    世界空间是场景的坐标系。不同的模型(对象)可以在世界空间中多次放置,以形成一个场景。

    模型矩阵定义场景中模型(对象、网格)的位置、方向和相对大小。模型矩阵将单个网格的顶点位置转换到世界空间以进行单个特定定位。有不同的模型矩阵,一个模型矩阵对应于模型(对象)和对象在世界空间中的位置的每种组合。

  • 视空间(眼坐标)

    视图空间是由场景中的视点定义的局部系统。视图的位置、视线和视图的向上方向定义了相对于世界坐标系的坐标系。场景的对象必须相对于视图坐标系来绘制,以便从观看位置“看到”。视图坐标系的逆矩阵称为视图矩阵。该矩阵从世界坐标转换为视图坐标。
    一般世界坐标和视图坐标都是笛卡尔坐标

    视图坐标系描述了观看场景的方向和位置。视图矩阵从世界空间变换到视图(眼睛)空间。

    如果视图空间的坐标系是右手系统,其中 X 轴指向右侧,Y 轴指向上方,则 Z 轴指向视图外(请注意,在右手系统中, Z 轴是 X 轴和 Y 轴的叉积。

  • 剪辑空间坐标是齐次坐标。在剪辑空间中执行场景的剪辑。如果、和
    分量位于该点的倒置分量和齐次坐标分量定义的范围内,则该点位于裁剪空间中:xyzww

    -w <= x, y, z <= w.

    投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。投影矩阵从视图空间变换到剪辑空间。通过除以剪辑坐标的分量,剪辑空间中的坐标将转换为 (-1, -1, -1) 到 (1, 1, 1) 范围内的标准化设备坐标 (NDC) w

    在正交投影中,该区域(体积)由距观看者位置的 6 个距离(左、右、下、上、近和远)定义。如果左侧、底部和近距离为负,右侧、顶部和远距离为正(如在标准化设备空间中),则可以将其想象为观看者周围的盒子。空间(体积)中的所有对象(网格)在视口上“可见”。超出(或部分超出)该空间的所有对象(网格)都会在体积的边界处被剪裁。这意味着在正交投影中,观察者“后面”的物体可能是“可见的”。这可能看起来不自然,但这就是正交投影的工作原理。

    在透视投影中,观看体积是一个截头锥体(截头金字塔),其中金字塔的顶部是观看位置。视线方向(视线)以及近距和远距定义了将金字塔截断为平截头体的平面(视线方向是该平面的法向矢量)。左、右、下、上距离定义了视线与近平面的交点与平截头体侧面(在近平面上)的距离。这使得场景看起来就像从针孔相机中看到的一样。

    当对象在视口上不可见(屏幕全“黑”)时,最常见的错误之一是网格不在由投影和视图矩阵定义的视图体积内。

  • 标准化设备坐标

    标准化设备空间是一个立方体,右、下、前为 (-1, -1, -1),左、上、后为 (1, 1, 1)。标准化设备坐标是剪辑空间坐标除以w剪辑坐标的分量。这称为视角鸿沟

  • 窗口坐标(屏幕坐标)

    窗口坐标是视口矩形的坐标。窗口坐标对于光栅化至关重要

    标准化设备坐标线性映射到视口矩形(窗口坐标/屏幕坐标)和深度缓冲区的深度。视口矩形由 定义glViewport。深度范围由 [0, 1] 设置glDepthRange,默认为 [0, 1]。