《—计算机图形学—》实验指导书王卫东别小川编写适用专业:计算机科学与技术江苏科技大学电子信息学院2006年7月1前言计算机图形学(ComputerGraphics)是研究怎样用数字计算机生成、处理和显示图形的一门学科。随着计算机图形学不断发展,它的应用范围也日趋广泛。计算机图形学课程目的及任务是着重介绍计算机图形学的基本内容及原理与方法。它是计算机专业选修课。课程的主要内容有计算机图形学的概论及应用,计算机用户接口和交互技术,计算机图形编程,二维图形扫描算法与几何变换,三维形体表示与投影变换,曲线与曲面造型技术,真实感图形等。为了使学生更好地理解和深刻地掌握图形的几何变换、光栅图形的表示及处理方法、三维形体表示等方面的知识。并在此基础上,训练和培养学生对基本图形系统的分析和设计能力,共设置了3项设计性实验,分别是图形的几何变换、区域填充、曲线及曲面表示。图形的几何变换要求学生掌握图形的平移、缩放、旋转等基本变换知识。区域填充要求学生了解并掌握光栅图形的表示方法,并实现种子算法或扫描线算法。曲线及曲面表示属于三维图形的造型技术。本指导书重点讲述了各实验的基本原理,并给出了详细的实验素材。实验主要针对计算机科学与技术专业,也可作为研究生的辅助实验指导。2目录实验一:图形的几何变换............................................................................................3实验二:图形的区域填充............................................................................................5实验三:曲线、曲面的生成......................................................................................7实验四:动画设计............................................................................................................12附录一、学生实验报告基本内容要求...........................................................133实验一:图形的几何变换实验学时:4学时实验类型:设计实验要求:必修一、实验目的二维图形的平移、缩放、旋转和投影变换(投影变换可在实验三中实现)等是最基本的图形变换,被广泛用于计算机图形学的各种应用程序中,本实验通过算法分析以及程序设计实验二维的图形变换,以了解变换实现的方法。如可能也可进行裁剪设计。二、实验内容掌握平移、缩放、旋转变换的基本原理,理解线段裁剪的算法原理,并通过程序设计实现上述变换。建议采用VC++实现OpenGL程序设计。三、实验原理、方法和手段1.图形的平移在屏幕上显示一个人或其它物体(如图1所示),用交互操作方式使其在屏幕上沿水平和垂直方向移动Tx和Ty,则有x’=x+Txy’=y+Ty其中:x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。其交互方式可先定义键值,然后操作功能键使其移动。2.图形的缩放在屏幕上显示一个帆船(使它生成在右下方),使其相对于屏幕坐标原点缩小s倍(即x方向和y方向均缩小s倍)。则有:x’=x*sy’=y*s注意:有时图形缩放并不一定相对于原点,而是事先确定一个参考位置。一般情况下,参考点在图形的左下角或中心。设参考点坐标为xf、yf则有变换公式x’=x*Sx+xf*(1-Sx)=xf+(x-xf)*Sxy’=y*Sy+yf*(1-Sy)=yf+(y-yf)*Sy式中的x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐4标。当Sx1和Sy1时为放大倍数,Sx1和Sy1时为缩小倍数(但Sx和Sy必须大于零)。3.图形的旋转在屏幕上显示一个汽车,根据自己确定的旋转角度和旋转中心对图形进行旋转。旋转公式为x’=xf+(x-xf)*cos(angle)-(y-yf)*sin(angle)y’=yf+(y-yf)*cos(angle)+(x-xf)*sin(angle)其中:xf,yf为围绕旋转的中心点的坐标。x,y为旋转前图形中某点的坐标,x’和y’为旋转后图形中该点的坐标。4.裁剪对一个三角形进行裁剪,裁剪后的图形应是一个封闭的图形。可采用线段裁剪法,其方法可用书上的线段相交求点的公式,确定可见线段予以保存,不在窗口的线段则应舍弃。图1四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。五、实验条件每人一台计算机独立完成实验。六、实验步骤(1)将图形显示在初始位置。(2)对图形各点按变换表达式作坐标变换,计算出各点变换后的相应点的坐标。(3)将原来的图形抹去。5(4)在新的位置显示图形。七、思考题采用中点分割算法完成图形的裁剪操作。八、实验报告实验报告主要包括实验预习、实验说明、程序代码、实验结果及分析等内容。实验二:图形的区域填充实验学时:4学时实验类型:设计实验要求:必修一、实验目的区域填充是指先将区域内的一点(常称为种子点)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。区域填充技术广泛应用于交互式图形、动画和美术画的计算机辅助制作中。本实验采用递归填充算法或扫描线算法实现对光栅图形的区域填充。通过本实验,可以掌握光栅图形编程的基本原理和方法。二、实验内容掌握光栅图形的表示方法,实现种子算法或扫描线算法。通过程序设计实现上述算法。建议采用VC++实现OpenGL程序设计。三、实验原理、方法和手段1.递归算法在要填充的区域内取一点(X,Y)的当前颜色记为oldcolor,用要填充的颜色newcolor去取代,递归函数如下:procedureflood-fill(X,Y,oldcolor,newcolor:integer);beginifgetpixel(framebuffer,x,y)=oldcolorthenbeginsetpixel(framebuffer,x,y,newcolor);flood-fill(X,Y+1,oldcolor,newcolor);6flood-fill(X,Y-1,oldcolor,newcolor);flood-fill(X-1,Y,oldcolor,newcolor);flood-fill(X+1,Y,oldcolor,newcolor);endend2.扫描线算法扫描线算法的效率明显高于递归算法,其算法的基本思想如下:(1)(初始化)将算法设置的堆栈置为空,将给定的种子点(x,y)压入堆栈。(2)(出栈)如果堆栈为空,算法结束;否则取栈顶元素(x,y)作为种子点。(3)(区段填充)从种子点(x,y)开始沿纵坐标为y的当前扫描线向左右两个方向逐个象素进行填色,其值置为newcolor,直到抵达边界为止。(4)(定范围)以xleft和xright分别表示在步骤3中填充的区段两端点的横坐标。(5)(进栈)分别在与当前扫描线相邻的上下两条扫描线上,确定位于区间[xleft,xright]内的给定区域的区段。如果这些区段内的象素的颜色值为newcolor或者boundarycolor(边界上象素的颜色值),则转到步骤2,否则取区段的右端点为种子压入堆栈,再转到步骤2继续执行。四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。五、实验条件每人一台计算机独立完成实验。六、实验步骤(1)将图形显示在初始位置。(2)给定种子点的坐标。(3)显示从种子点开始的扩散过程。(4)显示填充后的图形。七、思考题如何实现光栅图形的扫描转换?八、实验报告实验报告主要包括实验预习、实验说明、程序代码、实验结果及分析等内容。7实验三:曲线、曲面的生成实验学时:4学时实验类型:设计实验要求:必修一、实验目的利用Bezier,B样条或NuBer(非均匀有理B样条)曲线,生成图2茶壶,以加深对曲线曲面生成三维图形的原理,控制方法以及算法的实现(包括隐藏线,面的消除),要求生成的茶壶要光滑。二、实验内容掌握曲线、曲面的表示方法,实现茶壶的三维造型设计。通过程序设计实现上述算法。建议采用VC++实现OpenGL程序设计。三、实验原理、方法和手段采用三次Bezier曲线或其它函数曲线生成图2所示茶壶。利用三次Bezier曲线生成时,n=3,若写成向量或写成t的三次参数式为:其中:P0,P1,P2,P3是特征多边形上四个顶点(控制点)的向量。若将其分解为二维平面中x、y方向的分量,则332210***)(tAtAtAAtx332210***)(tBtBtBBty[0,1]t00010033036313311)(321023PPPPttttp[0,1]t00010033036313311)(321023xxxxttttx800xA101*3*3xxA2102*3*6*3xxxA32103*3*3xxxxA00yB101*3*3yyB2102*3*6*3yyyB32103*3*3yyyyB图2茶壶以下分析以下茶壶的绘制方法:可以假定壶体表面是一个旋转面,因此只要在x-y平面上找到用来生成旋转面的基本曲线就可以了。采用分段三次贝齐尔曲线,选十个控制点,它们的数据见表1(a),控制点位置与生成的曲线见图3a。这条曲线由三段组成,分别由点[1,2,3,4],[4,5,6,7],[7,8,9,10]控制。注意到4,7公用,且3,4,5在一直线上,6,7,8也在一直线上,因而可知三段曲线拼接后有一阶连续性。类似地,壶盖也视为旋转面,它的外轮廓由两段贝齐尔曲线生成,分别由[1,2,3,4]和[4,5,6,7]控制。由于3,4,5共线,4为公共点,故也有一阶连续性。这七个点的数据见表1(b),对应的轮廓线见图3b。旋转面的显示可给定拟合后外形线上的一点(x0,y0),绕y轴旋转得[0,1]t00010033036313311)(321023yyyytttty9Y=Y0平面上一个圆。若只作沿Z轴平行投影变换,即只去掉z分量,则它显示成一线段。一个避免这种现象的简便方法是将它们绕X轴适当旋转同一角度,然后再投影到x-y平面上显示。茶壶的壶嘴则要用贝齐尔曲面片来表示(也可以用曲线,但需插入控制点)。首先确定剖面的外轮廓线。这里有两条,每一条也由七个控制点控制,它们的数据见表1(c),外轮廓线见图3c,但是要注意现在要再增加二条线(每线也相应的有七个控制点),它们分别与两外轮廓线有相同的x、y坐标,只是z的坐标不再是零,而是有变化,这个变化的方式是:与11,12(21,22)相对应的=0.66:与13,14,15(23,24,25)对应的为z=0.25:与另二点对应的为z=0.15,这样壶嘴实际上由二片贝齐尔曲面片(每片十六个控制点)组成。例如其中一片上的四个控制点分别为(11x,11y,0),(11x,11y,0.66),(21x,21y,0.66),(21x,21y,0),其中11x,11y分别指第十一个控制点x,y坐标。对每一曲面片的显示,实际上可以显示八条曲线,或者适当加密。类似地处理壶的把手,唯一与壶嘴有别处是另外两线的z不随控制点不同而变,即取定值z=0.3。数据见表1(d)。外轮廓线图见3d,最后,壶底可以用半径为1.5的圆盘来表示,容易想象它应如何加入这一图形生成过程中。图2就是用这种方法画出的茶壶。表1(a)壶体控制点数据表1(b)壶盖控制点数据xy10.03.020.83.030.02.740.22.555