1ComputerGraphics计算机图形学第5讲:二维观察2目录CONTENTS01绪论02图形系统03二维图形生成04图形几何变换05二维观察06三维观察07三维对象08真实感图形技术09交互技术10计算机动画3ComputerGraphics第5章:二维观察1•二维观察概述2•二维观察流水线3•裁剪4•OpenGL二维观察简介4§5.1二维观察概述二维场景中要显示的部分窗口Window将窗口映射到显示设备上的坐标区域视区Viewport窗口与视区XYwxlXYwybwxrwyt窗口vxrvybvyt视区vxl5窗口Window:世界坐标系中可见的矩形部分视区Viewport:设备坐标系中可见的矩形部分窗口未变而视区变视区相同而窗口不同6ComputerGraphics第5章:二维观察1•二维观察概述2•二维观察流水线3•裁剪4•OpenGL二维观察简介7输入设备•二维观察的简单流程-----二维观察流水线2.二维观察流水线观察坐标系下对窗口进行裁剪窗口到视区(规范化设备坐标系中定义)的变换视区从规范化坐标系到设备坐标系的变换在图形设备上输出DC观察变换将世界坐标转换为观察坐标NDCVCWCVC使用建模变换构造世界坐标系场景建模坐标系中建模MC1、坐标系统建模坐标系---世界坐标系---观察坐标系----设备坐标系81、坐标系统建模坐标系:局部坐标系,每一个对象参考自身的特征点而建立的平面直角坐标系。世界坐标系:全局坐标系,所有对象统一的平面直角坐标系。2.二维观察流水线从建模坐标到世界坐标,实质上是一个将物体从局部空间组合、装配到世界空间的变换过程。9观察坐标系:用户可根据图形显示的要求定义观察区域与观察方向而得到的坐标系。完成从观察者角度对整个世界坐标系内的对象进行重新定位和描述。规范化设备坐标系:既独立于具体设备,又可容易地转变成设备坐标系的中间坐标系。设备坐标系:与特定的输出设备相联系,其坐标是离散的整数值。2.二维观察流水线10坐标系统之间的变换•关系:为创建和显示二维对象,首先在建模坐标系中定义这些对象,再将其组装定位到世界坐标系中。然后,指定视点的位置、视线方向,确定观察坐标系,根据显示要求确定投影面的方位,对物体进行投影变换,并将其变换到规范化设备坐标系中。最后,再将投影结果映射到设备坐标系下,完成其到输出设备的输出显示。2.二维观察流水线11ComputerGraphics第5章:二维观察1•二维观察概述2•二维观察流水线3•裁剪4•OpenGL二维观察简介12点的裁剪线段裁剪•Cohen-Sutherland•Mid-Point•Liang-Barsky多边形裁剪§5.3.裁剪13多边形裁剪•已知:矩形窗口、对象•目标:保留窗口内对象,去掉窗口外对象•约束条件:效率、正确性、稳定性•窗口是边与坐标轴平行的矩形,由上(y=yt)、下(y=yb)、左(x=xl)、右(x=xr)四条边描述§5.2.裁剪14图形裁剪中最基本的问题•窗口的左下角坐标为(xL,yB),右上角坐标为(xR,yT)•给定点P(x,y),当xL=x=xR并且yB=y=yT,保留点;否则忽略。•判断点与窗口的内外关系矩形窗口→多边形窗口§5.3.1点的裁剪(xL,yB)(xR,yT)15§5.3.2直线段的裁剪窗口直线段与窗口ABCDEFHGIJ16基本思想:对每条直线段p1(x1,y1)p2(x2,y2)分三种情况处理:(1)直线段完全可见,“取”之。(2)直线段显然不可见,“弃”之。(3)直线段既不满足“取”的条件,也不满足“弃”的条件,需要对直线段按交点进行分段,分段后重复上述处理。1.Cohen-Sutherland算法17编码:对于任一端点(x,y),根据其坐标所在的区域,赋予一个4位的二进制码D3D2D1D0。编码规则如下:•若xxL,则D0=1,否则D0=0;•若xxR,则D1=1,否则D1=0;•若yyB,则D2=1,否则D2=0;•若yyT,则D3=1,否则D3=0。1.Cohen-Sutherland算法0000窗口01000101100100011010011010000010图6-26窗口及区域编码D3D2D1D018裁剪一条线段时,先求出端点p1和p2的编码code1和code2:(1)若code1|code2=0,对直线段应取之(2)若code1&code2!=0,对直线段可弃之(3)若上述两条件均不成立。则需求出直线段与窗口边界的交点。在交点处把线段一分为二,其中必有一段完全在窗口外,可以弃之。再对另一段重复进行上述处理,直到该线段完全被舍弃或者找到位于窗口内的一段线段为止。1.Cohen-Sutherland算法19算法的步骤:(1)输入直线段的两端点坐标:p1(x1,y1)、p2(x2,y2),以及窗口的四条边界坐标:yT、yB、xL和xR。(2)对p1、p2进行编码:点p1的编码为code1,点p2的编码为code2。1.Cohen-Sutherland算法P1P2P3P4000001000101100100011010011010000010图6-27直线段p1p2的编码裁剪如何计算编码?(3)若code1|code2=0,对直线段应简取之,转(6);否则,若code1&code2!=0,对直线段可简弃之,转(7);当上述两条均不满足时,进行步骤(4)。20(4)确保p1在窗口外部:若p1在窗口内,则交换p1和p2的坐标值和编码。(5)按左、右、上、下的顺序求出直线段与窗口边界的交点,并用该交点的坐标值替换p1的坐标值。也即在交点s处把线段一分为1.Cohen-Sutherland算法P1P2P3P4000001000101100100011010011010000010图6-27直线段p1p2的编码裁剪二,并去掉p1s这一段。考虑到p1是窗口外的一点,因此可以去掉p1s,转(2)(6)用直线扫描转换算法绘制当前的直线段p1p2。(7)算法结束。21特点:1.用编码方法快速判断线段的完全可见和显然不可见2.优点是简单,易于实现3.算法中求交点很重要,它决定了算法的速度4.另外,本算法对于其他形状的窗口未必同样有效1.Cohen-Sutherland算法22几位编码?三维Cohen-Sutherland算法23将裁剪线段及裁剪窗口均看作点集,那么裁剪结果即为两点集的交集•问题:裁剪窗口是二维对象,而线段是一维对象,如何求取交集?2.Liang-Barsky算法u0u1u2u301窗口ABCDEFHGIJ24窗口分解:四条边界-两组边界2.Liang-Barsky算法lrubuutu01LRTB简化?25直线P1P2:P=P1+u*(P2-P1)直线与裁剪窗口的交点Q1、Q2P1P2至少部分可见的充要条件?2.Liang-Barsky算法0P1P2Q1Q2u=0u=1u1u2lrubuutu01LRTB262.Liang-Barsky算法011L2RP0P101u1u201u1u201u1u201u1u201u1u2uuP1P2至少部分可见的充要条件?max(u1,0)=min(u2,1)272.Liang-Barsky算法回到二维情形:LRTB01ruluubutlrubuutu01LRTB282.Liang-Barsky算法设要裁剪线段P0P1,及其与窗口交点:A,B,C,D•思想:从A,B和P0三点中找出最靠近的P1点:P0•从C、D和P1中找出最靠近P0的点:C裁剪结果:P0CA,B,P0在一起?29问题的提出:§5.3.3多边形的裁剪(c)正确的裁剪结果(b)直接采用直线段裁剪的结果(a)裁剪前30错觉:直线段裁剪的组合?新的问题:边界不再封闭,需要用窗口边界的恰当部分来封闭它如何确定封闭边界?§5.3.3多边形的裁剪31分割处理策略:将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪。流水线过程(左上右下):前边的结果是后边的输入。1.Sutherland-Hodgeman算法32基本思想1.Sutherland-Hodgeman算法输入:ABCDEFGHABCDEFGH输出:A12DEFGH12(a)用左边界裁剪输出:A134D56FGHADEFGH输入:A12DEFGH12(b)用下边界裁剪3456331.Sutherland-Hodgeman算法输入:A134D56FGHADFGH1(c)用右边界裁剪3456输出:A134D5678GH78ADGH1(d)用上边界裁剪345678输入:A134D5678GH输出:K34D56789IHJ9IJK34基本思想是一次用窗口的一条边裁剪多边形考虑窗口的一条边以及延长线构成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种1.Sutherland-Hodgeman算法可见一侧可见一侧可见一侧可见一侧SpSSSppp(1)(2)(3)(4)35(1):输出点P(2):无输出(3):输出交点I(4):输出交点I和点P1.Sutherland-Hodgeman算法SP(1)可见侧可见侧SP(2)SP(3)可见侧ISP(4)可见侧I36•Example1.Sutherland-Hodgeman算法A(1):out-inOutput:A’BBCDA’C’ABCDA’C’ABCDA’C’ABCDA’C’ABCDA’C’(2):in-inOutput:C(3):in-outOutput:C’(4):out-outOutput:none371.Sutherland-Hodgeman算法A(a)裁剪前(b)Sutherland-Hodgeman算法的裁剪结果BCDEFABCDEFV1V2V3V438字符也是图元的一种,它在输出过程中,同样需要进行裁剪,字符的裁剪有多种策略,依赖于字符的生成及存储方式和具体应用的要求,有三种。1.Sutherland-Hodgeman算法采用字符串方式进行裁剪时,将包围字符串的外接矩形对窗口作裁剪。当字符串外接矩形整个在窗口内时予以显示,否则不显示。1.字符串391.Sutherland-Hodgeman算法采用字符方式进行裁剪时,将包围字符的外接矩形对窗口作裁剪,如某个字符外接矩形整个落在窗口内予以显示,否则不显示。2.基于字符401.Sutherland-Hodgeman算法对于点阵字符,构成字符的最小元素为象素,此时字符的裁剪转化为点裁剪。对于矢量字符,构成字符的最小元素是直线段(笔画),这样字符的裁剪就转化成了线裁剪。3.基于构成字符的基本图素41ComputerGraphics第5章:二维观察1•二维观察概述2•二维观察流水线3•裁剪4•OpenGL二维观察简介421、视口变化OpenGL中通常都要指定视点变换、模型变换、投影变换这几种变换的矩阵。函数glMatrixMode(GLenummode)来设定当前矩阵操作这三类矩阵所对应类型的矩阵堆栈,参数mode取值可以为GL_MODELVIEW,GL_PROJECTION,和GL_TEXTURE,分别对应于上述模型视图、投影变换和纹理映射三类矩阵。§5.4OpenGL二维观察43视区函数的任务是将经过几何变换、投影变换和裁剪变换后的物体显示于屏幕窗口内指定的视区内。OpenGL中的视区函数是:glViewport(Glintx,GLinty,GLsizeiwidth,GLsizeiheight);x,y用于指定视区左下角点的坐标,它与显示窗口的左下角对应。参数width和height分别是视口的宽度和高度。缺省时是屏幕窗口的实际尺寸大小。所有这些值都是以像素为单位,全为整型数。§5.4OpenGL二维观察44三角形绘制与显示程序中定义了两个视口,分别显示两个不同颜色的三角形,其中一个视区定义在显示窗口的左半区,显示蓝色三角形,另一