OpenGL 坐标系理解

1,744 阅读3分钟

本篇记录一下对OpenGL中坐标系的理解

抛出问题

我们平时玩过的3D游戏,一些人物模型、物体模型等都是以3D的效果呈现在玩家面前,而计算机或手机屏幕实际上是2D的坐标系,那么底层是如何让2D的坐标系呈现出3D的效果呢?这就是我们接下来要探索的。

3D图形学下的坐标系

在3D图形学中常用的坐标系有以下4种

  • 世界坐标系 是绝对坐标系,所有物体的坐标点都可以以该坐标系为原点确定其位置。
  • 物体坐标系 每个物体都有自己独立的坐标系,为什么要有物体坐标系呢?假设在空间坐标系中有一个长方体,此时想把长方体向左旋转一下,在长方体的物体坐标系操作远比直接在世界坐标系中操作来的简单;而如果想把长方体向左平移一下,则在世界坐标系上操作简单一些,在世界坐标系中操作,针对的是长方体的坐标系。
  • 惯性坐标系 惯性坐标系和物体坐标系有相同的原点,但它的坐标轴平行于世界坐标系,为什么会有惯性坐标系呢?因为从物体坐标系到惯性坐标系只需要旋转,从惯性坐标系到世界坐标系只需要平移。
  • 摄像机坐标系 从本意上理解,就是从三维空间的任意方位看物体时,以视觉为原点的坐标系,如图所示
    摄像机坐标系
    世界坐标系、物体坐标系和惯性坐标系的图示如下
    世界坐标系、物体坐标系和惯性坐标系

OpenGL下坐标系的变换过程

这些不同的坐标系需要经过转换有以下几个原因

1、OpenGL 希望每次顶点着色后,我们的可见顶点都为标准化设备坐标(Normalized Device Coordinate,NDC)。也就是说每个顶点的x,y,z都应该在−1到1之间,超出这个范围的顶点将是不可见的。

2、OpenGL最终渲染的屏幕是2D的,我们为了逻辑和运算方便,物体描述通常是在3D立体空间中的。

3、OpenGL是右手坐标系,而标准化设备坐标系是左手坐标系。

我们在作图时会给图形设定坐标,这些坐标就是顶点数据,它会通过顶点着色器变换为标准化坐标系下的坐标,再通过光栅化转换为屏幕可以识别的二维坐标和像素。

坐标变换全局图

坐标系的变换过程是这样的,首先从物体坐标经过模型变换变成世界坐标,世界坐标经过视变换变成摄像机坐标,摄像机坐标经过投影变换变成裁剪坐标,裁剪坐标->(透视除法)->规范化坐标->(视口变换)->屏幕坐标。 上述过程就是物体坐标的变换过程 如图所示

坐标变换全局图.png

OpenGL只定义了上图中的后三个坐标系(裁剪坐标、规范化设备坐标、屏幕坐标),前三个坐标系(物体坐标、世界坐标、摄像机坐标)是为了用户方便而自定义的坐标系。

模型变换、视变换、投影变换为重点,它们需要用户自己通过矩阵变换达到目的,这三步要在顶点着色器中完成。

透视除法、视口变换是OpenGL自带的,无需用户操心,它们是在顶点着色器处理后的阶段完成的。

未完待续。。。