OpenGL ES 2.0坐标系的含义

时间:2014-08-06 17:08:25

标签: opengl-es opengl-es-2.0

OpenGL中的坐标是什么(我使用OpenGL ES 2.0 for Android,但我现在大多只想理解这个理论......)3d世界实际上是什么意思?

说我将我的模型矩阵转换为x,y,z模型在哪里?多远,什么是单位?

此外,如果我从顶点缓冲区对象显示点,将每个点定义为具有任意x,y和z的范围(范围为(-∞,∞)),该怎么办?当MVP乘以这个位置时,这意味着什么?

2 个答案:

答案 0 :(得分:3)

3D点(x,y,z)实际上在4D中表示为同质点(x,y,z,1)所以我们 可以用4x4矩阵表示所有期望的变换 - 特别是这允许平移和透视投影。

然后使用4x4 模型 - 视图 - 投影(MVP)矩阵转换此点 一个点(x',y',z',w')。

  • 模型矩阵将一个点从其本地建模坐标转换为 世界坐标。对于实例化单个对象的多个版本非常有用。
  • 查看矩阵将此点转换为摄像机坐标。在这个坐标 系统相机实际上正在向下看-z exis。
  • 投影矩阵然后将该点转换为剪辑坐标并最终 定义最终将发生的2D投影 (例如,正字法或透视)

MVP矩阵只是将这三个矩阵相乘,形成复合变换。

对于剪辑坐标中的一个点是可见的,它必须(在投影之后)位于剪裁体积,这是一个轴对齐的立方体,角点位于(-1 ,-1,-1)和(+ 1,+ 1,+ 1)。 通过除以w'来投射点 - 即(x',y',z',w')被映射 to(x'/ w',y'/ w',z'/ w') - 如果这三个值都位于区间[-1,+ 1]中,那么它是可见的,我们说这个点在< em>规范化设备坐标。这种划分允许透视预测在透视投影中发生。

这是有趣的部分,剪辑实际上发生在4D(在此透视分割发生之前)。因此,对于可见的点,x',y',z'的幅度必须小于w'的幅度。如果该点在剪辑中存活,则发生透视分割。

最后,视口转换将幸存点从规范化设备坐标映射到实际设备坐标。这里我们有一个实际的设备坐标(x,y),它是帧缓冲区中的2D地址,z是深度缓冲区范围内的深度值。点然后发送到光栅化器

总之,OpenGL管道的第一部分是这样的:

  1. 在顶点着色器中,每个顶点(x,y,z,1)乘以MVP,产生剪辑坐标(x',y',z',w')。
  2. 顶点被组装到给定的原语(例如,三角形)中。
  3. 原语被裁剪为4D。
  4. 透视分割在标准化设备坐标中产生一个点。
  5. 视口变换将点映射到设备坐标,然后运送到光栅化器。
  6. 建模转换是仿射变换,可以用表格的矩阵表示

         _       _
        | a b c d |
    M = | e f g h |
        | i j k l |
        | 0 0 0 1 |
         -       -
    

    点P =(x,y,z,1)实际上被认为是列向量[x y z 1] ^ T和 通过乘以右边P'= M P(至少从概念上来说 - 硬件可以转换为evethying但它仍然是相同的东西)转换为P'。通过仿射变换,我可以缩放,旋转,剪切,平移......保留平行线的任何东西。请注意,M的最后一行是标识 - 这很重要,因为我们不希望M用w坐标进行清理 - 稍后我们将使用投影矩阵。

    注意,我们可以通过使用w = 0表示方向向量(例如,表面法线) 有效地忽略了翻译组件。实际上,为了正确地变换表面法线,我们使用相关的法线矩阵,它是M的上3x3矩阵的逆转置:

            _     _  ^ -T
           | a b c |
    N =    | e f g |
           | i j k |
            -     -
    

    这保留了法线与各自平面的正交性。

    例如,下面是一个矩阵,用s统一缩放一个对象,围绕z轴旋转CCW旋转θ,并将结果转换为(4,5,6):

      _                                    _
     | s * cos(theta)  -s * sin(theta) 0  4 |
     | s * sin(theta)   s * cos(theta) 0  5 |
     |      0                0         1  6 |
     |      0                0         0  1 |
      -                                    -
    

    视图变换V是一种刚性变换,它只是一个旋转和平移,它改变坐标,使摄像机位于原点,并“向外看”-z轴。

    投影矩阵P是事物变得奇怪的地方 - 至少对于透视投影而言。在这里,我们必须将视图视锥体转换为规范剪切立方体。这不是仿射变换。这是最终乘以1 / w将派上用场的地方。这里使用形式

    的矩阵
     P = | a 0  0 0  |
         | 0 b  0 0  |
         | 0 0  c d  |
         | 0 0 -1 0  |
    

    请注意,最后一行不是标识。点(x,y,z,1)映射到 (a * x,b * y,c * z + d,-z)。之后,在透视师之后你会得到

     (-a*x/z, -b*y/z, -(c*z + d)/z)
    

    通过-z看到那个除法 - 这是透视透视的来源。 由于剪切的顶点将具有z < 0,这实际上是一个积极的分裂。

    无论如何,我会把故事留在那里......

答案 1 :(得分:2)

当您创建图形世界时,3D,2D - 无关紧要,您需要定义一个与此世界一致的坐标系。你定义它的方式并不重要,只要它是一致的。

这如何适用于OpenGL?

  • 每个3D元素的位置将由其顶点以及您对其进行的任何变换(例如缩放,平移等)定义。例如,如果你渲染一个中心位于{2,3,4}且半径为1的球体,这个信息可以让你知道球体在世界的哪个位置,以及它是否应该被渲染。

  • 在OpenGL中,您可以定义一个摄像头 - 它实际上是用户的视口。该摄像机位于一定位置,指向某个方向,并以一定角度旋转。此外,相机具有投影角度,可以接收通过一定角度看到的视觉信息(在某种意义上,这可以被认为是相机的镜头&#34;)。

  • 一旦所有世界都存在于相同的一致坐标系中,您就可以让相机准确地捕捉在您的世界中漂浮的3D元素,因为位置和位置相同。元素的大小相对于摄像机的位置和属性。