OpenGL 学习系列---坐标系统

OpenGL 学习系列文章

在前面绘制基本图形中,遇到了很明显的问题,圆形不像圆形,正多边形不像正多边形?就像下面图形一样:

好好的正五边形却东倒西歪的,这就是因为我们前面的绘制都是把它当成 二维 的绘制,而在 OpenGL 中却是绘制 三维的。在二维和三维之间还有个转换,而之前为了方便学习则忽略了这个转换,现在就要开始理解它了 —— 坐标系统!!

坐标系统

3d-coordinate

3d-coordinate

在立体几何的坐标系里面定义一个点的位置,需要 x、y、z 三个坐标轴的值,而在 OpenGL 中绘制 3D 物体也是需要的。

在绘制基本形状时,只是定义了 x、y 轴的坐标,这样 z 轴的坐标就默认为 0 了。

OpenGL 将定义好的坐标轴的值转换为实际绘制的坐标,需要经过五个坐标系统的转换。

如下图所示:

这里面涉及到了五个坐标空间和三个转换矩阵:

空间:

  • 局部空间(Local Space)
  • 世界空间(World Space)
  • 观察空间(View Space)
  • 裁剪空间(Clip Space)
  • 屏幕空间(Screen Space)

矩阵:

  • 模型矩阵(Model Matrix)
  • 视图矩阵(View Matrix)
  • 投影矩阵(Projection Matrix)

根据流程图,每个坐标空间的转换都需要一个转换矩阵来完成。

最后裁剪空间到屏幕空间的转换,就是将经过这一系列转换后的坐标映射到屏幕的坐标上,这一过程就不需要转换矩阵了。

在进入不同的坐标空间之前,需要先了解 OpenGL 的坐标系:

OpenGL 是一个右手坐标系,正 X 轴在右手边,正 Y 轴朝上,正 Z 轴穿过屏幕朝向你。

与之相对的就是左手坐标系,其正 Z 轴穿过屏幕朝向里面了。

局部空间

局部空间坐标是 OpenGL 绘制坐标的起点,接下来所有的转换操作都是在局部空间坐标基础上进行的。

局部空间坐标就是我们自己定义的起始坐标点,是相对于原点 $ (0,0,0) $ 的。

此时所在的空间就是局部空间,也就是说我们在局部空间里面定义物体的起始坐标。

世界空间

我们定义每一个坐标点都是在局部空间,相对于 $ (0,0,0) $ 的。这样一来,当多个物体同时绘制时,就会扎堆了。

而世界空间就是当所有物体一起绘制、仍然相对于原点的、更大的一个坐标系。

局部空间和世界空间有点相像,可以在局部空间定义坐标系时就考虑到世界坐标系,避免多个物体绘制时出现扎堆现象。

当然还有更好的方法,就是使用模型矩阵(Model Matrix)。

使用模型矩阵,可以对物体进行位移、缩放、旋转。

这样的话就可以将物体从坐标原点移开,并且还能够进行一些相关操作,不用去考虑在局部空间来定义世界空间的坐标了。

观察空间

横看成岭侧成峰 远近高低各不同

当物体在世界空间中就位了,接下来就是要考虑从哪个方向和角度来观察物体了。

观察空间,又是 OpenGL 的摄像机,是将世界空间的坐标转化为摄像机的视角所观察到的空间坐标。

也就是说,在观察空间里,坐标原点不再是世界空间的坐标原点了,而是以摄像机的视角作为场景原点,这就不再是简单地进行平移、旋转了,而是切换到另一种坐标系里。

OpenGL 本身是没有摄像机的概念的,不过可以通过把场景中的所有物体往相反的方向移动来模拟出摄像机。这样就场景没动,而摄像机在移动。

要定义一个摄像机,或者说要定义一个摄像机视角为坐标原点的坐标系,需要:

  • 摄像机在世界空间中的位置
  • 摄像机观察的方向
  • 指向摄像机右测的向量
  • 指向摄像机上方的向量

如图,最终建立了一个以摄像机位置为原点的坐标系。

其中,蓝色箭头为摄像机坐标系中的 Z 轴,绿色箭头为摄像机坐标系中的 Y 轴,红色箭头为摄像机坐标系中的 X 轴。

而接下来要做的就是将物体在世界空间中的坐标转换到以摄像机视角为原点的观察空间坐标中。

这其中也需要用到一个转换矩阵:视图矩阵(View Matrix)。通过视图矩阵来切换坐标系。

裁剪空间

当物体坐标都位于观察空间后,接下来要做的就是裁剪。根据我们的需要来裁剪一定范围内的物体,而在这个范围之外的坐标就会被忽略掉。

裁剪空间实质上还是进行坐标的操作。

从观察空间到裁剪空间,需要用到:投影矩阵(Projection Matrix)。

投影矩阵会指定一个坐标范围,这个范围内的坐标将变换为归一化设备坐标 ,不在这个范围内的坐标就会被裁剪掉。

观察空间中的坐标经过投影矩阵的变换之后称为投影坐标,又叫做裁剪坐标

说是裁剪坐标,其实是待裁剪,接下来的裁剪过程将由 OpenGL 来完成的。投影矩阵的变换,只是筛选出那些不需要被裁剪的坐标。

由投影矩阵创建的范围,是一个封闭的空间几何体,被称为视景体

投影矩阵有两种不同的形式,创建的视景体也有两种样式。

正交投影

正交投影会创建一个类似立方体的视景体。它由左、上、右、下 四个方向距离和近平面距离、远平面距离组成。四个方向距离定义了近平面和远平面的大小。而在近平面和远平面之外的坐标点就会被裁剪掉了。

top Created with Sketch.