计算机图形学课程设计报告.docx
- 文档编号:1655395
- 上传时间:2022-10-23
- 格式:DOCX
- 页数:21
- 大小:339.77KB
计算机图形学课程设计报告.docx
《计算机图形学课程设计报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学课程设计报告.docx(21页珍藏版)》请在冰豆网上搜索。
计算机图形学课程设计报告
组号:
第七组
小组成员:
宋洁
邵海军
谷文海
冯新科
学院:
资源环境学院
专业班级:
地科14-2
指导老师:
向中林
2016.12.18
目录
1实习目的 1
2课程设计题目 1
2.1题目要求及内容 1
2.1.1要求 1
2.1.2内容分析 2
2.2实习原理 2
2.2.1人机交互 2
2.2.2动画 5
2.2.3几何变换 5
2.2.3.1二维几何图形变换 5
2.2.3.2三维几何图形变换:
6
3主要流程图 8
3.1三维图形处理流程图 8
3.2二维几何画板流程图 9
4主要源程序 9
4.1主要源程序 9
4.2.1键盘事件函数 11
4.2.2菜单 12
4.2.2.1创建菜单函数 12
4.2.2.2光照函数 14
4.2.2.3几何变换事件 16
4.2.2.3.1旋转事件 16
4.2.2.3.2移动事件 17
4.2.2.3.3放大事件 18
4.2.2.3.4缩小事件 19
5问题讨论 19
1实习目的
课程设计是信息与计算科学专业集中实践性环节之一,是学习完《计算机图形学》课程后进行的一次全面的综合练习。
其目的是:
(1)要达到理论与实际应用相结合,使学生能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养良好的程序设计技能。
(2)在实践中认识为什么要学习数据结构,掌握数据结构、程序设计语言、程序设计技术之间的关系,是前面所学知识的综合和回顾。
要求
(1)了解并掌握交互式图形系统的设计方法,具备初步的独立分析和设计能力;
(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能;
(4)训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;
(5)培养学生团结协作,共同完成相关课题的能力。
2课程设计题目
人机交互系统三维图形处理及动画实现
2.1题目要求及内容
2.1.1要求
创建三维立体图形,通过创建菜单及键盘、鼠标事件实现对图形的人机交互式处理。
在理解直线、圆、区域填充、图形裁剪等理论知识的基础上,借助于程序设计语言VC++和OpenGL三维图形库进行小型图形应用软件或三维场景的开发。
本课程课程设计注重图形交互处理的主要实现,包括如下几部分:
三维立体图形人机交互的处理,主要内容包括以下几点:
(1)创建菜单及键盘事件实现对图形的基本处理;
(2)平移、缩放、旋转等计算机图形的几何变换;
(3)图形的裁剪;
(4)平面投影和透视投影;
(5)消隐和光照处理;
(6)动画的绘制及实现。
附:
二维图形的绘制
主要内容包括以下几点:
(1)点、线、圆、多边形、Bezier曲线等计算机基本图元的的绘制;
(2)点、线、圆、多边形、Bezier曲线等计算机基本图元属性的设置。
2.1.2内容分析
定义三维齐次坐标结构和面的结构;定义各图形绕轴旋转的结构及各坐标轴的放缩结构;
定义各个光源的属性及材质表面的属性;
定义键盘输入及鼠标输入对应响应的事件;
定义各菜单对应执行的响应事件;
通过双缓存技术实现动画效果。
2.2实习原理
2.2.1人机交互
人机交互主要包括鼠标输入、键盘输入以及创建菜单执行对应的处理事件,其基本原理如下:
鼠标:
1)检测鼠标Clicks
GLUT为处理鼠标clicks事件提供了一个方法。
函数glutMouseFunc,这个函数一般在程序初始化阶段被调用。
函数原型如下:
voidglutMouseFunc(void(*func)(intbutton,intstate,intx,inty));
参数:
func:
处理鼠标click事件的函数的函数名。
从上面可以看到到,处理鼠标click事件的函数,一定有4个参数。
第一个参数表明哪个鼠标键被按下或松开,这个变量可以是下面的三个值中的一个:
GLUT_LEFT_BUTTON
GLUT_MIDDLE_BUTTON
GLUT_RIGHT_BUTTON
第二个参数表明,函数被调用发生时,鼠标的状态,也就是是被按下,或松开,可能取值如下:
GLUT_DOWN
GLUT_UP
当函数被调用时,state的值是GLUT_DOWN,那么程序可能会假定将会有个GLUT_UP事件,甚至鼠标移动到窗口外面,也如此。
然而,如果程序调用glutMouseFunc传递NULL作为参数,那么GLUT将不会改变鼠标的状态。
剩下的两个参数(x,y)提供了鼠标当前的窗口坐标(以左上角为原点)。
2)检测动作(motion)
GLUT提供鼠标motion检测能力。
有两种GLUT处理的motion:
activemotion和passivemotion。
Activemotion是指鼠标移动并且有一个鼠标键被按下。
Passivemotion是指当鼠标移动时,并有没鼠标键按下。
如果一个程序正在追踪鼠标,那么鼠标移动期间,每一帧将产生一个结果。
GLUT让我们可以指定两个不同的函数,一个追踪passivemotion,另一个追踪activemotion。
它们的函数原型,如下:
voidglutMotionFunc(void(*func)(intx,inty));
voidglutPassiveMotionFunc(void(*func)(intx,inty));
参数:
Func:
处理各自类型motion的函数名。
处理motion的参数函数的参数(x,y)是鼠标在窗口的坐标。
以左上角为原点。
3)检测鼠标进入或离开窗口
GLUT还能检测鼠标鼠标离开,进入窗口区域。
一个回调函数可以被定义去处理这两个事件。
GLUT里,调用这个函数的是glutEntryFunc,函数原型如下:
voidglutEntryFunc(void(*func)(intstate));
参数:
Func:
处理这些事件的函数名。
上面函数的参数中,state有两个值:
GLUT_LEFT
GLUT_ENTERED
表明,是离开,还是进入窗口。
键盘:
当你按下一个键后,GLUT提供了两个函数为这个键盘消息注册回调。
1)第一个是glutKeyboardFunc。
这个函数是告诉窗口系统,哪一个函数将会被调用来处理普通按键消息。
普通键是指字母,数字,和其他可以用ASCII代码表示的键。
函数原型如下:
voidglutKeyboardFunc(void(*func)(unsignedcharkey,intx,inty));
参数:
func:
处理普通按键消息的函数的名称。
如果传递NULL,则表示GLUT忽略普通按键消息。
这个作为glutKeyboardFunc函数参数的函数需要有三个形参。
第一个表示按下的键的ASCII码,其余两个提供了,当键按下时当前的鼠标位置。
鼠标位置是相对于当前客户窗口的左上角而言的。
2)GLUT提供函数glutSpecialFunc以便当有特殊键按下的消息时,你能注册你的函数。
函数原型如下:
voidglutSpecialFunc(void(*func)(intkey,intx,inty));
参数:
func:
处理特殊键按下消息的函数的名称。
传递NULL则表示GLUT忽略特殊键消息。
菜单:
弹出式菜单(像点鼠标右键出来的菜单那样的)也是GLUT的一部分,虽然它不能实现我们经常看到的windows系统弹出式菜单的所有的功能,但是它也有很大的作用。
给一个程序增加菜单提供了一个比键盘更简单的方法来和程序交互,选择不同选项,而不用去记那些按键。
1)创建菜单:
创建菜单函数glutCreateMenu的原型如下:
intglutCreateMenu(void(*func)(intvalue));
参数:
func:
为新建的菜单处理菜单事件的函数名。
这个函数的返回值是菜单的标识符(menuidentifier)。
2)菜单增加条目:
出来个空菜单也没什么用,使用的函数是glutAddMenuEntry:
voidglutAddMenuEntry(char*name,intvalue);
参数:
name:
菜单名称的字符串。
value:
当你选择菜单里的一项后,这个值就返回给上面的glutCreateMenu里调用的函数。
3)联接鼠标:
必须指定菜单怎么出现,使用GLUT你可以在按下一个鼠标按键后让菜单显示,函数是glutAttachMenu:
voidglutAttachMenu(intbutton);
参数:
button:
一个整数,指定菜单和哪个鼠标键关联起来。
botton可以去下面的值;
GLUT_LEFT_BUTTON
GLUT_MIDDLE_BUTTON
GLUT_RIGHT_BUTTON
用glutAttachMenu来在鼠标和菜单间建立关联,但我们有时候需要断开这种关联。
完成这个工作的函数是glutDetachMenu。
函数原型如下:
voidglutDetachMenu(intbutton);
参数:
button:
要断开的鼠标按键。
Button的取值和glutAttachMenu一样。
最后,如果你想恢复被菜单使用了的资源,我们可以销毁(destroy)它,相应的函数是glutDestroyMenu,它的原型如下:
voidglutDestroyMenu(intmenuIdentifier);
参数:
menuIdentifier:
要销毁的菜单的标识符,它必须和函数glutCreateMenu返回的值相同。
4)子菜单的建立:
和我们前面用的建立菜单的函数一样。
建立菜单后我们把子菜单作为一个条目添加进去。
使用函数glutAddSubMenu来完成这项工作:
voidglutAddSubMenu(char*entryName,intmenuIndex);
参数:
entryName:
子菜单名称。
menuIndex:
子菜单索引,这个就是我们调用glutCreateMenu来创建子菜单返回的值。
2.2.2动画
计算机动画与实际的动画有些不同,实际的动画都是先画好,播放的时候直接显示出来,计算机动画则是一边画一边显示,通过双缓存技术将后台绘制好的图形与前台图形交换,这样循环反复,屏幕上便呈现出我们所看到的动画。
计算机实现动画主要启动双缓冲功能,在主函数里启用双缓冲:
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
当每次绘制完成时,我们需要交换两个缓冲区,把绘制好的信息显示到屏幕。
为了完成这一工作,我们在绘图函数里调用glutSwapBuffers()便很好的实现了动画前台与后台的光滑交换显示,达到了动画效果。
2.2.3几何变换
2.2.3.1二维几何图形变换
对于几何变换主要通过与变换矩阵的矩阵运算改变顶点坐标(用齐次坐标)来实现:
例如:
(1)放缩:
(2)旋转:
(3)关于x轴对称:
(4)关于原点对称:
(5)沿X轴方向的错切变换:
2.2.3.2三维几何图形变换:
三维几何图形变换原理同
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 课程设计 报告