投影操作需要考虑视域体,即空间中经过投影后可以看到的区域。事实上不管使用什么投影方法,在显示设备上观看到的图像已经限定了场景的上下和左右边界。这与空间的顶面,地面和左右侧面都是对应的。观看对象不包括离视点太近或太远的物体,这就相当于限定了观看区域的前后边界,分别用ZNEAR和ZFAR表示前后边界,其中0<=ZNEAR<=ZFAR。
视域体是包含所有三维空间中经过投影后可以看到的物体的空间。视域体是非常重要的,只有视域体中的物体才能显示,任何视域体外面的物体都将被去除,也就是在投影操作中不可见,不会被图形系统处理。任何物体如果部分在视域体中部分在外面,都会进行裁剪,只有视域体内的部分才能被看到。视域体的远近平面则限制了投影中可见的最近和最远空间。这抱在了图像中只出现想要显示的部分,防止出现眼睛后面或者过分远的物体。
正交投影
要定义正交投影,必须指定视域体的上下,左右和远近平面。每个平面按照下面的等式定义:
coordinate(坐标) = value(值)
每个平面用一个实数定义。改变坐标中的每一个值都会改变视域体在每个平面的大小。对于每个坐标的左边的值来说,减少值相当于增大视域体的空间,增大值相当于缩小视域体的空间。对于右边情况与坐标相反。减少值导致空间变小,增大值导致空间变大。
透视投影
透视投影比平行投影复杂。透视投影以Z轴为中心,它的大小取决于观察的范围(水平向上,用角度衡量)和高宽比(垂直方向)。高宽比是指观察空间的宽度和高度之比。如果投影的高宽比和窗口的高宽比是相等的,那么所看到的图像就准确地反映了模型。透视投影的另外一个参数是近平面和远平面,如果减少近平面的值,那么靠近视点的物体就不会被切除;同样如果增大远平面的值,那么远离视点的物体也不会被切除。
透视投影的视域体的远端比近端大,所以离得较远得物体投影到窗口上得时候缩小也比较多,它们占图形得比例也比较小。所以在屏幕上看到得也越小。透视画法包括一点透视,两点透视和三点透视。一点透视是两个坐标轴方向和观察面平行,另一个和它相交,物体只有沿着那个坐标轴移动,才能改变它的投影大小。这一组平行线在观察平面上相交的点称为灭点。两点透视是指一个坐标轴和观察面平行,另外两个和它相交,那么物体在两个坐标轴上的任意一个移动都会改变大小,同样它拥有两个灭点。三点透视就是坐标轴都和观察main相交,就会产生三个灭点。
透视投影的计算非常值观,它的变换可以用下面式子表示:
$$
\left[\begin{matrix}
x’ \ y’ \ 1
\end{matrix}\right]
=
\left[\begin{matrix}
1/z & 0 & 0 \
0 & 1/z & 0 \
0 & 0 & 1 \
\end{matrix}\right]
\left[\begin{matrix}
x \ y \ 1
\end{matrix}\right]
$$
这个矩阵变换表示从三维空间到三维空间的变换,称为透视变换,因为矩阵元素的分母中含有变量,所以这个变换不是线性映射。当对对象的某些属性进行插值时必须进行透视校正。如果X’和Y’是变换过的值,并且Z值已知,那么就可以重新计算原先的X和Y。所以要在投影计算过程中应该保留深度值。在实际的操作中,可以先进行透视视域体的剪裁,然后再进行透视变换;或者先对整个场景进行透视变换,再进行平行投影,然后在变换后得空间上进行简单得裁剪。
视域体裁剪
在场景进行显示之前,要把在视域体外面得图像部分进行裁剪或者移除。对正交投影进行裁剪很简单,因为正交投影得包围平面通过坐标常量来定义:X=Xleft,X=Xright,Y=YBottom,Y=Ytop,Z=Znear,Z=Zfar。对于一直直线,如果直线在这个范围内,就保留,超出这个范围的部分就被丢弃。对透视投影的视域体进行剪裁要比较难一点,它要求对倾斜的包围平面进行剪裁。不过可以先进行透视变换,通过透视变换,把透视视域体的倾斜面变换成与Z轴平行,就和正交视域体一样,然后就可以进行正常的剪裁。