OpenGL提供三维绘图能力,所以上一节中介绍的坐标系是一个三维坐标系。用OpenGL建立的三维场景最后要在二维屏幕上呈现,屏幕上使用的是二维坐标系。另外,为了方便描述对象或方便观察对象,还有模型坐标系和相机坐标系等多种坐标系。
具体来说,OpenGL中有下面几种坐标系。
模型坐标系
世界坐标系
相机坐标系
裁剪坐标系
规范化的裁剪坐标系
设备坐标系
模型坐标系是一个局部坐标系,是相对世界坐标系来说的,后者是全局坐标系。假设太阳系就是全世界,那么以太阳为中心建立一个坐标系,它就是世界坐标系。在这个世界里,世界坐标系只有一个。地球、水星、木星等都是这个坐标系中的一个对象。但如果单独研究地球,使用世界坐标系就不方便,这时以地球球心为原点建立一个坐标系,该坐标系就称为模型坐标系。所以,模型坐标系是一个局部坐标系,世界坐标系中的每个对象都可以建立自己的模型坐标系。
三维场景中,为了方便观察,建立了相机坐标系,或者说观察坐标系。它是以相机,或眼睛为原点建立的坐标系。典型的相机坐标系如图2-2所示。
图2-2 相机坐标系
从图2-2中可以看出,从相机中观察三维场景时,视域可以用一个视景体来描述,它是一个6面的锥体。最后,视景体内的景物投影到视景体前端的矩形面上。由于视景体外的景物都被裁剪掉了,所以这个矩形面上的坐标系称为裁剪坐标系,它是一个二维坐标系。
裁剪坐标系上的图片最终要显示在各种设备上,比如屏幕、打印机、投影仪等。这些设备也有自己的坐标系,称为设备坐标系。
不同设备的设备坐标系可能是不一样的,这样,需要针对每种设备处理裁剪坐标系到设备坐标系的映射,就很麻烦。所以,在裁剪坐标系和设备坐标系之间,添加了一个规范化的坐标系,它的各坐标轴的取值范围都是-1到1。绘图端处理裁剪坐标系到规范化坐标系的变换,设备端处理设备坐标系到规范化坐标系的变换,就不需要在绘图时分别处理裁剪坐标系到各设备坐标系的变换了。
不同坐标系可以通过变换矩阵来实现变换。模型坐标系到世界坐标系的变换称为模型变换,世界坐标系到相机坐标系的变换称为视图变换,相机坐标系到裁剪坐标系的变换称为投影变换,裁剪坐标系到规范化的坐标系的变换称为视口变换。
投影变换有两种,图2-2中画的是透视投影,视景体前端和后端的大小面积不一样。图2-3中画的是正交投影,它的视景体是一个长方体,前端和后端的面积一样。
图2-3 正交投影的视景体