计算机图形学课程设计报告_第1页
计算机图形学课程设计报告_第2页
计算机图形学课程设计报告_第3页
计算机图形学课程设计报告_第4页
计算机图形学课程设计报告_第5页
已阅读5页,还剩18页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

计算机图形学课程设计报告组 号:第 七 组小组成员:宋 洁邵 海 军谷 文 海冯 新 科学 院:资源环境学院专业班级:地 科 14- 2指导老师:向 中 林2016.12.18目录1 实习目的 .12 课程设计题目 .12.1 题目要求及内容 .12.1.1 要求 .12.1.2 内容分析 .22.2 实习原理 .22.2.1 人机交互 .22.2.2 动画 .52.2.3 几何变换 .52.2.3.1 二维几何图形变换 .52.2.3.2 三维几何图形变换: .63 主要流程图 .83.1 三维图形处理流程图 .83.2 二维几何画板流程图 .94 主要源程序 .94.1 主要源程序 .94.2.1 键盘事件函数 .114.2.2 菜单 .124.2.2.1 创建菜单函数 .124.2.2.2 光照函数 .144.2.2.3 几何变换事件 .164.2.2.3.1 旋转事件 .164.2.2.3.2 移动事件 .174.2.2.3.3 放大事件 .184.2.2.3.4 缩小事件 .195 问题讨论 .1911 实习目的课程设计是信息与计算科学专业集中实践性环节之一,是学习完计算机图形学课程后进行的一次全面的综合练习。其目的是:(1)要达到理论与实际应用相结合,使学生能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养良好的程序设计技能。 (2)在实践中认识为什么要学习数据结构,掌握数据结构、程序设计语言、程序设计技术之间的关系,是前面所学知识的综合和回顾。 要求 (1)了解并掌握交互式图形系统的设计方法,具备初步的独立分析和设计能力; (2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能;(4)训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;(5)培养学生团结协作,共同完成相关课题的能力。2 课程设计题目人机交互系统三维图形处理及动画实现2.1 题目要求及内容2.1.1 要求创建三维立体图形,通过创建菜单及键盘、鼠标事件实现对图形的人机交互式处理。在理解直线、圆、区域填充、图形裁剪等理论知识的基础上,借助于程序设计语言 VC+和 OpenGL 三维图形库进行小型图形应用软件或三维场景的开发。本课程课程设计注重图形交互处理的主要实现,包括如下几部分:三维立体图形人机交互的处理,主要内容包括以下几点:(1)创建菜单及键盘事件实现对图形的基本处理;(2)平移、缩放、旋转等计算机图形的几何变换 ;(3)图形的裁剪;(4)平面投影和透视投影;(5)消隐和光照处理;2(6)动画的绘制及实现。附:二维图形的绘制主要内容包括以下几点:(1)点、线、圆、多边形、Bezier 曲线等计算机基本图元的的绘制;(2)点、线、圆、多边形、Bezier 曲线等计算机基本图元属性的设置。2.1.2 内容分析 定义三维齐次坐标结构和面的结构;定义各图形绕轴旋转的结构及各坐标轴的放缩结构;定义各个光源的属性及材质表面的属性;定义键盘输入及鼠标输入对应响应的事件;定义各菜单对应执行的响应事件;通过双缓存技术实现动画效果。2.2 实习原理2.2.1 人机交互人机交互主要包括鼠标输入、键盘输入以及创建菜单执行对应的处理事件,其基本原理如下:鼠标:1)检测鼠标 ClicksGLUT 为处理鼠标 clicks 事件提供了一个方法。函数 glutMouseFunc,这个函数一般在程序初始化阶段被调用。函数原型如下:void glutMouseFunc(void(*func)(intbutton,intstate,intx,int y);参数:func:处理鼠标 click 事件的函数的函数名。从上面可以看到到,处理鼠标 click 事件的函数,一定有 4 个参数。第一个参数表明哪个鼠标键被按下或松开,这个变量可以是下面的三个值中的一个:GLUT_LEFT_BUTTONGLUT_MIDDLE_BUTTONGLUT_RIGHT_BUTTON第二个参数表明,函数被调用发生时,鼠标的状态,也就是是被按下,或松开,可能取值如下:GLUT_DOWNGLUT_UP当函数被调用时,state 的值是 GLUT_DOWN,那么程序可能会假定将会有个GLUT_UP 事件,甚至鼠标移动到窗口外面,也如此。然而,如果程序调用3glutMouseFunc 传递 NULL 作为参数,那么 GLUT 将不会改变鼠标的状态。剩下的两个参数(x,y)提供了鼠标当前的窗口坐标(以左上角为原点) 。2)检测动作(motion)GLUT 提供鼠标 motion 检测能力。有两种 GLUT 处理的 motion:active motion 和 passive motion。Active motion 是指鼠标移动并且有一个鼠标键被按下。Passive motion 是指当鼠标移动时,并有没鼠标键按下。如果一个程序正在追踪鼠标,那么鼠标移动期间,每一帧将产生一个结果。GLUT 让我们可以指定两个不同的函数,一个追踪 passive motion,另一个追踪 active motion。它们的函数原型,如下:void glutMotionFunc(void(*func)(intx,int y);void glutPassiveMotionFunc(void (*func)(intx,int y);参数:Func:处理各自类型 motion 的函数名。处理 motion 的参数函数的参数(x,y)是鼠标在窗口的坐标。以左上角为原点。3)检测鼠标进入或离开窗口GLUT 还能检测鼠标鼠标离开,进入窗口区域。一个回调函数可以被定义去处理这两个事件。GLUT 里,调用这个函数的是 glutEntryFunc,函数原型如下:void glutEntryFunc(void(*func)(int state));参数:Func:处理这些事件的函数名。上面函数的参数中,state 有两个值:GLUT_LEFTGLUT_ENTERED表明,是离开,还是进入窗口。键盘:当你按下一个键后,GLUT 提供了两个函数为这个键盘消息注册回调。1)第一个是 glutKeyboardFunc。这个函数是告诉窗口系统,哪一个函数将会被调用来处理普通按键消息。普通键是指字母,数字,和其他可以用ASCII 代码表示的键。函数原型如下:void glutKeyboardFunc(void(*func)(unsigned char key,intx,int y);参数:func: 处理普通按键消息的函数的名称。如果传递 NULL,则表示 GLUT 忽略普通按键消息。这个作为 glutKeyboardFunc 函数参数的函数需要有三个形参。第一个表示按下的键的 ASCII 码,其余两个提供了,当键按下时当前的鼠标位置。鼠标位置是相对于当前客户窗口的左上角而言的。2)GLUT 提供函数 glutSpecialFunc 以便当有特殊键按下的消息时,你能注册你的函数。函数原型如下:void glutSpecialFunc(void (*func)(intkey,intx,int y);参数:func: 处理特殊键按下消息的函数的名称。传递 NULL 则表示 GLUT 忽略特4殊键消息。菜单:弹出式菜单(像点鼠标右键出来的菜单那样的)也是 GLUT 的一部分,虽然它不能实现我们经常看到的 windows 系统弹出式菜单的所有的功能,但是它也有很大的作用。给一个程序增加菜单提供了一个比键盘更简单的方法来和程序交互,选择不同选项,而不用去记那些按键。1)创建菜单:创建菜单函数 glutCreateMenu 的原型如下:intglutCreateMenu(void (*func) (int value) ) ;参数:func:为新建的菜单处理菜单事件的函数名。这个函数的返回值是菜单的标识符(menu identifier) 。2)菜单增加条目:出来个空菜单也没什么用,使用的函数是glutAddMenuEntry:void glutAddMenuEntry(char *name,int value) ;参数:name:菜单名称的字符串。value:当你选择菜单里的一项后,这个值就返回给上面的glutCreateMenu 里调用的函数。3)联接鼠标:必须指定菜单怎么出现,使用 GLUT 你可以在按下一个鼠标按键后让菜单显示,函数是 glutAttachMenu:void glutAttachMenu(int button) ;参数:button: 一个整数,指定菜单和哪个鼠标键关联起来。botton 可以去下面的值;GLUT_LEFT_BUTTONGLUT_MIDDLE_BUTTONGLUT_RIGHT_BUTTON用 glutAttachMenu 来在鼠标和菜单间建立关联,但我们有时候需要断开这种关联。完成这个工作的函数是 glutDetachMenu。函数原型如下:void glutDetachMenu(int button) ;参数:button:要断开的鼠标按键。Button 的取值和 glutAttachMenu 一样。最后,如果你想恢复被菜单使用了的资源,我们可以销毁(destroy)它,相应的函数是 glutDestroyMenu,它的原型如下:5void glutDestroyMenu(intmenuIdentifier) ;参数:menuIdentifier:要销毁的菜单的标识符,它必须和函数 glutCreateMenu返回的值相同。4)子菜单的建立:和我们前面用的建立菜单的函数一样。建立菜单后我们把子菜单作为一个条目添加进去。使用函数 glutAddSubMenu 来完成这项工作:void glutAddSubMenu(char *entryName,intmenuIndex);参数:entryName:子菜单名称。menuIndex:子菜单索引,这个就是我们调用 glutCreateMenu 来创建子菜单返回的值。2.2.2 动画计算机动画与实际的动画有些不同,实际的动画都是先画好,播放的时候直接显示出来,计算机动画则是一边画一边显示,通过双缓存技术将后台绘制好的图形与前台图形交换,这样循环反复,屏幕上便呈现出我们所看到的动画。计算机实现动画主要启动双缓冲功能,在主函数里启用双缓冲:glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);当每次绘制完成时,我们需要交换两个缓冲区,把绘制好的信息显示到屏幕。为了完成这一工作,我们在绘图函数里调用 glutSwapBuffers()便很好的实现了动画前台与后台的光滑交换显示,达到了动画效果。2.2.3 几何变换2.2.3.1 二维几何图形变换对于几何变换主要通过与变换矩阵的矩阵运算改变顶点坐标(用齐次坐标)来实现: snmqdcpbayxHyx16体 放 大 。则 总 体 缩 小 ; 否 则 , 总若 变 换 。: 对 整 体 图 形 进 行 伸 缩处 产 生 一 个 灭 点 。: 在 处 产 生 一 个 灭 点 。: 在: 对 图 形 做 投 影 变 换 。 。: 对 图 形 进 行 平 移 变 换 。转 、 对 称 、 错 切 等 变 换: 对 图 形 进 行 缩 放 、 旋,101*1ssyxyxsqypxqnmdcba例如:(1) 放缩: yxsS0(2) 旋转: coini(3) 关于 x 轴对称:(4) 关于原点对称:(5) 沿 X 轴方向的错切变换:2.2.3.2 三维几何图形变换:三维几何图形变换原理同二维几何图形变换,只是采用的变换矩阵为 44矩阵,空间点x y z 采用四维齐次坐标 X Y Z 1表示。2、OpenGL 环境下的几何变换基本变换函数:(1)平移矩阵构造函数为 glTranslate(tx, ty, tz),作用是把当前矩阵和一个表示移动物体的矩阵相乘。tx, ty,tz 指定这个移动物体的矩阵,它们可以是任意的实数值,后缀为 f(单精度浮点 float)或 d(双精度浮点double) ,对于二维应用来说,tz=0.0。snmqdcpbaTyxyx10yxyx cc17(2)旋转矩阵构造函数为 glRotate(theta, vx, vy, vz),作用是把当前矩阵和一个表示旋转物体的矩阵相乘。theta, vx, vy, vz 指定这个旋转物体的矩阵,物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数theta 表示旋转的角度。向量 v=(vx, vy,vz)的分量可以是任意的实数值,该向量用于定义通过坐标原点的旋转轴的方向,后缀为 f(单精度浮点 float)或d(双精度浮点 double) ,对于二维旋转来说,vx=0.0,vy=0.0,vz=1.0。(3)缩放矩阵构造函数为 glScale(sx, sy, sz),作用是把当前矩阵和一个表示缩放物体的矩阵相乘。sx, sy,sz 指定这个缩放物体的矩阵,分别表示在 x,y,z 方向上的缩放比例,它们可以是任意的实数值,当缩放参数为负值时,该函数为反射矩阵,缩放相对于原点进行,后缀为 f(单精度浮点float)或 d(双精度浮点 double) 。假设当前矩阵为单位矩阵,然后先乘以一个表示旋转的矩阵 R,再乘以一个表示移动的矩阵 T,最后得到的矩阵再乘上每一个顶点的坐标矩阵 v。那么,经过变换得到的顶点坐标就是(RT)v)。由于矩阵乘法满足结合率,(RT)v) =R(Tv),换句话说,实际上是先进行移动,然后进行旋转。即:实际变换的顺序与代码中写的顺序是相反的。由于“先移动后旋转”和“先旋转后移动”得到的结果很可能不同,初学的时候需要特别注意这一点。由于模型变换都通过矩阵运算来实现,在进行变换前,应先设置当前操作的矩阵为“模型视图矩阵” 。设置的方法是以 GL_MODELVIEW 为参数调用glMatrixMode 函数,像这样:glMatrixMode(GL_MODELVIEW);该语句指定一个 44 的建模矩阵作为当前矩阵。通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。把当前矩阵设置为单位矩阵的函数为:glLoadIdentity();我们在进行矩阵操作时,有可能需要先保存某个矩阵,过一段时间再恢复它。当我们需要保存时,调用 glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用 glPopMatrix()函数,它相当于从堆栈栈顶

温馨提示

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

评论

0/150

提交评论