1、观察平面观察平面照相三维观察利用计算机进行三维观察处理流程中所经过的一般过利用计算机进行三维观察处理流程中所经过的一般过程如下:程如下:3DVC从 应 用从 应 用程 序 得程 序 得到 对 象到 对 象的 世 界的 世 界坐标坐标变 换 到变 换 到观 察 坐观 察 坐标系标系对观察对观察空间的空间的用户窗用户窗口进行口进行裁剪裁剪投影变投影变换到换到3D规范化规范化的视区的视区在图形设备在图形设备上输出图形上输出图形3DWC3DVC3DNDC变换到设备变换到设备坐标空间坐标空间DC3DMCxwxwywywzwzwP0(x0,y0,z0)P0(x0,y0,z0)zviewzviewyview
2、yviewxviewxview在世界坐标系中定义观察坐标系在世界坐标系中定义观察坐标系 viewzviewyviewxxwywzwP0zviewyviewxview观察观察平面平面N观察平面及其法向量的定义观察平面及其法向量的定义 viewzviewzvpzviewzviewzviewxviewyviewyN输入的V调整后的V),(),(|),(|zyxzyxzyxvvvunvuuuVnVunnnNNn1000000,1000100010001000zyxzyxzyxnnnvvvuuuRzyxT1000000000000zyxzyxzyxzyxzyxzyxvcwcnznynxnnnvzvyvx
3、vvvuzuyuxuuuTRMAA B B 投影平面投影平面投影线投影线AB A B 投影平面投影平面投影线投影线(a)平行投影)平行投影(b)透视投影)透视投影投影中心投影中心 投影中心投影中心(投影参考点)、(投影参考点)、投影线投影线、投影过程、投影过程平行投影的特点是保持了对象的平行投影的特点是保持了对象的有关比例关系不变有关比例关系不变;而透视;而透视投影会产生同样大小的物体投影会产生同样大小的物体近大远小近大远小的视觉效果,真实感更的视觉效果,真实感更强。强。yyyzxxzo(a)三维物体)三维物体(b)物体的三视图)物体的三视图俯视图俯视图侧视图侧视图主视图主视图z投影平面投影平
4、面zxy投影平面投影平面zxy(a)等轴侧投影)等轴侧投影(b)正二侧投影)正二侧投影(c)正三侧投影)正三侧投影xzyyyxxzz投影平面投影平面xyz(x,y,z)(x,y)zxy观察平面观察平面(xwminwmin,ywmin)zy观察平面观察平面x(xwmaxwmax,ywmax)裁剪窗口裁剪窗口zview裁剪窗口裁剪窗口无限正投影观察体的侧视图无限正投影观察体的侧视图 裁剪窗口裁剪窗口近平面近平面远平面远平面yviewyviewzviewzviewxviewxview观察平面位于近平面之前的有限正投影观察体观察平面位于近平面之前的有限正投影观察体 7.3.1.4 正投影的规范化变换正
5、投影的规范化变换规范化观察体规范化观察体:单位立方体单位立方体、对称立方体对称立方体,左手系左手系(屏幕、规格化)。(屏幕、规格化)。裁剪窗口由左下角裁剪窗口由左下角(xwmin,ywmin)和右上角(和右上角(xwmax,ywmax)顶点的位置来)顶点的位置来定义,近平面的定义,近平面的z坐标值为坐标值为znear,远平面的,远平面的z坐标值为坐标值为zfar。在从正投影观察体。在从正投影观察体到对称规范化观察体的变换过程中,存在点到对称规范化观察体的变换过程中,存在点(xwmin,ywmin,znear)到(到(-1,-1,-1)及()及(xwmax,ywmax,zfar)到()到(1,1
6、,1)的映射关系。)的映射关系。(xwmin,ywmin,znear)(xwmin,ywmin,znear)(xwmax,ywmax,zfar)(xwmax,ywmax,zfar)(-1,-1,-1)(-1,-1,-1)(1,1,1)(1,1,1)zviewzviewxviewxviewyviewyviewznormznormxnormxnormynormynorm利用从窗口到利用从窗口到规范化正方形规范化正方形的变换方法,的变换方法,计算正投影观计算正投影观察体的规范化察体的规范化变换矩阵为:变换矩阵为:1000200020002minmaxminmaxminmaxminmaxminmaxm
7、inmaxfarnearfarnearfarnearnormorthozzzzzzywywywywywywxwxwxwxwxwxwM在规范化变换在规范化变换之后,即可进之后,即可进行图形的裁剪,行图形的裁剪,并结合消隐、并结合消隐、表面绘制和视表面绘制和视区变换来生成区变换来生成最后的屏幕显最后的屏幕显示场景。示场景。投影中心投影中心裁剪窗口裁剪窗口投影参考点投影参考点矩形棱台观察体矩形棱台观察体远裁剪平面远裁剪平面近裁剪平面近裁剪平面裁减窗口裁减窗口汇聚点在投影中心的无限矩形棱锥观察体汇聚点在投影中心的无限矩形棱锥观察体 观察平面在近裁减平面之前的棱台透视投影观察体观察平面在近裁减平面之前的
8、棱台透视投影观察体 yxzC(xc,yc,zc)观察平面观察平面OP(x,y,z)P(x,y,zvp)在观察平面上已知在观察平面上已知z=zvp,从而可求出观察平面与投影线之间交,从而可求出观察平面与投影线之间交点位置的参数点位置的参数t:t=(zvp-z)/(zc-z)x=x(zc-zvp)+xc(zvp-z)/(zc-z),),y=y(zc-zvp)+yc(zvp-z)/(zc-z)一些特殊和简化的透视投影过程,如:一些特殊和简化的透视投影过程,如:(1)将投影参考点限定在观察坐标系的将投影参考点限定在观察坐标系的z轴上,则轴上,则xc=yc=0,可得到,可得到如下变换公式:如下变换公式:
9、x=x(zc-zvp)/(zc-z),y=y(zc-zvp)/(zc-z)(2)将投影参考点限定在观察坐标系的原点上,则将投影参考点限定在观察坐标系的原点上,则xc=yc=zc=0,可,可得到如下变换公式:得到如下变换公式:x=xzvp/z,y=yzvp/z(3)若观察平面是若观察平面是xoy平面且对投影参考点的位置不加限制,则平面且对投影参考点的位置不加限制,则zvp=0,可得到如下变换公式:,可得到如下变换公式:x=(xzc-xcz)/(zc-z),),y=(yzc-ycz)/(zc-z)(4)若把若把xoy平面作为观察平面且投影参考点设定在观察坐标系的平面作为观察平面且投影参考点设定在观
10、察坐标系的z轴上,则轴上,则xc=yc=zvp=0,可得到如下变换公式:,可得到如下变换公式:x=xzc/(zc-z),),y=yzc/(zc-z)远裁剪平面远裁剪平面近裁剪平面近裁剪平面观察平面观察平面裁剪窗口裁剪窗口(xc,yc,zvp)(xc,yc,zvp)(xc,yc,zc)(xc,yc,zc)棱台中心线棱台中心线从一个方向看的对称的透视投影观察体从一个方向看的对称的透视投影观察体(xwmin,ywmin,zvp)(xwmin,ywmin,zvp)高高(xc,yc,zvp)(xc,yc,zvp)(xwmax,ywmax,zvp)(xwmax,ywmax,zvp)裁剪窗口裁剪窗口投影参考
11、点投影参考点裁剪窗口裁剪窗口zc-zvpzc-zvp(a a)棱台中心线位于裁剪窗口中心)棱台中心线位于裁剪窗口中心(b b)视场角与裁剪窗口高度关系)视场角与裁剪窗口高度关系 xwmin=xc-宽度宽度/2,xwmax=xc+宽度宽度/2,ywmin=yc-高度高度/2,ywmax=yc+高度高度/2 tg(/2)=(高度高度/2)/(zc-zvp)高度高度=2(zc-zvp)tg(/2)宽度宽度=横纵比横纵比高度高度(xwmin,ywmin,znear)(xwmin,ywmin,znear)(xwmax,ywmax,zfar)(xwmax,ywmax,zfar)(-1,-1,-1)(-1,
12、-1,-1)(1,1,1)(1,1,1)z zx xy yznormznormxnormxnormynormynorm裁剪窗口裁剪窗口投影参考点投影参考点规范化观察体规范化观察体01000002maxmin002maxmin001000002maxmin002maxmin010000100000000zzyyxxzzyxnormperstsywywssznearxwxwsszneartsywywznearxwxwznearssM由于齐次矩阵表示如下:由于齐次矩阵表示如下:1zyxMhzyxnormpershhh透视投影变换的规范化变换矩阵:透视投影变换的规范化变换矩阵:因此,正交投影坐标为:因
13、此,正交投影坐标为:x=xh/h=-znearsxx+sx(xwmin+xwmax)/2/(-z)y=yh/h=-znearsyy+sy(ywmin+ywmax)/2/(-z)z=zh/h=(szz+tz)/(-z)在上式中由于投影参考点在观察坐标系原点(即在上式中由于投影参考点在观察坐标系原点(即zc=0),而),而h=zc-z,故,故h=-z。在规范化变换中矩形平行管道与规范化观察体。在规范化变换中矩形平行管道与规范化观察体之间存在这样的映射关系:位置点(之间存在这样的映射关系:位置点(xwmin,ywmin,znear)映射)映射到位置点(到位置点(-1,-1,-1),而位置点(),而位
14、置点(xwmax,ywmax,zfar)映射)映射到位置点(到位置点(1,1,1)。将这两个边界条件代入上式中,可求得)。将这两个边界条件代入上式中,可求得规范化变换中的缩放和平移因子:规范化变换中的缩放和平移因子:zfarznearzfarzneartzfarznearzfarznearsywywsyxwxwszzx2,minmax2,minmax2一般简化的透视投影规范化变换矩阵如下:一般简化的透视投影规范化变换矩阵如下:010020002maxminminmax2002maxmin0minmax2zfarznerzfarznerzfarznerzfarznerywywywywznearx
15、wxwxwxwznearMnormpers010020000)2/(0000)2/(zfarznearzfarznearzfarznearzfarznearctgaspectctgMnormpers若所使用的透视投影观察体被指定为对称透视投影观察体,则若所使用的透视投影观察体被指定为对称透视投影观察体,则可用视场角可用视场角和裁剪窗口的横纵比和裁剪窗口的横纵比aspect来改写上式中矩阵的来改写上式中矩阵的部分元素,如下:部分元素,如下:void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble enterx,GLdoub
16、le centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);P(eyex,eyey,eyez)既是观察坐标系原点,也是投影中心点。该函既是观察坐标系原点,也是投影中心点。该函数必须与数必须与glMatrixmode(GL_MODEVIEW)函数配合使用,完成所函数配合使用,完成所需的矩阵操作。需的矩阵操作。void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);创建一个创建一个对称透视视景体对称透视视景体。参数。参数
17、fovy的范围是的范围是0.0,180.0;参数;参数aspect是裁剪窗口宽度与高度的比率;是裁剪窗口宽度与高度的比率;void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);创建一个创建一个正交平行投影矩阵正交平行投影矩阵,近裁剪平面与观察平面重合近裁剪平面与观察平面重合。近。近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(),右上角点是(right,
18、top,-near);远裁);远裁剪平面也是一个矩形,左下角点空间坐标是(剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(),右上角点是(right,top,-far)。)。void glFrustum(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble znear,GLdouble zfar);创建一个创建一个对称棱台观察体或一个斜棱台观察体对称棱台观察体或一个斜棱台观察体。函数的参数只。函数的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即定义近裁剪平面的左下
19、角点和右上角点的三维空间坐标,即(left,bottom,-znear)和()和(right,top,-znear);最后一);最后一个参数个参数zfar是远裁剪平面的是远裁剪平面的Z负值,其左下角点和右上角点空间负值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。坐标由函数根据透视投影原理自动生成。示例程序:perspecconsole在三维裁剪之前不管投影变换类型和观察体的形状如何均被转换在三维裁剪之前不管投影变换类型和观察体的形状如何均被转换成规范化观察体,并在其中进行三维裁剪处理。成规范化观察体,并在其中进行三维裁剪处理。对称立方体的三维裁剪平面方程为:对称立方体的三维裁
20、剪平面方程为:xwmin=-1,xwmax=1,ywmin=-1,ywmax=1,zwmin=-1,zwmax=1 三维三维Cohen-Sutherland线段裁剪算法与二维算法的不同主要表线段裁剪算法与二维算法的不同主要表现为两点:(现为两点:(1)将区域编码扩展为)将区域编码扩展为6位,增加了近、远裁剪平面位,增加了近、远裁剪平面的对应位;(的对应位;(2)裁剪边界由原来的四个裁剪窗口边框扩展为包)裁剪边界由原来的四个裁剪窗口边框扩展为包围观察体的六个平面。围观察体的六个平面。6个平面将整个裁剪空间划分为个平面将整个裁剪空间划分为27个区域个区域。假设现在按如下对应关系定义六位二进制数假设
21、现在按如下对应关系定义六位二进制数:543210DDDDDDD D0 0为为1 1当且仅当区域在观察体上平面之上,即当且仅当区域在观察体上平面之上,即y1y1;否则为;否则为0 0;D D1 1为为1 1当且仅当区域在观察体下平面之下,即当且仅当区域在观察体下平面之下,即y-1y1x1;否则为;否则为0 0;D D3 3为为1 1当且仅当区域在观察体左平面之左,即当且仅当区域在观察体左平面之左,即x-1x-1;否则为;否则为0 0;D D4 4为为1 1当且仅当区域在观察体近平面之前,即当且仅当区域在观察体近平面之前,即z-1z1z1;否则为;否则为0 0;分别求出线段的两个端点所在区域的编码
22、(假设分别为分别求出线段的两个端点所在区域的编码(假设分别为code1和和code2),再进行如下判断:),再进行如下判断:如果如果code1和和code2都等于都等于0,说明两个端点都在观察体内部,说明两个端点都在观察体内部,那么该线段完全可见。那么该线段完全可见。如果如果code1和和code2的同一位为的同一位为1,说明两个端点都位于观察体,说明两个端点都位于观察体某一平面的外面,那么该线段显然完全不可见。要测试某一平面的外面,那么该线段显然完全不可见。要测试code1和和code2是否有同一位为是否有同一位为1,只要对它们做逻辑与即可。如果,只要对它们做逻辑与即可。如果code1&co
23、de2不等于不等于0,说明一定有同一位为,说明一定有同一位为1,否则说明没有,否则说明没有同一位为同一位为1。如果前面两种情况都不成立,说明该线段既不是完全可见,又如果前面两种情况都不成立,说明该线段既不是完全可见,又不是显然完全不可见。现在,需要求出线段与观察体表面的交不是显然完全不可见。现在,需要求出线段与观察体表面的交点。该交点把线段分成两段,其中一段一定位于观察体之外。点。该交点把线段分成两段,其中一段一定位于观察体之外。求出交点,并将从交点起位于观察体之外的线段部分抛弃,把求出交点,并将从交点起位于观察体之外的线段部分抛弃,把交点作为线段的新的端点,对其进行编码,重复上述判断过程交点作为线段的新的端点,对其进行编码,重复上述判断过程对线段的另一端点进行类似处理即可。对线段的另一端点进行类似处理即可。附加裁剪面函数附加裁剪面函数:3DClip