OpenGL 中的坐标系

前言

虽然说计算机图形学的课设得分挺高,代码也都是自己写的,但是要是细究其中原理,想必我也不能答出多少,OpenGL 中的函数用的再娴熟,不懂其原理也不算学会这门知识,从基础开始,从坐标系开始。

坐标系

OpenGL坐标系可分为:

  1. 世界坐标系
  2. 对象坐标系或者建模坐标系
  3. 眼坐标系或者照相机坐标系
  4. 裁剪坐标系
  5. 规范化的设备坐标系
  6. 窗口坐标系或者屏幕坐标系

世界坐标系

在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定:窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角坐标为(1,1)。

建模坐标系

是绘制物体时的坐标系。程序刚初始化时,世界坐标系和建模坐标系是重合的。当用glTranslatef(),glScalef(), glRotatef()等对当前绘图坐标系进行平移、伸缩、旋转变换之后,世界坐标系和当前绘图坐标系不再重合。注意,这里的平移旋转是将当前绘图坐标系看做一个整体在世界坐标系中进行旋转平移。然后,改变以后,再用绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相对当前绘图坐标系来讲的。

非常重要:OpenGL 中有一个坐标变换矩阵栈(ModelView),栈顶就是当前坐标变换矩阵,进入 OpenGL 管道的每个坐标(齐次坐标)都会先乘上这个矩阵,结果才是对应点在场景中的世界坐标。OpenGL 中的坐标变换都是通过矩阵运算完成的。要注意的是变换中的矩阵乘法是左乘,而矩阵乘法与算术乘法不同,不符合交换律。

眼坐标系

是以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。

裁剪坐标系

如果一个对象位于视口外,那么在光栅化之前就要把它从场景里裁剪掉。为了更有效地进行裁剪,OpenGL 先执行投影变换,这个变换把所有可能是可见的对象变换到一个立方体中,这个立方体的中心就是裁剪坐标系的原点。

规范化的设备坐标系

在投影变换之后,顶点的表示仍然是齐次坐标。顶点的齐次坐标再经过透视除法,即用 w 分量去除其他分量,就得到了在规范化的设备坐标系下的三维表示。

窗口坐标系

规范化的设备坐标根据视口提供的信息,变换成窗口坐标系下的三维表示。窗口坐标是用显示器上的像素来度量的,但仍然保留了深度信息

疏影横斜水清浅,暗香浮动月黄昏