《计算机图形学》课程实验教学大纲编号:032004课程总学时:64实验学时:24课程总学分:3.5适用专业:计算机科学与技术,网络工程,软件工程,物联网工程一、本课程实验的主要目的与任务《计算机图形学》是计算机科学与技术专业本科教学中的一门重要的专业课。通过本课程的教学,帮助学生掌握计算机图形学的基础知识,了解该学科的前沿科技,并能运用图形软件包OpenGL,进行简单的图像处理软件代码设计。《计算机图形学》是一门理论性和应用性很强的课程。开设实验课程有助于加深学生对图形算法的理解,培养其分析问题,解决问题的能力。通过本课程实验要求学生基本达到如下要求:1.掌握OpenGL的基本语法与程序结构。2.掌握如何通过点、线、面、体的构造方法。3.掌握如何对三维物体增加光照和纹理来增强其真实感。4.掌握如何构建一个真实的三维场景的基本过程和实现方法。二、本课程实验应开设项目三、各实验项目主要实验内容和基本要求序号实验项目名称学时类型必做/选做所需主要设备型号、名称1基本图元绘制4验证性必做PC机及配套软件2曲线与曲面4验证性必做PC机及配套软件3体的表示与变换4验证性必做PC机及配套软件4光照与纹理6综合性必做PC机及配套软件各实验项目的主要内容和基本要求见附录。四、实验成绩考核与评定办法学生应做好实验准备,认真完成每个实验,按时完成并提交实验报告。任课教师应认真批改实验报告并给出实验报告成绩,并结合学生平时实验表现给出学生平时实验成绩。实验成绩由实验报告成绩、平时实验成绩两部分组成。其中实验报告成绩占50%、实验课堂成绩占50%。五、大纲说明大纲里所列项目是必做的,但是对于有能力的同学,希望能够把几个实验做到一个集成的可视化界面下。学生也可以根据自己的爱好,选择做一个小的系统,同样能够达到本实验大纲的目的。六、主要参考书目1.《计算机图形学(OpenGL版)(第3版)》,FrancisShill,Jr,StephenM.Kelley著,胡事民等译;清华大学出版社,2009.22.《交互式计算机图形学:基于OpenGL着色器的自顶向下方法(第六版)》,EdwardAngel著,张荣华等译;[M].电子工业出版社,2012.53.《计算机图形学(第三版)》,DonaldHearn,M.PaulineBaker著,蔡士杰等译;电子工业出版社,2011.24.《OpenGLProgrammingGuide:TheOfficialGuidetoLearningOpenGL,Version4.3(8thEdition)》,DaveShreiner,GrahamSellers,JohnM.KessenichandBillM.Licea-Kane著;Addison-WesleyProfessional.,2013.35.《OpenGLSuperBible:ComprehensiveTutorialandReference(6thEdition)》,GrahamSellers,RichardSWrightandNicholasHaemel;Addison-WesleyProfessional,2013.76.《ComputerGraphicswithOpenGL(4thEdition)》,DonaldHearn,M.paulineBaker著;PrenticeHall,2010.11撰写人:郭建林审定人:批准人:执行时间:实验1基本图元绘制(4学时)1.实验目的(1)了解OpenGL的基本的编程思想和程序结构。(2)了解OpenGL中绘制点、线、面的相关函数。(3)掌握如果通过定义空间点和构成方式来形成不同的空间物体。2.实验内容(1)熟悉实验环境。(2)利用相关直线绘制算法绘制一条直线,建议使用DDA算法或Bresenham算法。(3)绘制一个颜色插值的三角形面。(4)综合利用所学知识,绘制分形物体。给出原理,步骤,设计绘制方案。可自己选择分形物体的类型,如分形树、Koch雪花、Sierpinski三角形(二维或三维)、Julia集、Mandelbrot集等。3.实验要求(1)预习实验相关知识,了解实验目的与内容。(2)根据实验目的和内容,制定相关的实验方案并进行实施。(3)实验结束后,对相关内容进行总结和反思。4.实验器材(1)PC机及配套软件、一人一套。1.1.实验目的(1)掌握OpenGL程序的基本结构。(2)通过OpenGL实现直线的绘制,了解在OpenGL中如何实现一条简单的线段的绘制。(3)了解OpenGL中如何控制点、线的属性,包括颜色、宽度、线型等。(4)掌握如何绘制一个三角形并进行填充1.2.例程一个简单的创建一条直线的例程:#includestdafx.h#includestdlib.h#includeGL/glut.h//初始化函数,设置渲染环境voidSetupRC(void){glClearColor(0,0,0,0.0);//设置RGBA模式,背景颜色为黑色(没有执行,仅仅设置)glMatrixMode(GL_PROJECTION);glLoadIdentity();//把投影矩阵置为单位阵glOrtho(0.0,1024,0.0,768,0,1000);//定义世界坐标的裁剪窗口,也就是通常说的视口//我们定义的裁剪窗口大小//也就是在这个范围内的物体都将正投影到X0Y平面}//显示函数,要显示的代码都写在这里voidRenderScene(void){glClear(GL_COLOR_BUFFER_BIT);//1@清除颜色缓冲区。glBegin(GL_LINES);glColor4f(0.8,0.8,0,0.75);glVertex3f(0,0,0.0);glVertex3f(300,300,0.0);glEnd();glutSwapBuffers();//双缓冲区设置,交换缓冲区//双缓冲去允许你在一个屏幕之外的缓冲区中执行绘图代码,然后适用一条交换命令把你绘制的图形立即显示在屏幕上。//双缓冲两个用途:复杂图形需要绘制的时间很长,你并不希望在屏幕上看到显示图形合成的每个步骤。//使用双缓冲,用户绝对不会看到一副不完整的图像,图像只有在完全完成后才在屏幕上显示。//2@//glFlush();//所有未被执行的命令被执行单缓冲区需要强制执行一次glFlush(),进行一次刷新操作。//本设置显示函数中,glClear(GL_COLOR_BUFFER_BIT)//和glFlush()两个函数是必须的,其中间部分可以更改}//主函数,创建一个Windows窗口,并初始化其大小,标题,RGBA显示模式,以及事件句柄等。intmain(intargc,char**argv){glutInit(&argc,argv);//初始化GLUTglutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//设置显示模式位单缓存,RGB模式glutInitWindowSize(800,600);//设置窗口大小glutCreateWindow(LineDDAalgorithm!);//创建一个渲染窗口,并吧标题栏设置为相应字符串SetupRC();//窗口初始化glutDisplayFunc(RenderScene);//调用显示函数glutMainLoop();//必须添加的函数,用来维持显示图像显示过程的交互,而且必须作为最后调用的一个函数return0;}说明:该函数定义的裁剪窗口为1024×768,也就是说所有的在这个范围内的都将被显示在一个Windows窗口中,窗口大小初始化为800×600。我们初始化的窗口背景为黑色,直线颜色为黄色。1.3.实验请实现一个三角形。坐标和颜色分别如图所示:请设置其线条宽度为4(像素)。请设置A、B、C点的大小位10(20×20像素大小)颜色如图所示,AB红色,BC绿色,CA蓝色。参考代码:请修改其中一些实现上述图形.glBegin(GL_?);glColor4f(0.8,0.8,0,0.75);glVertex3f(100,200.0,10);//A点A(100,200,10)glColor4f(0,1,0,0.75);glVertex3f(400,500.0,10);//B(400,500,200)glColor4f(0,0,1,0.75);glVertex3f(600,220.0,10);//C(600,220,30)glEnd();实验2曲线与曲面(4学时)1.实验目的(1)掌握Bezier曲线和Hermite曲线的绘制方法。理解如何通过折线来近似一条曲线。(2)了解Bezier曲面和Hermite曲面的绘制方法。2.实验内容(1)绘制一条四阶Bezier曲线或者Hermite曲线。(2)要求控制点、控制多边形、Bezier曲线或Hermite曲线用不同颜色表示。(3)掌握如何控制点、线的属性。(4)要求有能力的同学能够实现Bezier曲面或者Hermite曲面。(5)了解Utah茶壶的Bezier曲面构造方法。3.实验要求B(400,500,200)C(600,220,30)A(100,200,10)(1)预习实验相关知识,了解实验目的与内容。(2)根据实验目的和内容,制定相关的实验方案并进行实施。(3)实验结束后,对相关内容进行总结和反思。4.实验器材(1)PC机及配套软件、一人一套。1.4.实验目的(1)掌握Bezier曲线的基础知识。(2)编程实现绘制4个控制点的Bezier曲线。(3)用不同的颜色表示出控制点、控制多边形和Bezier曲线本身(4)思考如何实现鼠标交互的控制Bezier曲线的形状(5)观察改变控制点如何改变Bezier曲线的形状1.5.例程如下代码实现教材3-2习题所示的Bezier样条://Bezier.cpp:Definestheentrypointfortheconsoleapplication.//#includestdafx.h#includecmath#includeiostream#includecstdlib#includegl/glut.husingnamespacestd;classVector3D{public:floatx,y,z;Vector3D(floatvx,floatvy,floatvz){this-x=vx;this-y=vy;this-z=vz;};Vector3D(){};};classBezier{public:floatx,y,z;floatBernstain(floatt,inti){if(i==0)return(1-t)*(1-t)*(1-t);if(i==1)return3*t*(1-t)*(1-t);if(i==2)return3*t*t*(1-t);if(i==3)returnt*t*t;};Vector3DBezierSpline(Vector3DP0,Vector3DP1,Vector3DP2,Vector3DP3,floatt){Vector3Dv3d;v3d.x=P0.x*Bernstain(t,0)+P1.x*Bernstain(t,1)+P2.x*Bernstain(t,2)+P3.x*Bernstain(t,3);v3d.y=P0.y*Bernstain(t,0)+P1.y*Bernstain(t,1)+P2.y*Bernstain(t,2)+P3.y*Bernstain(t,3);v3d.z=P0.y*Bernstain(t,0)+P1.z*Bernstain(t,1)+P2.z*Bernstain(t,2)+P3.z*Bernstain(t,3);returnv3d;};};//初始化函数,设置渲染环境voidSetupRC(void){glClearColor(0,0,0,0.0);//设置RGBA模式,背景颜色为黑色(没有执行,仅仅设置)glMatrixMode(GL_PROJECTION);glLoadIdentity