CG07

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

计通学院计算机科学系计算机图形学1第7章二维观察2本章目标理解二维图形的绘制过程图形裁剪方法窗口到视区的变换学会使用OpenGL的显示函数3主要内容二维观察流水线窗口到视区的变换OpenGL二维观察函数裁剪直线段裁剪多边形裁剪字符裁剪47.1二维观察流水线几个概念裁剪窗口(ClippingWindow):需要显示的场景区域又称为世界窗口或观察窗口,简称窗口在世界坐标系(又称用户坐标系)内定义视口(Viewport):指显示设备上用来显示图形的区域又称视区,在设备(屏幕)坐标系内定义裁剪(Clip):从场景中确定位于窗口内的图形视口屏幕57.1二维观察流水线裁剪窗口和视区的关系改变视口位置可以在输出设备的不同位置上观察物体使用多个视口可以在屏幕不同的位置观察场景的不同部分改变窗口的尺寸达到改变视口内显示对象的多少改变视口的尺寸实现对象放缩67.1二维观察流水线二维观察变换二维世界坐标系场景描述到设备坐标系的映射又称为窗口到视区的变换或窗口变换二维图形的观察流水线(显示流程)几何变换裁剪77.2窗口到视区的变换目标将窗口之中的图形变换到视区中变换的计算变换的分解与合成窗口(xmin,ymin):长度(Ex);宽度(Ey)视区(umin,vmin):长度(Eu);宽度(Ev)?87.2窗口到视区的变换步骤在世界坐标系中,平移使(xmin,ymin)至坐标原点,变换为T(-xmin,-ymin)放缩使窗口的大小与视区相等,变换为S(Eu/Ex,Ev/Ey)在设备坐标系中,平移使窗口与视区重合,变换为T(umin,vmin)97.2窗口到视区的变换变换矩阵10000minminminminminminminmin),(),(),(vEyEvyEyEvuExEuxExEuyxTEEEESvuTMyvxxwv注意:这里不需要逆变换107.3OpenGL二维观察函数流程程序窗口-裁剪窗口-视区GLUT显示窗口初始化:glutInit(&argc,argv);//参数与main函数一致位置:glutInitWindowPosition(xTopLeft,yTopLeft);大小:glutInitWindowSize(dwWidth,dwHeight);建立:glutCreateWindow(“TitleofDisplayWindows”);模式:glutInitDisplayMode(mode);选择颜色和缓存,如GLUT_RGB|GLUT_SINGLE背景颜色:glClearColor(red,green,blue,alpha)参数与选择的颜色模式相关,取值在0和1之间117.3OpenGL二维观察函数投影模式OpenGL专门为三维应用而设计,但可将三维观察函数应用于二维观察投影函数glMatrixMode(GL_PROJECTION);//指定投影矩阵为当前矩阵glLoadIdentity();//初始化GLU裁剪窗口函数定义函数:gluOrtho2D(left,right,bottom,top);功能:将场景映射到屏幕的正交投影参数为4个平面(3维)默认大小为(-1,1,-1,1)127.3OpenGL二维观察函数OpenGL视口函数定义函数:glViewport(xvmin,yvmin,vpwidth,vpheight);视口为矩形在视口内绘制图形对象指定显示内容函数:glutDisplayFunc(pictureDescrip)pictureDescrip为回调函数,主要绘制图形启动程序glutMainLoop()137.3OpenGL二维观察函数实例7-1#includegl/glut.h#includestdlib.h#includemath.hclasswcPt2D{public:GLfloatx,y;};voidinit(void){glClearColor(1.0,1.0,1.0,0.0);//设置裁剪窗口glMatrixMode(GL_PROJECTION);gluOrtho2D(-100.0,100.0,-100.0,100.0);//几何变换矩阵模式glMatrixMode(GL_MODELVIEW);}147.3OpenGL二维观察函数实例7-1(续)voidtriangle(wcPt2D*verts){GLintk;glBegin(GL_TRIANGLES);for(k=0;k3;k++)glVertex2f(verts[k].x,verts[k].y);glEnd();}voidviewport(floatx0,floaty0,floatx1,floaty1){glBegin(GL_LINE_LOOP);glVertex2i(x0,y0);glVertex2i(x1,y0);glVertex2i(x1,y1);glVertex2i(x0,y1);glEnd();}157.3OpenGL二维观察函数实例7-1(续)voiddisplayFcn(void){//定义三角形wcPt2Dverts[3]={{-50.0,-25.0},{50.0,-25.0},{0.0,50.0}};glClear(GL_COLOR_BUFFER_BIT);//清屏glLoadIdentity();glColor3f(0.0,0.0,1.0);glViewport(0,0,300,300);triangle(verts);glColor3f(0.0,1.0,0.0);viewport(-100,-100,100,100);/*旋转三角形并在右半窗口*/glColor3f(1.0,0.0,0.0);glViewport(300,0,300,300);glRotatef(180.0,0.0,0.0,1.0);triangle(verts);viewport(-100,-100,100,100);glFlush();}167.3OpenGL二维观察函数实例7-1(续)voidmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,50);glutInitWindowSize(600,300);glutCreateWindow(Split-ScreenExample);init();glutDisplayFunc(displayFcn);glutMainLoop();}177.3OpenGL二维观察函数问题图形越出视口?只绘制视口内还是全绘制?voiddisplayFcn(void){wcPt2Dverts[3]={{-50.0,-25.0},{50.0,-25.0},{0.0,50.0}};glClear(GL_COLOR_BUFFER_BIT);glLoadIdentity();glColor3f(0.0,0.0,1.0);glViewport(0,0,300,300);triangle(verts);glColor3f(0.0,1.0,0.0);viewport(-100,-100,100,100);glColor3f(1.0,0.0,0.0);glViewport(300,0,300,300);glPushMatrix();glTranslatef(80,0,0);glRotatef(180.0,0.0,0.0,1.0);triangle(verts);glPopMatrix();viewport(-100,-100,100,100);glFlush();}187.4裁剪流程二维显示流程扫描转换+裁剪算法简单(判断像素是否落在视区中)裁剪+扫描转换最常用,节约计算时间(先对参数表示的图形裁剪)197.4裁剪裁剪(clip)判断图形元素是否落在裁剪窗口之内并找出其位于内部的部分裁剪处理的主要步骤图元关于窗口内外关系的判别图元与窗口的求交假定条件矩形裁剪窗口:[xmin,ymin]-[xmax,ymax]主要内容:线段、多边形裁剪裁剪窗口207.5直线段裁剪待裁剪线段待裁剪线段和窗口的关系线段完全可见:端点位于窗口内显然不可见:端点位于边界同侧线段至少有一端点在窗口之外,但非显然不可见PxyPxy000111(,)(,)为提高效率,算法设计时应考虑:(一)快速判断情形(1)(2)(二)设法减少情形(3)求交次数和每次求交时所需的计算量(非盲目求交)217.5.1点裁剪线段的特殊情况两端点重合点(x,y)在窗口内的充分必要条件是xxxminmaxyyyminmax问题:对于任何多边形裁剪窗口,如何判别?227.5.2直接求交算法端点与窗口位置关系都在窗口内(完全可见)1个在窗口内,另一个在外(有1个交点)2个都不在窗口内可能相交可能不相交P5P2P3P4P1P6P7P8P9P10237.5.2直接求交算法计算交点方法线段与窗口的边求交点直线与窗口边都写成参数形式,求参数值)()(010010yytyyxxtxx)()('0'1'0'0'1'0yysyyxxsxx只有当s和t同时落在[0,1]区间上的交点才算有效交点(x0,y0)(x1,y1)(x’0,y’0)(x’1,y’1)247.5.2直接求交算法算法流程特点方法直接,易懂不能快速判断显然不可见的线段257.5.3编码算法Cohen-Sutherland算法(编码算法)算法步骤(思想)第一步判别线段两端点是否都落在窗口内,如果是,则线段完全可见;否则进入第二步;第二步判别线段是否为显然不可见,如果是,则裁剪结束;否则进行第三步;第三步求线段与窗口边延长线的交点,这个交点将线段分为两段,其中一段显然不可见,丢弃。对余下的另一段重新进行第一步,第二步,第三步处理,直至结束267.5.3编码算法区域编码由窗口四条边所在直线把二维平面分成9个区域,每个区域赋予一个四位编码,CtCbCrCl,上下左右elseyyCt0max1当elsexxCr0max1当elsexxCl0min1当elseyyCb0min1当277.5.3编码算法端点编码:定义为它所在区域的编码根据顶点编码判断线段与多边形的关系当两个端点的编码全为0时,线段完全可见当线段的两个端点的编码的逻辑“与”非零时,线段为显然不可见的287.5.3编码算法对于那些非完全可见、又非显然不可见的线段,需要求交(如,线段CD)求交前先测试与窗口哪条边所在直线有交?规则:判断端点编码中各位的值CtCbCrCl分别对应:上、下、右和左边端点码值位值不同时,说明线段与对应窗口边相交次序:上、下、右和左边以交点为界,丢弃外侧线段,以交点为新端点判断另一线段,重复上述过程如:CDC:0000D:1000Ct位不同,与上边相交297.5.3编码算法例DKMABCEFGHJINLO最多求交次数为4AB:与窗口左边相交,求交点H,AH和BH显然不可见EF:与窗口上边交点I,弃EI与窗口下边交点K,弃KF与窗口右边交点K,弃KJ保留IJCD:与窗口上边交点L,弃CL与窗口下边交点O,弃OD与窗口右边交点M,弃LM与窗口左边交点N,弃NO保留MN307.5.3编码算法特点对完全可见和显然不可见线段的快速判别适用二种场合大裁剪窗口裁剪窗口特别小(如,光标拾取图形时,光标看作小的裁剪窗口)裁剪窗口的拓展性可以延伸为凸多边形,但随着边数的增加,编码变复杂317.5.3编码算法应用:图形拾取定义:选择显示的图形元素操作:由光标位置确定方法:以光标位置为中心建立小矩形,判断图形被

1 / 63
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功