计算机图形学OpenGL(第三版)教案_第1页
计算机图形学OpenGL(第三版)教案_第2页
计算机图形学OpenGL(第三版)教案_第3页
计算机图形学OpenGL(第三版)教案_第4页
计算机图形学OpenGL(第三版)教案_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机图形学教案2 2016年3月22日目录1. 个人授课守则2. 课程概貌3. 课程教学总体目标与要求4. 课程教学方式总体设计5. 课程板书总体设计6. 主页面板书设计7. 课程教学进度安排8. 课时备课教案8.1 第1次课8.2 第2次课8.3 第3次课8.4 第4次课8.5 第5次课8.6 第6次课8.7 第7次课8.8 第8次课8.9 第9次课8.10 第10次课8.11 第11次课8.12 第12次课9. 课程综合性实验设计10. 英语参考词11. 平时考勤与成绩记载汇总表本科课程:计算机图形学武汉理工大学 陆济湘 2015计算机图形学教案陆济湘 2015年12月 第三版1 个人授

2、课守则为人师表 身体力行 做阳光下纯净的代表,做黑夜中引路的烛光,布局平凡,杜绝市侩,求真求新,坦然一生。 不求大富大贵,大红大紫,惟求平安康健,无愧我心。授业传道 教书育人 给学生一方无污的净土,一片创意的天空,一座智慧的树林,一泓真理的泉水,一把求知的钥匙。 不但授人以鱼,更应授人以渔,还应授人以海。答疑解惑 恪尽职守 课堂知识讲解力求做到复杂问题简单化,抽象问题形象化,枯燥问题生动化,切实帮助学生理解课程知识。 力争深入浅出,决不故弄玄虚以示深奥。2 课程概貌课程名称计算机图形学课程学时48课程学分课程类型专业选修课授课方式课堂讲授+实验考核方式闭卷考试授课专业数学jd1301,信计13

3、01-02授课班级授课教师陆济湘学时分配讲课40学时上机辅导8学时起止周数1-10周学生班长课程教材计算机图形学(OpenGL)第三版教材主编出版单位清华大学出版社课堂讲授章节第一章 计算机图形学概述第二章OpenGL绘制入门第三章 绘图工具第四章 向量工具第五章 物体变换第六章 网格建模第七章 三维观察第八章 几何体真实感渲染第九章 光栅显示工具第十章 曲线和曲面设计第十一章 颜色理论第十二章 光线跟踪自学或在课程设计讲述章节课程重点章节课程难点章节主要参考书目3 课程教学总体目标与要求3.1 课程教学总体目标本书以两条主线贯穿其中,一条是向读者介绍基本的计算机图形学理论知识,另一条是在介绍

4、图形学理论知识的同时,向读者条理清晰地说明怎样用OpenGL命令来实现计算机图形的基本要素。这种互为补充的安排能使读者更容易理解相应的理论和编程。在介绍计算机图形学理论时,本书着重于实践性强、实用性广的理论,让读者能够在理解理论知识的同时用OpenGL编写实用的应用程序,而不是让读者去实现诸如OpenGL一类的底层图形库,这是有别于其他计算机图形学教程的特点之一。因此,本书采用理论与实践相结合的方式讲解计算机图形学理论和OpenGL图形编程实践,通过将二者有机地融合在一起,使读者既掌握了计算机图形学理论知识,又掌握了编程实践理论的方法。这也是本书的一个重要目标:使读者在OpenGL编程时不再感

5、到“孤立”,相互融合讲解的计算机图形学理论和OpenGL编程方法一起指导读者编写出更强大、更有效的应用程序。3.2 课程教学要求本书所讲内容是进行计算机图形学应用编程(如游戏编程等) 的基础,实用性强而又容易理解,它们都是经过精心选择的。书中包括大量的OpenGL编程示例和效果图,所选实例具有很强的代表性,程序代码全部采用C语言编写,并且全部在Visual C+6.0环境下调试通过,便于读者对计算机图形学理论和OpenGL编程概念的理解。本书只要求读者有一定的C语言基础和数学知识,适合作为相关专业计算机图形学的教材或辅助教材,还可以作为OpenGL编程以及计算机游戏编程等培训班的理想教材,对那

6、些对OpenGL编程和计算机图形学感兴趣的读者来说是一本不可多得的详尽的参考用书。4 课程教学方式总体设计4.1课程教学改革重点 通过全面分析课程教学内容,针对本课程涉及面广,实践性强的主要特点,结合当前学生实践环节薄弱、概念不强等教学难点,应将教学改革重点放在丰富教学方式上。4.2 首次课注意点 首次课对强化学生的课程学习兴趣与学习信心十分关键,需交待清楚课程特点、教纲、考核方式、课堂要求、实验等教学概况,用温和平稳的过度方式引导学生走进课堂。4.3 设计教学切入点 找准各章节教学切入点,随堂结合各章节讲述内容中存在瓶颈问题和突破方向,补充教学内容,选择恰当的教学手段实现教材与课堂讲授间的无

7、缝链接,促进学生主动学习。4.4 课堂教学方式设计4.4.1 启发式教学为主,实例式教学为辅。 力求生动讲述,做到复杂问题简单化,抽象问题形象化,枯燥问题生动化,深入浅出,不故弄玄虚以示深奥。结合工程实例,采用讨论方式将有关概念以有趣的提问引出,调动学生思维积极性,营造活跃互动的课堂氛围,提高学生的学习兴趣与学习信心。4.4.2主次分明,详略得当。 重点与难点章节只是点辅以多种教学手段详讲、讲透;次重点章节知识点讲清楚;一般内容章节教学重心为引导学生读懂教材相关知识点。4.4.3语言生动、力求讲授个性化。 采用PowerPoint2007上课,注意以讲为主,切忌将讲课变成“念课”。讲授时力求语

8、言生动,用词得当。4.5 课件设计原则4.5.1原创性原则 应根据开课任务不同的学时分配和不同的学生类型及特点,针对性设计课件,并随教学过程出项的问题反馈及时修改课件,加之本课程可选课件资源几乎为零,故本课程课件必须原创。4.5.2系统性原则 课件应完整放映课程讲授体系,体现面向对象语言基本理论和相关概念应有的严谨性和系统性,突出和统一正在讲授的章节标识,保留每节内容2级以上标题,便于学生笔记。4.5.3 类板书原则 课件应按传统黑板板书方式设计,姑且称为“电子黑板”。页面上切不可堆砌大量文字段落,仅丰富图片、绘图等传统黑板不好表达的多媒体信息即可。4.5.4 动画性原则 课件文字按最接近手写

9、的方式动画,绘图过程、分段制造过程等内容按步骤动画解决传统教学中绘图、建造工艺过程表述抽象、学生难以理解等教学瓶颈问题,帮助学生较好的理解讲授内容。4.5.5美观性原则 精心设计,力求美观与实用完美结合。课件整体风格统一,制作精美,从细节上体现讲授者的严谨学风,潜移默化的言传身教。4.6 课程资源建设 原创设计课程学习网站,设立电子黑板、全程教学录像等丰富的网络教学资源,有效帮助学生拓展学习空间,便于课后复习巩固。 5 课程板书总体设计5.1设计课程导航页首页设课程导航页,总览全课程内容。5.2设计章首页 每章设一开始页面,明确本章内容。5.3设计节首页每节设一开始页面,明确本节内容。5.4主

10、页面分区设计主页面分标题、侧边、主内容三区。5.5设计节内容每节设具体实例页面,加深本节印象。5.6设计章末页每章设一结束页面,布置学生任务6 主页面板书设计6.1主页面分区 页面主要分为章节标题区、主内容区、侧边前内容目录区三大部分。6.2页面布局 主页面内图片文字等布局匀称。6.3页面背景 全课程页面背景一致,避免杂乱。统一选用深蓝色背景,以反突出文字和图片等前端内容。6.4侧边目录区侧边前述内容目录区记录本页前面所述节的一、二、三级标题,以方便学生温习或补课堂笔记。6.5页面主文字色彩及大小文字色彩明亮,大小适中,风格统一。章节标题金黄色,黑体,36号字;一级标题白色,黑体,24号字;二

11、级标题及正文白色,黑体,字号视页面布局在选择2024号字间选择,不宜再小,以方便后排学生笔记。6.6关键词和英文单词用与主文字不同的颜色标明关键词和英文单词。7 课程教学进程安排教学周一二三四五六七八九十十一十二十三学时数4444444646466进程线道图第一章第四章第七章第二章第八章第三章第五章第六章第十一章图例一般章节重点章节次重点章节科 目计算机图形学总学时讲课实践专业班数学jd1301,信计1301-0248408周次课次授课内容学时实验、习题、大作业内容学时一计算机图形学概述 21、vc6.0安装,建立控制台工程,OpenGL库配置,运行简单OpenGL程序2一计算机图形学控制台应

12、用程序创建,OpenGL库配置,简单程序讲解2二三OpenGL绘图入门,窗口编程和窗口绘图,OpenGL基本图形元素函数4三四OpenGL中的直线绘制,OpenGL与鼠标和键盘的交互,绘制Sierpinski垫片,绘制函数曲线42、绘制Sierpinski垫片,绘制函数曲线和参数曲线2五六世界窗口和视口,裁剪线算法,正多边形、圆和圆弧的绘制,参数曲线的绘制6七八图形学中的向量工具,点积,叉积,重要几何对象的表示,求两个线段的交点,直线和平面求交及裁剪,多边形求交问题6九十物体几何变换初步,三维仿射变换,坐标系变换63 绘制逻辑图和混沌的模拟,实现Cohen-Sutherland裁剪算法2十一十

13、二在程序中使用仿射变换,使用OpenGL绘制三维场景6十三多边形实体网格建模,多面体和拉伸形体44 利用三维仿射变换绘制三维场景28 课时备课教案第1次课时间地点授课章节第1章 绪论§ 1.1什么是计算机图形学 § 1.2计算机图形学的应用§ 1.3计算机生成图像的方法 § 1.4常用的图形显示设备§ 1.5交互设备授课方式课堂讲授教学时数4注意事项教学目标使学生了解课程特点、教纲、考核方式、课堂要求、实验等教学概况,初步理解和掌握计算机图形学发展进程以及注意事项。教学重点1. 计算机生成图像的方法2. 计算机图形学开发过程教学难点教学设计1.

14、 本次课为首次课,对强化学生的课程学习兴趣与学习信心十分关键,应交待清楚本课程特点、教纲、考核方式、课堂要求、实验、教学资源等课堂教学概况,以认识几个新学生的温和点名方式过渡,引导学生走进课程。2. 从现实生活出发,充分让学生了解面向对象的思想。3. 补充计算机图形学基本概念和背景知识,以实例计算机图形学研究内容和研究方法,并以此为切入点导出程序开发流程。4. 结合工程实际,采用典型案例说明当前开发模式的设计思路和应用侧重点不同所衍生的不同开发模式,启发学生多方位思维,激发创新意识。5. 详讲计算机图形学基本概念、特点以及相关内容。教学切入从计算机程序设计语言的发展以及面向对象方法入手,帮助学

15、生认识和理解面向对象的思想。拓展内容1. 计算机图形学基本概念2. 计算机图形学背景3. 计算机图形学开发实例教学内容教具使用PPT课件课堂练习课后思考与习题课堂反馈随堂记录第2次课时间地点授课章节第二章vc opengl 编程指导例子§ 2.1编写图形程序 § 2.2学习OpenGL程序的基本组成授课方式课堂讲授教学时数6注意事项教学目标 本章让学生开始编写图形程序,包括用OpenGL编程和开发几个完整曲线绘制程序(包括矛名的Sierpinski垫圈). 本章讨论了用OpeoGL 绘制基本元素(如折线和多边形)的方法和如何在程序中交互地使用鼠标和键盘。最后的实例分析会给一

16、些有趣的编段题目。它们能让学生对如何编写图形程序有更加清晰的感觉。其中的一个典型实例分析是建立一个用子初始化OpenGL和打开一个OpenGL绘制窗口的类。教学重点1.如何在程序中交互地使用鼠标和键盘2.开发几个完整曲线绘制程序教学难点如何在程序中交互地使用鼠标和键盘教学设计教学切入从C+基本概述入手,一步一步加深对C+的了解。拓展内容教学内容§ 2.1 生成图像初步 通过练习(编写和测试各种不同图形的程序)可以很快掌握计算机图形学。先从简单的任务开始,一旦掌握,就试着变变花样,看看有哪些变化,试着进一步绘制更复杂的场景。最好的学习办法是认真、仔细地学习每行代码或等式。当你这么做时,

17、就能理解每个新概念。每个图形程序都以一些初始化工作为开始,由此建立程序所需要的显示模型和坐标系。 下面是使用GLUT库,名为myMouse的回调函数例子,它方便地注册了与鼠标关联的事件:glutMouseFunc(myMouse);glutMouseFunc是GLUT库的固有函数,但是回调函数myMouse是程序员定义的,并由程序员编写代码,处理每个可能感兴趣的鼠标动作。 4种主要的OpenGL库:1)基本GL库,OpenGL库的基础。它提供OpenGL的基本函数。每个OpenGL函数都以字符GL开头。2)GLUT库:GL实用工具包。它用来打开窗口,开发和管理菜单,以及管理事件等。3)GLU库

18、:GL实用库,它提供高级例程,处理矩阵操作和绘制二次曲面如球和圆柱体;4)GLUI库:用户接口库,提供控制工具和菜单。glutDisplayFunc(myDisplay):重绘窗口调用myDisplay回调函数;glutReshapeFun(myReshape):对屏幕窗口的形状进行调整;void main()glutDisplayFunc(myDisplay); / 注册重绘函数glutReshapeFunc(myReshape); / 注册改变窗口形状函数glutMouseFunc(myMouse); / 注册鼠标动作函数glutMotionFunc(myMouse); / 注册鼠标移动函

19、数glutKeyboardFunc(myKeyboard); / 注册键盘动作函数/可能初始化其他工作glutMainLoop(); / 进入主循环等待事件发生void main(int argc, char* argv)glutInit(&argc, argv); / 初始化工具包glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); / 设置显示模式glutInitWindowSize(640,480); / 设置窗口大小glutInitWindowPosition(100, 150); / 设置窗口在屏幕上的位置glutCreateWindow(

20、"my first attempt"); / 打开屏幕窗口/ 注册回调函数glutDisplayFunc(myDisplay);glutReshapeFunc(myReshape);glutMouseFunc(myMouse);glutKeyboardFunc(myKeyboard);myInit(); / 必要的其他初始化工作glutMainLoop(); / 进入循环§ 2.2OpenGL的基本图形元素绘制三个点:glBegin(GL_POINTS);glVertex2i(100, 50);glVertex2i(100, 130);glVertex2i(150

21、, 130);glEnd();或者用浮点值代替整数值:glBegin(GL_POINTS);glVertex2d(100.0, 50.0);glVertex2d(100.0, 130.0);glVertex2d(150.0, 130.0);glEnd();2.2.2 Sierpinski(塞平斯基)垫片/初始值P(0),在for循环外面GLintPoint point = Tindex; / 初始值drawDot(point.x, point.y); / 画初始点for(int i = 0; i < 1000; i+) /画1000点index = rand()%3;/P(k)=(P(k

22、-1)+T)/2point.x = (point.x + Tindex.x) / 2;point.y = (point.y + Tindex.y) / 2;drawDot(point.x,point.y);教具使用PPT课件课堂练习课后思考与习题复习第二章,预习第三章思考:2-12-17、2-21、2-22、 2-252-27上机题:2-19、2-20、2-28、2-30、2-31、2-33实验二课堂反馈随堂记录第3次课时间地点授课章节第二章vc opengl 编程指导例子§ 2.3开发绘制点、直线、折线和多边形的基本图形工具§ 2.4学会用鼠标和键盘控制程序授课方式课堂讲

23、授教学时数6注意事项教学目标 本章让学生开始编写图形程序,包括用OpenGL编程和开发几个完整曲线绘制程序(包括矛名的Sierpinski垫圈). 本章讨论了用OpeoGL 绘制基本元素(如折线和多边形)的方法和如何在程序中交互地使用鼠标和键盘。最后的实例分析会给一些有趣的编段题目。它们能让学生对如何编写图形程序有更加清晰的感觉。其中的一个典型实例分析是建立一个用子初始化OpenGL和打开一个OpenGL绘制窗口的类。教学重点1.如何在程序中交互地使用鼠标和键盘2.开发几个完整曲线绘制程序教学难点如何在程序中交互地使用鼠标和键盘教学设计教学切入从C+基本概述入手,一步一步加深对C+的了解。拓展

24、内容教学内容§ 2.3 penGL中的直线绘制绘制线段glBegin(GL_LINES); / use constant GL_LINES here glVertex2i(40, 100); glVertex2i(202, 96);glEnd();或者编写一个函数void drawLineInt(GLint x1, GLint y1, GLint x2, GLint y2)glBegin(GL_LINES);glVertex2i(x1, y1);glVertex2i(x2, y2);glEnd(); 2.3.1 绘制折线和多边形折线就是一系列头尾相连的线段的集合,也称为线带。glBe

25、gin(GL_LINE_STRIP); / draw an open polyline glVertex2i(20,10); glVertex2i(50,10); glVertex2i(20,80); glVertex2i(50,80);glEnd();glFlush();绘制多边形,只需要用GL_LINE_LOOP替换GL_LINE_STRIP 即可,即是闭合的。f(x) = 300 - 100 cos(2p x/100) + 30 cos(4p x/100) + 6 cos(6p x/100)< Calculate constants A, B, C and D for scalin

26、g and shifting>glBegin(GL_LINE_STRIP);for(x = 0; x <= 300; x += 3)glVertex2d(A * x + B, C * f(x) + D);glEnd();glFlush;moveTo和lineTo函数实现为: GLintPoint CP; / 全局位置变量/<<<<<<<<<<<<< moveto >>>>>>>>>>>>>>void moveto(GLin

27、t x, GLint y)CP.x = x; CP.y = y; / 更新CP/<<<<<<<<<<<< lineTo >>>>>>>>>>>>>>>>>void lineto(GLint x, GLint y)glBegin(GL_LINES); / 绘制曲线glVertex2i(CP.x, CP.y);glVertex2i(x, y);glEnd();glFlush();CP.x = x; CP.y = y; / 更新

28、 CP § 2.4与鼠标和键盘的交互当用户按下或释放鼠标按钮、移动鼠标或者松开或按下键盘时,就会产生一个相关事件。程序员可以用每类事件注册一个回调函数 glutMouseFunc(myMouse) :利用按下或者鼠标按钮时发生事件来注册 myMouse() · glutMotionFunc(myMovedMouse) 利用鼠标移动注册函数 myMovedMouse() glutKeyboardFunc(myKeyboard) 利用按下或者松开键盘按键时注册函数 myKeyBoard() 2.4.1 用鼠标交互注册一个函数到glutMouseFunc(myMouse),myM

29、ouse()的名字可以任意,有四个参数:void myMouse(int button, int state, int x, int y);button的值如下:GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, 或 GLUT_RIGHT_BUTTON;而state的值可能为:GLUT_UP 或GLUT_DOWN。x和y为事件发生时鼠标的位置。 用鼠标绘制点当用户每次按下鼠标时,就会在屏幕窗口上鼠标所在的位置绘制出一个点。由于鼠标位置的y值是距离屏幕顶端的像素值,故不在(x, y), 而是在 (x,screenHeight y)上绘制,其中screenHeight 为屏

30、幕的高度。void myMouse(int button, int state, int x, int y)if(button = GLUT_LEFT_BUTTON && state = GLUT_DOWN)drawDot(x, screenHeight -y);else if(button = GLUT_RIGHT_BUTTON && state = GLUT_DOWN)exit(-1); 2.4.2 用鼠标指定一个矩形想让用户画尺寸大小由鼠标输入的长方形。用户在两个点上单击鼠标,指定边校正矩形的两个角点,就可以画出矩形。用户右键点击鼠标即可清屏。/ 使用鼠标

31、指定一个矩形static GLintPoint corner2;static int numCorners = 0; / initial value is 0if(button = GLUT_LEFT_BUTTON && state = GLUT_DOWN)cornernumCorners.x = x;cornernumCorners.y = screenHeight - y; / flip y coordinatenumCorners+; / have another pointif(numCorners = 2)glRecti(corner0.x, corner0.y, c

32、orner1.x, corner1.y);numCorners = 0; / back to 0 cornerselse if(button = GLUT_RIGHT_BUTTON && state = GLUT_DOWN)glClear(GL_COLOR_BUFFER_BIT); / clear the windowglFlush();2.4.3 用鼠标控制Sierpinski垫片使用户用鼠标指定初始三角形的三个顶点,并置于数组corners中,代码为static GLintPoint corners3;static int numCorners = 0;if(button

33、= GLUT_LEFT_BUTTON && state = GLUT_DOWN)cornernumCorners.x = x;cornernumCorners.y = screenHeight - y; / flip y coordinateif(+numCorners = 3) Sierpinski(corners); / draw the gasketnumCorners = 0; / back to 0 corners 鼠标移动鼠标移动会产生一个鼠标事件:glutMotionFunc(myMovedMouse);注册函数myMovedMouse(int x, int y)

34、;有两个参数,即事件发生时鼠标所在的位置。glutPassiveMotionFunc(myPassiveMotion);这个函数是没有按下鼠标按钮的情况下,鼠标在窗口内移动时调用。该函数可以绘制并显示橡皮矩形:随着用户移动鼠标,矩形将相应地变大或变小。下面的程序是用户单击鼠标建立矩形的一个角点,然后不按下鼠标时移动鼠标,调用myPassiveMotion(int x, int y),这决定了矩形的第二个角点。glutPostRedisplay()调用myDisplay()函数。 代码见见计算机图形学课件2016计算机图形学(Opengl版第三版)书源代码word版2.2.1-threeDots

35、.doc2.4.4 键盘交互按下键盘上的某个按键时就会产生一个键盘事件,并放入消息队列。回调函数myKeyboard()通过glutKeyboardFunc(myKeyboard)来注册这种事件,该函数的原型为:void myKeyboard(unsigned int key, int x, int y); key 值就是键的ASCII 值, x 和y为鼠标所在的位置。实例代码为:void myKeyboard(unsigned char theKey, int mouseX, int mouseY)GLint x = mouseX;GLint y = screenHeight - mouse

36、Y; / 反转y的值switch(theKey)case p:drawDot(x, y); / draw a dot at the mouse positionbreak;case GLUT_KEY_LEFT: List+last.x = x; / add a pointList last.y = y;break;case E:exit(-1); /terminate the programdefault:break; / do nothing教具使用PPT课件课后思考与习题复习第二章,预习第三章思考:2-12-17、2-21、2-22、 2-252-27上机题:2-19、2-20、2-28、

37、2-30、2-31、2-33实验二课堂反馈随堂记录第4次课时间地点授课章节第3章 更多的绘图工具§ 3.1介绍视口和裁剪 § 3.2开发选择窗口和视口的方法,以达到最佳视觉效果§ 3.3描述参数定义的曲线,并理解它们的绘制技术§ 3.4创建世界坐标系中绘图的工具授课方式课堂讲授教学时数4注意事项教学目标 本章主要讲解窗口到视口变换的主要思想,以及在显示器上放图片和确定图片大小的方法。具体讨论了以下内容:如何自我管理程序窗口和视口,而把细节留给OpenGL 处理的方法。编放、摇动镜头等有趣的效果和简单的图像动画;复杂的基于多边形的图像、园和弧的绘制:二维扣

38、三维曲线的参数化表示方法。教学重点开发选择窗口和视口的方法,以达到最佳视觉效果教学难点开发选择窗口和视口的方法,以达到最佳视觉效果教学设计1. 简单回顾上次课程的内容,复述上次课程结尾处内容,加深学生对上次课的印象,无缝过渡到本次课程。2. 通过对函数的定义,函数声明语法规则逐步了解函数的结构类型。3. 编写简单函数实例,以实例引导学生掌握函数的声明及调用。4. 接着讲述各种函数调用形式。让学生充分接受新知识。教学切入先通过讲述函数的声明和调用规则列举实例,然后解构函数,从实例中学习函数的用法,以此为切入点讲清OpenGL函数的使用,引导学生由点及面,举一反三。拓展内容OpenGL函数的各种调

39、用方法教学内容§ 3.1概述屏幕坐标系:x方向从0到screenWidth-1,y方向从0到screenHeight-1,它是设备坐标系,有一个视口。世界坐标系:笛卡尔坐标系,逻辑坐标系。§ 3.2世界窗口和视口信号处理中非常重要的函数sinc,它的定义为:当x!=0,且sin(0)=1要绘制的曲线如图,比如限定x在-4到4变化,使用 setWindow()来建立世界窗口,使用setViewport()来建立视口。通过设置一个世界窗口和一个视口,并建立它们之间的一个合适的映射,可以完成适当的缩放和平移。窗口是在世界坐标系,而视口是屏幕坐标系。绘制sinc的代码见计算机图形学

40、课件2016计算机图形学(Opengl版第三版)书源代码word版第三章代码.doc设立窗口到视口的映射 OpenGL使得窗口到视口的变换很容易。OpenGL通过一系列变换完成所需要的映射,自动传送到每个顶点,它还自动裁剪掉对象在世界窗口之外的部分。对于二维绘图来说,世界窗口由函数gluOrtho2D( )设定,它的原型是:void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); 即左右下上 视口的设定通过glViewport()函数,它的原型是:void glViewport(GLint x,

41、 GLint y, GLint width, GLint height); 相当于设置左下角(x, y) 和右上角(x + width, y + height). 即左下角和宽高。我们用setWindow()函数设置窗口,用setViewport()函数设置视口;/- setWindow - 即窗口的左右下上void setWindow(float left, float right, float bottom, float top)glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(left, right, bottom, top)

42、;/- setViewport -即视口的左右下上void setViewport(float left, float right, float bottom, float top)glViewport(left, bottom, right left, top - bottom);例子3.2.2 sinc函数回顾/- setWindow -void setWindow(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top) glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho

43、2D(left, right, bottom, top);/- setViewport -void setViewport(GLint left, GLint right, GLint bottom, GLint top)/ define our own function to specify the viewport, as explained later glViewport(left, bottom, right - left, top - bottom);void myDisplay(void) / plot the sinc function, using world coordin

44、ates glClear( GL_COLOR_BUFFER_BIT ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glBegin(GL_LINE_STRIP); for( GLfloat x = -4.0; x < 4.0; x += 0.1) / draw the plot glVertex2f(x, sin(pi * x) / (pi * x); glEnd(); glFlush();在main函数中调用如下: setWindow(-5.0, 5.0, -0.3, 1.0); setViewport(0, 640, 0, 480);

45、§ 3.3 裁剪线3.3.2 Cohen-Sutherland裁剪算法 没有平凡接受或平凡拒绝时的截断 Cohen-Sutherland算法使用一个分治的策略。如果线段不是被平凡接受和平凡拒绝,则它会被窗口的某一个边界分成两个部分。其中一个部分在窗口之外,这部分会被丢掉。另一部分有被看到的潜在可能性,因此整个过程将对四个窗口边界的下一个重复进行,采用下面的策略: do 形成 p1,p2的码字; if (平凡接受) return 1; if (平凡拒绝) return 0; 将线段在下一个窗口边界处截断;舍去在外面的部分; while(1); 这个算法最多四次循环就会终止。只保留线段在

46、先前窗口边界测试中幸存的部分,只有四个这样的边界。如右图,点P1的坐标需要重新计算。它的x坐标是W.right,即窗口的右边界,它的y坐标需要用图中d的值调整到P1.y得到。e =p1.x- W.right delx = p2.x - p1.x; dely = p2.y - p1.y;故可确定d,就可以得到新的P1.y: p1.y += (W.right - p1.x) * dely / delx 只有当线段平行边界线时,delx才为0,而此时线段位于窗口之外,故这种情况在没有平凡接受或平凡拒绝时的截断出现。教具使用PPT课件课后思考与习题复习第三章 3-2, 3-8, 3-11课堂反馈随堂记

47、录第5次课时间地点授课章节第3章 更多的绘图工具§ 3.3裁剪§ 3.4创建世界坐标系中绘图的工具授课方式课堂讲授教学时数4注意事项教学目标 本章主要讲解窗口到视口变换的主要思想,以及在显示器上放图片和确定图片大小的方法。具体讨论了以下内容:如何自我管理程序窗口和视口,而把细节留给OpenGL 处理的方法。编放、摇动镜头等有趣的效果和简单的图像动画;复杂的基于多边形的图像、园和弧的绘制:二维扣三维曲线的参数化表示方法。教学重点开发选择窗口和视口的方法,以达到最佳视觉效果教学难点开发选择窗口和视口的方法,以达到最佳视觉效果教学设计5. 简单回顾上次课程的内容,复述上次课程结尾

48、处内容,加深学生对上次课的印象,无缝过渡到本次课程。6. 通过对函数的定义,函数声明语法规则逐步了解函数的结构类型。7. 编写简单函数实例,以实例引导学生掌握函数的声明及调用。8. 接着讲述各种函数调用形式。让学生充分接受新知识。教学切入先通过讲述函数的声明和调用规则列举实例,然后解构函数,从实例中学习函数的用法,以此为切入点讲清OpenGL函数的使用,引导学生由点及面,举一反三。拓展内容OpenGL函数的各种调用方法教学内容§ 3.3 裁剪线3.3.3 开发Canvas类在世界坐标系工作是有意义的,基本形体裁剪和映射从世界窗口到视窗口。但是这种转换需要适当地管理。有许多交互要素(点

49、,矩形,映射等),我们应当封装它们并限制程序员访问它们避免细小的错误。我们应当确保不同部分能适当地初始化。使用类。我们开发了一个Canvas类,它提供了一个方便的绘制画布可以绘制线段,多边形等。它提供了一个简单的方法来创建需要的屏幕窗口,并创建一个世界窗口和视口,它确保世界窗口能较好地映射到视口。它也提供了moveTo()和LineTo()函数,许多程序员找到了合适的代码,如“龟形”图形。有许多方式来定义Canvas类:我们使用OpenGL,利用所有的OpenGL方法。但在案例3.4我们描述了一个完全不同的实现方法,我们提供了很多的工具。尤其是实现了Cohen Sutherland裁剪器。3.

50、3.4 一些有用的支持类在Canvas和其他类中提供一些共有的数据类型是方便的。我们定义了5个类。提供了构造函数和其他函数处理每一种类型的对象。一些类提供了绘制函数使得它容易绘制类的实例。一些方法在类声明时就实现,其他的方法在练习中要求实现。类Point2: 一个实数坐标系的点类A class Point2public: Point2() x = y = 0.0f; / constructor1 Point2(float xx, float yy) x = xx; y = yy; / constructor2 void set(float xx, float yy) x = xx; y = yy; float getX() return x; float getY() return y; void draw(void) glBegin(GL_POINTS); / draw this point glVertex2f(Glfloat)x, (Glf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论