本部分主要定义场景的四个因素即建立视图环境,定义投影,定义窗口和定义视口。
建立视图环境
场景是通过在世界空间中建立一系列的原始模型,并对他们进行变换来建立的。为了把视点摆放到标准位置,把世界空间通过视图变换到另一个三维空间,需要定义三个关键元素:视点的位置,眼睛看的方向以及眼睛的垂直方向。定义好在这三个元素,可对场景中的模型进行视图变换。图形API提供了定义视图的工具,根据计算来变换整个场景。OpenGL在右手坐标系建模,然后将整个场景中的几何模型变换到以视点为原点的坐标系中。该变换时在左手坐标系中,取以视点看向Z轴的负方向。
定义视图所需要的信息包括:
- 视点位置的(x,y,z)坐标
- 视点面向的方向或者正对的目标点的坐标,该方向将成为眼坐标系的Z方向
- 在世界空间中视点的“向上”方向将成为眼坐标系的Y方向
一般图形API都会提供函数来设置视点和观察方向。视图变换操作针对定义在世界空间中的物体,并且把眼睛变换到标准模型位置。视图变换的关键就是旋转世界空间,使得向上方向和Y轴方向一致,视线方向和Z轴方向一致,然后移动世界空间,把视点位置移动到原点,最后缩放世界空间。使得目标掉或目标向量的值为(0,0,-1),这些操作是把视点从标准位置移动到API函数中定义的点的逆模型变换操作。
定义投影
视图变换定义了三维眼空间,这个空间还不能在标准设备上显示,必须把场景映射到和显示设备对应的二维空间。这种把三维空间中的物体映射到二维空间的技术称为投影操作。光线经过眼睛的凸透镜,远处的平行光在地平线上汇聚,所以对于观察者来说,相对远的物体比近处的小。实际上物体汇聚的方式取决于投影观看的范围宽度。通过把物体投影到观察平面上或汇聚到点上的投影称为透视投影。
正交投影把场景中所有的物体通过平行光线投影到观察平面上。在正交投影中,不管物体离眼睛有多远,它的大小和原来物体的大小相同。对于正交投影而言,只考虑所有三维眼空间中的点的X和Y坐标,所有点映射到XY平面上。如果(x,y,z)映射到(x’,y’),那么x’=x且y’=y。每一个二维空间中的点都是和Z轴平行的指向在观察平面上的投影,所以又称正交投影为平行投影。
透视投影是将每一个点都映射到三维眼空间Z=1的平面上,它是这个点和原点的连线与Z=1平面上的交点。二维眼空间中的每个点表示该点与三维眼空间的原点生成的直线。如果点(x,y,z)映射到点 (x’,y’),则通过相似三角形又x’ = x/z,且y’=y/z。
定义窗口和视口
在实际显示图像的显示空间依赖于定义的窗口和视口。对于图形系统而言,窗口时观察空间中的一个矩形区域,在这个区域中程序进行具体的绘制。窗口的定义和显示设备的坐标系有关,而且他还有自己的内部坐标系统。图形API提供图形窗口和管理设备窗口的接口,图形窗口中的空间称为屏幕空间,使用几何流水线中描述的二维屏幕坐标。屏幕空间中使用的最小显示单位称为像素,是图像单元的简称。
可以把图像显示在窗口的子举行区域而不是整个窗口中,这个子区域称为视口。视口是图形窗口的一个子矩形区域,它可以限制图形的显示边界。一个窗口可以有多个视口,视口可以相交,每个视口都显示自己的图形。此时的边界是视口边界,而不是窗口边界。