计算机图形学课程设计报告
组 号:第 七 组 小组成员:宋 洁 邵 海 军 谷 文 海 冯 新 科 学 院:资源环境学院 专业班级:地 科 14 - 2 指导老师:向 中 林
目录
1实习目的 ........................................................................................................ 错误!未定义书签。 2 课程设计题目 ............................................................................................... 错误!未定义书签。
题目要求及内容 ......................................................................................... 错误!未定义书签。
要求 ......................................................................................................... 错误!未定义书签。 内容分析 ................................................................................................. 错误!未定义书签。 实习原理 ..................................................................................................... 错误!未定义书签。 人机交互 ................................................................................................. 错误!未定义书签。 动画 ......................................................................................................... 错误!未定义书签。 几何变换 ................................................................................................. 错误!未定义书签。 二维几何图形变换 ............................................................................. 错误!未定义书签。 三维几何图形变换: ............................................................................ 错误!未定义书签。 3 主要流程图 ................................................................................................... 错误!未定义书签。
三维图形处理流程图 ............................................................................. 错误!未定义书签。 二维几何画板流程图 ............................................................................. 错误!未定义书签。 4 主要源程序 ................................................................................................... 错误!未定义书签。
主要源程序 ................................................................................................. 错误!未定义书签。
键盘事件函数 ......................................................................................... 错误!未定义书签。 菜单 ......................................................................................................... 错误!未定义书签。 创建菜单函数 ..................................................................................... 错误!未定义书签。 光照函数 ............................................................................................. 错误!未定义书签。 几何变换事件 ..................................................................................... 错误!未定义书签。 旋转事件 ......................................................................................... 错误!未定义书签。 移动事件 ......................................................................................... 错误!未定义书签。 放大事件 ......................................................................................... 错误!未定义书签。 缩小事件 ......................................................................................... 错误!未定义书签。 5 问题讨论 ....................................................................................................... 错误!未定义书签。
1实习目的
课程设计是信息与计算科学专业集中实践性环节之一,是学习完《计算机图形学》课程后进行的一次全面的综合练习。其目的是:
(1)要达到理论与实际应用相结合,使学生能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养良好的程序设计技能。
(2)在实践中认识为什么要学习数据结构,掌握数据结构、程序设计语言、程序设计技术之间的关系,是前面所学知识的综合和回顾。
要求
(1)了解并掌握交互式图形系统的设计方法,具备初步的独立分析和设计能力;
(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能; (4)训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;
(5)培养学生团结协作,共同完成相关课题的能力。
2 课程设计题目
人机交互系统三维图形处理及动画实现
题目要求及内容 要求
创建三维立体图形,通过创建菜单及键盘、鼠标事件实现对图形的人机交互式处理 。
在理解直线、圆、区域填充、图形裁剪等理论知识的基础上,借助于程序设计语言VC++和OpenGL三维图形库进行小型图形应用软件或三维场景的开发。本课程课程设计注重图形交互处理的主要实现,包括如下几部分:
三维立体图形人机交互的处理,主要内容包括以下几点: (1)创建菜单及键盘事件实现对图形的基本处理; (2)平移、缩放、旋转等计算机图形的几何变换 ; (3)图形的裁剪;
(4)平面投影和透视投影; (5)消隐和光照处理; (6)动画的绘制及实现。
附:二维图形的绘制 主要内容包括以下几点:
(1)点、线、圆、多边形、Bezier曲线等计算机基本图元的的绘制; (2)点、线、圆、多边形、Bezier曲线等计算机基本图元属性的设置。
内容分析
定义三维齐次坐标结构和面的结构;定义各图形绕轴旋转的结构及各坐标轴的放缩结构;
定义各个光源的属性及材质表面的属性; 定义键盘输入及鼠标输入对应响应的事件; 定义各菜单对应执行的响应事件; 通过双缓存技术实现动画效果。
实习原理 人机交互
人机交互主要包括鼠标输入、键盘输入以及创建菜单执行对应的处理事件,其基本原理如下:
鼠标:
1)检测鼠标Clicks
GLUT为处理鼠标clicks事件提供了一个方法。函数glutMouseFunc,这个函数一般在程序初始化阶段被调用。函数原型如下:
void glutMouseFunc(void(*func)(int button,int state,int x,int y)); 参数:
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:active motion和passive motion。Active motion是指鼠标移动并且有一个鼠标键被按下。Passive motion是指当鼠标移动时,并有没鼠标键按下。如果一个程序正在追踪鼠标,那么鼠标移动期间,每一帧将产生一个结果。
GLUT让我们可以指定两个不同的函数,一个追踪passive motion,另一个追踪active motion。
它们的函数原型,如下:
void glutMotionFunc(void(*func)(int x,int y));
void glutPassiveMotionFunc(void (*func)(int x,int y)); 参数:
Func:处理各自类型motion的函数名。
处理motion的参数函数的参数(x,y)是鼠标在窗口的坐标。以左上角为原点。
3)检测鼠标进入或离开窗口
GLUT还能检测鼠标鼠标离开,进入窗口区域。一个回调函数可以被定义去处理这两个事件。GLUT里,调用这个函数的是glutEntryFunc,函数原型如下:
void glutEntryFunc(void(*func)(int state)); 参数:
Func:处理这些事件的函数名。
上面函数的参数中,state有两个值: GLUT_LEFT
GLUT_ENTERED
表明,是离开,还是进入窗口。 键盘:
当你按下一个键后,GLUT提供了两个函数为这个键盘消息注册回调。 1)第一个是glutKeyboardFunc。这个函数是告诉窗口系统,哪一个函数将会被调用来处理普通按键消息。普通键是指字母,数字,和其他可以用ASCII代码表示的键。函数原型如下:
void glutKeyboardFunc(void(*func)(unsigned char key,int x,int y)); 参数:
func: 处理普通按键消息的函数的名称。如果传递NULL,则表示GLUT忽略普通按键消息。
这个作为glutKeyboardFunc函数参数的函数需要有三个形参。第一个表示按下的键的ASCII码,其余两个提供了,当键按下时当前的鼠标位置。鼠标位置是相对于当前客户窗口的左上角而言的。
2)GLUT提供函数glutSpecialFunc以便当有特殊键按下的消息时,你能注册你的函数。函数原型如下:
void glutSpecialFunc(void (*func)(int key,int x,int y)); 参数:
func: 处理特殊键按下消息的函数的名称。传递NULL则表示GLUT忽略特殊键消息。
菜单:
弹出式菜单(像点鼠标右键出来的菜单那样的)也是GLUT的一部分,虽然它不能实现我们经常看到的windows系统弹出式菜单的所有的功能,但是它也