第5章观察变换和裁剪.ppt
《第5章观察变换和裁剪.ppt》由会员分享,可在线阅读,更多相关《第5章观察变换和裁剪.ppt(183页珍藏版)》请在三一办公上搜索。
1、1,第5章 观察变换和裁剪,5.1 2维观察5.2 二维图形裁剪5.3 3维观察控制流程5.4 观察坐标系及其变换5.5 投影变换5.6 观察体5.7 三维裁剪,2,3,5.1 2维观察,用图形生成算法,结合几何变换方法在2维空间构造图形;然后通过图形物理设备(显示屏、绘图仪等)输出图形的过程,称之为观察。在有限幅面的屏幕坐标系中显示一张大幅面图形,会模糊不清达不到观察的目的;反之,假如只对整幅图形的某些局部感兴趣,就只需输出该图的局部内容供观察。,4,明确在世界坐标系中的哪部分区域需要被观察输出,这部分内容又将在显示屏坐标系中的哪个范围显示,这是观察变换问题。,坐标系是建立图形与数之间对应联
2、系的参考系。,5.1.1 坐标系,计算机图形学中对象的定义及其输入输出都在一定的坐标系下进行。同一对象在观察过程的不同阶段需用不同的坐标系描述,以提高处理效率,方便用户理解。,5,又称笛卡尔坐标系,是最常用的坐标系。在3维空间中,直角坐标系分左手坐标系和右手坐标系。,1.直角坐标系,仿射坐标系:坐标轴之间不垂直,圆柱坐标系,球坐标系,极坐标系,6,WC是与物理设备无关,描述自然界对象时所用的右手直角坐标系。其取值范围是整个实数域。,2.世界坐标系(World Coordinate System),用户坐标系(User Coordinate System),若由用户自行确定世界坐标系的取值范围描
3、述对象时,世界坐标系又称为用户坐标系。用户坐标系的取值范围是整个实数域的某个子域,也可以是整个实数域。,7,VC是与物理设备无关的,用于设置观察窗口观察和描述用户感兴趣的区域内部分对象,其取值范围由用户确定。观察坐标系采用左手直角坐标系,可以在用户坐标系中的任何位置、任何方向定义。其中有一坐标轴与 观察方向重合同向并与观察平面垂直。(如图4-6表示世界坐标系与观察坐标系之间的关系。),3.观察坐标系(Viewing Coordinate System),8,设备坐标系(DC)是与具体物理设备相关,用于指定输出图形的窗口或视区。设备坐标系常采用左手直角坐标系;其取值范围受设备的输入输出精度和有效
4、幅面的限制,是某个整数域。,4.设备坐标系(Device Coordinate System),造型坐标系MC:Modeling Coordinate System右手系,直角坐标系。对于定义的每个形体或图素都有各自的坐标原点和长度单位,这样可以方便形体和图素的定义。局部坐标系(local coordinate),9,5.规范化设备坐标系(Normalized Device Coordinate System),规范化设备坐标系(NDC)是与具体的物理设备无关的一种坐标系,用于定义视区,描述来自世界坐标系中窗口内对象的图形,取值范围约定为的正方形域。由NDC表示的图形在任何的DC中都能处于相同
5、的相对位置。正是NDC的描述,提高了相关程序的可移植性。,10,是指将世界坐标系定义的2维对象最终在设备坐标系中显示的整个过程。,5.1.2 2维观察控制流程,窗口在世界坐标系中由用户指定的一个区域;用来指定要显示的图形。,视区 在设备坐标系(屏幕)上指定的区域;用来指定窗口内的图形在屏幕上显示的大小及位置。,11,矩形是最常用的窗口和视区。,观察变换:将定义在世界坐标系中窗口区域内的图形变换到设备坐标系中,并在指定视区内显示的过程。在2维空间中的观察变换又称为窗口视区变换。,12,2D观察控制流程:,WC:定义 2D对象,WC 到VC变换,VC:窗口裁剪,NDC到DC变换,DC:2D图形显示
6、,13,5.1.3 WC到VC的变换,是指将对象描述从世界坐标系变换到观察坐标系的过程。,14,4.2.3 WC到VC的变换,分两步:1)平移观察坐标系的坐标原点,与世界坐标系的 原点重合;2)将xe、ye轴分别旋转(-)角与xw、yw轴重合。,1 0 0 cos-sin 0=1 0 0 T=sin cos 0-x0-y0 1 0 0 1,WC到VC的变换总矩阵为 T=T,15,窗口位置为(xwmin,ywmin)和(xwmax,ywmax);视区位置为(xvmin,yvmin)、(xvmax,yvmax)。窗口到视区的映射原则:对同一对象,在窗口与视区中应具有相同的相对位置,两者不变形。窗口
7、中的物点P(xw,yw)与视区中的像点P(xv,yv)之间满足:,5.1.4 窗口到视区变换,P点到窗口左边界距离/窗口宽度=点到视区左边界距离/视区宽度,P点到窗口下边界距离/窗口高度=P点到视区下边界距离/视区高度,16,17,得视区像点P的坐标为 xv=xvmin+sx(xw-xwmin)yv=yvmin+sy(yw-ywmin)(4-10)其中 sx=(xvmax-xvmin)/(xwmax-xwmin)sy=(yvmax-yvmin)/(ywmax-ywmin)(4-11)sx、sy分别为x和y方向上的比例因子。,18,改变窗口、视区大小,在视区内得到大小变化、位置不同的像.,改变视
8、区大小可改变输出对象的大小和位置;如果视区大小不变,窗口扩大,像缩小,窗口缩小、像放大;若视区为全屏,窗口内容将满屏显示。,改变视区位置可获得不同显示位置的输出对象;不在窗口区域内的内容不会在视区内出现。,如果sx=sy,窗口的宽/高视区的宽/高,物与像形状相似,像不产生畸变;否则产生畸变。,如果xvmin=yvmin=0,xvmax=yvmax=1,则窗口到视区的变换将独立于输出设备。,19,5.1.5 规范化设备坐标系到设备坐标系的变换,规范化坐标系(0,0)(1,1),映射到设备坐标系(0,0)(n,m)。,NDC,DC,(xNDC,yNDC),(xDC,yDC),(Dx,Dy),(dx
9、,dy),20,若n:m不等于1,DC中输出的图形将产生变形。,如何解决?,21,定义窗口void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,Ldouble top);left,right The coordinates for the left and right vertical clipping planes.bottom,top The coordinates for the bottom and top horizontal clipping planes.定义视区glViewport(GLint x,GLint
10、y,GLsizei width,GLsizei height);这个函数定义一个视口。函数参数(x,y)是视口在屏幕窗口坐标系中的左下角点坐标,参数width和height分别是视口的宽度和高度。缺省时,参数值即(0,0,winWidth,winHeight)指的是屏幕窗口的实际尺寸大小。所有这些值都是以象素为单位,全为整型数,22,SetupViewport(cx,cy);m_width=cx;m_height=cy;glMatrixMode(GL_PROJECTION);glLoadIdentity();if(m_width=m_height)glOrtho2D(xMin,xMax,yMi
11、n*(GLdouble)(GLdouble)m_height/(GLdouble)m_width),yMax*(GLdouble)(GLdouble)m_height/(GLdouble)m_width);ElseglOrtho2D(xMin*(GLdouble)(GLdouble)m_width/(GLdouble)m_height),xMax*(GLdouble)(GLdouble)m_width/(GLdouble)m_height),yMin,yMax,);glMatrixMode(GL_MODELVIEW);glLoadIdentity();,23,5.2 二维图形裁剪,裁剪:按指定
12、大小和位置开窗口,确定图形在窗口内的予以显示,在窗口外的不予显示的操作。,裁剪实质:确定图形中哪些图元在窗口内。,裁剪操作基本任务:图元在窗口内外的判断;图元与窗口边界相交时的求交计算。,裁剪处理的速度是衡量裁剪算法性能的重要指标。,24,5.2.1 点的裁剪,设矩形窗口左下角点坐标为(x,y),右上角点坐标为(x,y),图形中的任意一点(x,y)若满足条件:xxx yyy(4-18)则,该点在窗内应为可见被显示;否则不可见被裁剪掉。,25,5.2.2 直线段裁剪 1.直线段与窗口的相对位置,与凸多边形窗口相交的任何直线段最多只有一段处于其边界内。线段与窗口的三种相对位置关系:完全不可见、完全
13、可见和部分可见。,26,直线段两端点与窗口的各种位置关系,1)两端点均在窗口内(A);直接判断完全可见。2)两端点均在窗口边界线外同侧(B和C);直接判断出完全不可见。,3)一端点在窗口内,另一个在窗口外(D);计算交点 S,S内侧线段为可见,另一侧线段不显示。,27,4)两端点均在窗口外,但不在窗口边界线外同侧(E、F);与窗口边界求交,分两种情形:,两交点均处于窗口有效边界上(E),两交点间的线段S12为可见,其余两侧的线段舍弃;,两交点均在窗口有效边界外(F),完全不可见,舍弃。,28,直线段裁剪算法Cohen-Sutherland算法(编码裁剪法),用四条窗口边界线把整个平面分成九个区
14、域,每个区域用一个四位二进制代码表示。每条线段按其端点所在区域的代码标识它相对于窗口的位置属于哪种类型,确定对该线段是否裁剪。,29,四位代码CTCBCRCL含义如下:CL=1(端点在XL左);=0(端点在XL右)CR=1(端点在XR右);=0(端点在XR左)CB=1(端点在YB下);=0(端点在YB上)CT=1(端点在YT上);=0(端点在YT下),XL,XR,YT,YB,30,此图六条线段的端点代码特征与可见性的关系,如下表所示。,31,C1、2分别为线段端点代码,code为C1与C2的逻辑乘。线段 C1 C2 code 特 征 结果说明A 0000 0000 0000 C1=C2=cod
15、e=0000 完全在窗内,全接受B10001000 1000 完全在窗外同侧,C 1001 0001 0001 code0000 全不可见,舍弃D 0001 0000 0000 C1、C2之一:0000 有一交点,部分可见E/F 0010 01000000 C1与C2均0000 线段与窗口边界有 且code=0000 两交点,可见性不定,32,1.求出线段两端点P1 和P2 的编码C1 和C2;2.若C1 和C2 的按位“与”不等于0,P1 和P2 必定在某 条边的外侧,P1P2不可见。结束。3.若C1 和C2 的按位“或”等于0,P1P2全部可见。结束。4.否则必然有一个端点在矩形外部,令该
16、点为P1。5.P1在哪条边界线外部,就求出该边界与P1P2的交点 P,舍掉P1P部分,把交点P作为剩余线段的P1点。6.重复上述过程15,直到结束。,编码裁剪算法思路:,裁剪一条直线段的Cohen-Sutherland算法如图4-14.,33,编码裁剪算法:define LEFT 1/*0001*/#define RIGHT 2/*0010*/#define BOTTOM 4/*0100*/#define TOP 8/*1000*/encode(x,y,code)float x,y;int*code;int c;c=0;if(xXL)c=c|LEFT;,34,else if(xXR)c=c|R
17、IGHT;if(yYT)c=c|TOP;*code=c;return;C_S_LineCLip(x1,y1,x2,y2,XL,XR,YB,YT)float x1,y1,x2,y2,XL,XR,YB,YT;int code1,code2,code;encode(x1,y1,35,while(code10|code20)if(code1else if(RIGHT&code0),36,x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x1);else if(BOTTOMx=x1+(x2-x1)*(YT-y1)/(y2-y1),37,if(code=code1)x1=x,y1=y;encod
18、e(x,y,code1);elsex2=x,y2=y,encode(x,y,code2);displayline(x1,y1,x2,y2);return;,38,基本思想是:运用C-S算法中直线段端点编码和线段检测方法,首先识别直接接受的完全可见线段和直接舍弃的完全不可见线段;对于不能立即识别可见性的线段,将线段中分为两段,并对该两段再分别重复上述测试,直到原来线段的子段完全在窗内被直接接受,或完全在窗口外直接舍弃。,中点分割裁剪算法,39,P2,P1,A1,A2,Am,Pm,S1,S2,40,大意:首先对线段端点进行编码,并把线段与窗口的关系分为三种情况:全在、完全不在、线段和窗口有交。对前
19、两种情况,与C-S算法一样处理。对于情况三,用中点分割方法将线段中分为两段,看是否归到前两种情况?若不是,求出线段与窗口的交点:从P1点出发找出距P1最近可见点S1;从P2点出发找出距P2最近可见点S2,两个可见点之间的连线即为线段P1P2的可见部分。,中点分割裁剪算法,41,从p1出发找最近可见点的中点分割法:先求出p1p2的中点pm,若p1pm不是显然不可见,并且p1p2在窗口中有可见部分,则距p1最近的可见点一定落在p1pm上,所以用p1pm代替p1p2;否则取pmp2代替p1p2。再对新的p1p2求中点pm。重复上述过程,直到pmp2长度小于给定的控制常数为止,此时pm收敛于交点。,P
20、2,P1,Pm,S1,S2,42,求端点P1、P2编码code1、code2,code1code2=0?,code1=code2=0?,code1=0?,Pm=(P1+P2)/2,|PmP2|e?,P1Pm显然不可见?,P2=Pm,P1=Pm,P1P2全可见,P1可见,P=P1,P=Pm,P1P2全不可见,退出,N,Y,Y,Y,Y,N,N,N,N,Y,43,该算法的主要计算过程只用到加法和除2运算,所以特别适合硬件实现,同时也适合于并行计算。,44,Cyrus-Beck算法是典型的一种。可用非矩形的凸多边形窗口裁剪 2 维线段,用凸多面体裁剪 3 维线段。Cyrus-Beck算法是基于向量点积
21、原理判断线段端点的区域、计算交点的。,Cyrus-Beck参数裁剪算法,窗口一边界与线段P1P2的相交情况:边界Ei,内法矢 Ni,其上任意点fi。线段P1P2的参数方程:P(t)=P1+(P2-P1)t,45,直线P1P2,两端点座标为P1(1,1),P2(9,3),对一个矩形区域内的裁剪。,P1P2方程:,参数方程:,内法矢:i,-i,j,-j(左右下上),左边界,取f(0,0),nL=i,46,t1/10,右边界:f(8,4)nR=i,t9/10,下边界:f(0,0),nB=j,t1/2,上边界:f(8,4),nT=j,t3/2,47,48,49,若交换P3、P4的位置,将导出显示窗口完
22、全位于线段左侧的结论,因此,在作出线段不可见的结论时,被裁剪线段方向是重要的。,50,51,Cyrus-Beck参数化裁剪算法,Cyrus-Beck算法是典型的一种。可用非矩形的凸多边形窗口裁剪 2 维线段,用凸多面体裁剪 3 维线段。Cyrus-Beck算法是基于向量点积原理判断线段端点的区域、计算交点的。,窗口一边界与线段P1P2的相交情况:边界Ei,内法矢 Ni,其上任意点fi。线段P1P2的参数方程:P(t)=P1+(P2-P1)t,52,fi到P1P2的向量为(P(t)-fi),与边界 Ei的内法矢 Ni的点积 Ni(P(t)-fi)有三种可能:,式中分母不为0:1)Ni 不可能为0
23、向量;2)若P1、P2重合,可简单处理;3)若Ni(P2-P1),P1P2/Ei,无交点。,P(t)=P1+(P2-P1)t,53,线段与边界线 Ei 的交点满足:0 t 1但其中有有效交点和无效交点。,有效交点的确定:进入交点PE(Ni(P2-P1)0)离开交点PL(Ni(P2-P1)0),最后交点对(PE,PL)交点参数 tE、tL 满足:,靠近直线的终点,靠近直线的起点,54,交点对(PE,PL):PE=P(tE),PL=P(tL),合理性:tE tL如果tEtL,则线段完全落在裁剪窗口之外。,55,56,梁友栋和Barskey提出的参数化裁剪算法。首先按参数化形式写出裁剪矩形的裁剪条件
24、:这四个不等式可以表示为形式:其中,参数pk,qk定义为:任何平行于裁剪边界之一的直线pk=0,k=1,2,3,4对应于左、右、下、上裁剪边界;如果qk0,则线段完全在边界外,舍弃。如果qk0,则该线段在窗口内,与裁剪边界平行。,梁友栋Barskey算法,t,57,当qk0,P1位于第k条边的内侧,可见部分 当qk0,线段与边界的交点的t值:t=qk/pk.,q1x1-xLx1q2xR-x1xRq3y1-yBy1q4yT-y1yT,58,对于每条直线,可以计算出定义裁剪矩形内线段部分的参数 te、tl。te的值由线段从外到内遇到的矩形边界所决定(p0)。对这些边界计算tk=qk/pk。tl=m
25、in0,tk。取te tl时的线段,否则完全落在裁剪窗口之外。,pk0,线段从内到外,p1x1-x2xLx1p2x2-x1xR x2p3y1-y2 yBy1p4y2-y1yT y2,59,3.多边形裁剪算法,多边形裁剪:等价于直线段逐段裁剪的组合?问题:1)边界不再封闭,需要用窗口边界的恰当部分来封闭它,如何确定其边界?,60,2)一个凹多边形可能被裁剪成几个小多边形,如何 确定这些小多边形的边界?,61,Sutherland-Hodgman算法(逐边裁剪算法),算法基本思想:逐边裁剪、两次分解、流水线作业.首先将多边形对于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪,其次,将多边形对
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 观察 变换 裁剪
链接地址:https://www.31ppt.com/p-6618607.html