(论文)计算机专业课程设计 opengl旋转立方体最新优秀毕业论文资料搜集呕血奉献_第1页
(论文)计算机专业课程设计 opengl旋转立方体最新优秀毕业论文资料搜集呕血奉献_第2页
(论文)计算机专业课程设计 opengl旋转立方体最新优秀毕业论文资料搜集呕血奉献_第3页
(论文)计算机专业课程设计 opengl旋转立方体最新优秀毕业论文资料搜集呕血奉献_第4页
(论文)计算机专业课程设计 opengl旋转立方体最新优秀毕业论文资料搜集呕血奉献_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

学院 计算机科学系 课程设计报告 设计名称:设计名称: 软件课程设计软件课程设计 设计题目:设计题目: 旋转立方体的设计旋转立方体的设计 学生学号:学生学号: 专业班级:专业班级: 学生姓名:学生姓名: 学生成绩:学生成绩: 指导教师(职称):指导教师(职称): 课题工作时间:课题工作时间: 至至 说明: 1、报告中的任务书、进度表由指导教师在课程设计开始前填写并发给每 个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。 2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。 3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设 计完成情况、报告的质量及答辩情况,给出客观、全面的评价。 4、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一 律按不及格处理。答辩小组成员应由 2 人及以上教师组成。 5、报告正文字数一般应不少于 3000 字,也可由指导教师根据本门综合设 计的情况另行规定。 6、平时表现成绩低于 6 分的学生,取消答辩资格,其本项综合设计成绩 按不及格处理。 计算机科学系课程设计任务书计算机科学系课程设计任务书 学生姓 名 王雅宁 学 号专业 班级 2008 级软件工程 2 班 设计题 目 旋转立方体的设计 内容概要: 画出一个正方体,并将它旋转起来。 文献资料: 1谭浩强 C 程序设计(M)(第三版) 清华大学出版社 2010 2严蔚敏.吴伟民 数据结构M 高等教育 2004 3钱能 C+程序设计教程(M)(第二版)清华大学出版社 2009 4郑丽 Visual Basic 程序设计清华大学出版社 2009-10-29 设计要求: 1用 C/C+或 VB 实现; 2友好性:界面要友好; 3可读性:源程序代码清晰、有层次; 4当鼠标离屏幕中心的位置远近可以决定立方体旋转速度的快慢。 工作期限: 设计工作自 2010 年 5 月 31 日至 2010 年 6 月 11 日止。 指指导导教教师师: 系系主主任任: 日日 期期:2 20 01 10 0 年年 5 5 月月 2 28 8 日日 计算机科学系课程设计进度安排表计算机科学系课程设计进度安排表 专业:专业: 软件工程软件工程 姓名:姓名: 王雅宁王雅宁 学号:学号: 1410208021014102080210 日期内 容备注 5 月 31 日 6 月 1 日 分析题目,查阅相关资料 6 月 2 日 6 月 3 日 拟定整体方案,编写程序 6 月 4 日 6 月 6 日 程序编写 6 月 7 日 6 月 8 日 调试程序 6 月 9 日 6 月 10 日 整理报告 6 月 11 日 6 月 11 日 答辩 月 日 月 日 月 日 月 日 月 日 月 日 月 日 月日 月 日 月 日 月 日 月 日 月 日 月 日 月 日 月 日 月 日 月 日 指导教师签名:指导教师签名: 20102010 年年 5 5 月月 2828 日日 指导教师评语 指导教师: (签字) 日 期: 2010 年 6 月 10 日 答辩记录表 学生姓名: 学号: 班级: 答辩地点: 答辩内容记录: 合计 分值 各项 分值 评分标准 实际 得分 合计 得分 备注 10 在规定时间内能就所设计的内容 进行阐述,言简意明,重点突出, 论点正确,条理清晰。 答 辩 成 绩 25 15 在规定时间内能准确、完整、流 利地回答教师所提出的问题。 答辩小组成员(签字): 2010 年 6 月 11 日 成绩评定表 学生姓名: 学号: 班级: 类别 合计 分值 各项 分值 评分标准 实际 得分 合计 得分 备注 平时 表现 1010 按时参加设计指导,无违反纪律 情况。 20 按设计任务书的要求完成了全部 任务,能完整演示其设计内容, 符合要求。 完成 情况 30 10 能对其设计内容进行详细、完整 的介绍,并能就指导教师提出的 问题进行正确的回答。 10 报告文字通顺,内容翔实,论述 充分、完整,立论正确,结构严 谨合理;报告字数符合相关要求, 工整规范,整齐划一。 5 课题背景介绍清楚,综述分析充 分。 5 设计方案合理、可行,论证严谨, 逻辑性强,具有说服力。 5 符号统一;图表完备、符合规范 要求。 5 能对整个设计过程进行全面的总 结,得出有价值的结论或结果。 报告 质量 35 5 参考文献数量在 2 篇以上,格式 符合要求,在正文中正确引用。 10 在规定时间内能就所设计的内容 进行阐述,言简意明,重点突出, 论点正确,条理清晰。 答辩 情况 25 15 在规定时间内能准确、完整、流 利地回答教师所提出的问题。 总评成绩: 分 指导教师: (签字) 日 期: 2010 年 6 月 15 日 摘 要 软件工程专业经过两年的课程学习,已经积累了相关高级语言程序设计的基本知识。 画出正方体并使之旋转,这一题目考察了程序设计自顶而下、逐步细化的相关基本思 想。 题目难点在于实现可视化界面的交互、以及图像的旋转过程。分析题目可以得出程序 可以大致分为两个方面的内容: 1.画出一个正方体。 2.使正方体旋转起来。 经过查找相关资料,本程序采用功能强大的图形库 OPENGL 并调用一系列 WINDOWS API 采用 C/C+语言在 Microsoft Visual C+6.0 环境下编写。很好的解决了 用 C/C+编写图形界面的难点问题。通过 Win32 平台的 OPENGL API 实现了逼真的三 维旋转效果 关键词: 正方体;旋转;可视化;OPENGL Abstract Software Engineering after two years course of study, has accumulated a relevant high-level language programming basics. Draw the cube and make it spin, this subject examines the design top-down process, gradually refining the basic idea related. Subject difficulty is to achieve interactive visual interface, and image rotation process.Analysis procedures can be drawn subject can be broadly divided into two aspects: 1. Draw a cube. 2. 2. To make a cube spin. After find relevant information, this program features a powerful graphics library OPENGL and call a WINDOWS API using C / C + + language in Microsoft Visual C + +6.0 environment preparation. Good solution using C / C + + graphical interface written and difficult problems. OPENGL API through the Win32 platform to achieve a realistic three-dimensional rotation effect Keywords:cube;spin;visual;OpenGL 西安文理学院计算机科学系 课程设计报告 - I - 目目 录录 目目 录录.I 第一章第一章 课题背景课题背景.3 1.1 引言.3 1.1.1背景及目的.3 1.2 题目概述.3 1.2.1问题及技术要求.3 1.2.2理论依据及工作内容.3 第二章第二章 设计简介及设计方案论述设计简介及设计方案论述.4 2.1 设计简介.4 2.2 OPENGL 图形库简介4 2.2.1 OPENGL历史简介.4 2.2.2 OPENGL特点.4 2.2.3 OPENGL工作顺序.5 2.3 OPENGL 简单编程方法5 2.3.1 OPENGL基本语法.5 2.3.2 OPENGL状态机制.5 2.3.3 OPENGL基本结构.6 2.4 程序所使用的 OPENGL 库函数6 2.5 OPENGL 及 WINDOWS 坐标系7 2.6 WINDOWS 下配置 OPENGL 环境8 2.7 WINDOWS 消息机制8 2.8 大体设计方案 9 第三章第三章 详细设计详细设计.11 3.1 OPENGL 的绘制工作11 3.1.1 OPENGL的初始化工作.11 3.1.2 OPENGL的主体绘制工作.11 3.2 鼠标控制正方体的旋转12 3.3 重置 OPENGL 窗口.13 3.4 WINDOWS 中 OPENGL 窗体设置及创建13 3.5 完成 WINDOWS 主程序.14 第四章第四章 设计结果及分析设计结果及分析.15 4.1 设计结果分析15 4.2 进一步美化程序15 总总 结结.16 致致 谢谢.17 参考文献参考文献.18 附录附录.19 西安文理学院计算机科学系 课程设计报告 - 2 - 第一章第一章 课题背景课题背景 1.1 引言引言 随着专业课程学习的深入,相关高级语言程序设计的知识已经有所积累,如何 更好的掌握并应用已经成为当务之急。通过软件工程课程设计的过程能够学习 程序设计的基本思想以及整体流程。 1.1.1 背景及目的背景及目的 基本高级语言程序设计以及相关专业基础课程已经学习完毕,在学习过程中遇 到的一些难点问题,为了综合以前学过的课程知识并融会贯通。可以通过课程 设计的独立完成来通过相关途径解决,从而能够更好的掌握程序设计的思想, 提升编程能力。 1.2 题目概述题目概述 1.2.1 问题及技术要求问题及技术要求 本题:画出一个正方体,并将它旋转起来。主要应实现以下 4 点基本要求: 1用 C/C+或 VB 实现; 2友好性:界面要友好; 3可读性:源程序代码清晰、有层次; 4当鼠标离屏幕中心的位置远近可以决定立方体旋转速度的快慢。 1.2.2 理论依据及工作内容理论依据及工作内容 题目难点在于实现可视化界面的交互、以及图像的旋转过程。分析题目可以得 出程序可以大致分为两个方面的工作内容:1.画出一个正方体。2.使正方体旋转 起来。通过在互联网上查找资料,我决定使用 OPENGL 图形库来解决 C/C+编 写图形界面困难的问题。 西安文理学院计算机科学系 课程设计报告 - 3 - 第二章第二章 设计简介及设计方案论述设计简介及设计方案论述 2.1 设计简介设计简介 为了实现本程序的两大功能,计划采用 OPENGL 图形库并调用一系列 WINDOWS API 采用 C/C+语言编写。 首先,应熟悉 OPENGL 在 WIN32 平台下的相关 API,以及其余 WINDOWS 窗 口交互的相关接口方法,来构建窗口的内容。 其次,熟悉了解 OPENGL 库函数在窗体中实现绘图(既绘制正方体) ,实现正 方体旋转功能的相关函数。 最后,实现 OPENGL 与 WINDOWS 的交互的过程,完成程序及注释。 2.2 OPENGL 图形库简介图形库简介 2.2.1 OPENGL 历史简介历史简介 OpenGL 是 SGI(Silicon Graphics Inc.)公司对 IRIS GL 进行改进,扩展可移植 性,形成的一个跨平台开放式图形编程接口,利用它可以很方便地开发出有多 种 特殊视觉效果(如光照、纹理、透明、阴影)的三维图形 。由于 OpenGL 采用类 似 C 语言的语法,所以对于学过 C 语言的人来说使用起来特别方便。 2.2.2 OPENGL 特点特点 从程序开发人员的角度来看,OpenGL 是一组绘图命令的 API 集合。利 用这些 API 能够方便地描述二维和三维几何物体,并控制这些物体按某种 方式绘制到显示缓冲区中。OpenGL 的 API 集合提供了物体描述、平移、旋 转、缩放、光照、纹理、材质、象素、位图、文字、交互以及提高显示性能 等方面的功能,基本涵盖了开发二、三维图形程序所需的各个方面。与一般 的图形开发工具相比,OpenGL 具有以下几个突出特点: (1)应用广泛 (2)跨平台性 (3)高质量和高性能 (4)出色的编程特性 (5)网络透明性 西安文理学院计算机科学系 课程设计报告 - 4 - 2.2.3 OPENGL 工作顺序工作顺序 OpenGL 的工作顺序就是一个从定义几何要素到把象素段写入帧缓冲 区的过程。在屏幕上显示图象的主要步骤是以下 3 步: 1)构造几何要素(点、线、多边形、图像、位图),创建对象的数学描 述。在三维空间放置对象,选择有利的观察点。 2)计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间 接给出。 3)光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。 2.3 OPENGL 简单编程方法简单编程方法 2.3.1 OPENGL 基本语法基本语法 OpenGL 基本函数均使用 gl 作为函数名的前缀,如 glClearColor();实 用函数则使用 glu 作为函数名的前缀,如 gluSphere()。OpenGL 基本常量的 名字以 GL_开头,如 GL_LINE_LOOP;实用常量的名字以 GLU_开头,如 GLU_FILL。一些函数如 glColor*()(定义颜色值),函数名后可以接不同的后 缀以支持不同的数据类型和格式。如 glColor3b()、glColor3d()、 glColor3f()和 glColor3bv()等,这几个函数在功能上是相似的,只是适用 于不同的数据类型和格式,其中 3 表示该函数带有三个参数,b、d、f 分别 表示参数的类型是字节型、双精度浮点型和单精度浮点型,v 则表示这些参 数是以向量(数组)形式出现的。 OpenGL 还定义了一些特殊的类型名,如 GLfloat,GLvoid。它们其实 就是 C 中的 float 和 void。在 gl.h 文件中可以看到以下定义: typedef float GLfloat; typedef void GLvoid; 一些基本的数据类型都有类似的定义。 西安文理学院计算机科学系 课程设计报告 - 5 - 2.3.2 OPENGL 状态机制状态机制 OpenGL 的工作方式是一种状态机制,它可以进行各种状态或模式设 置,这些状态或模式在重新改变它们之前一直有效。例如,当前颜色就是一 个状态变量,在这个状态改变之前,绘制的每个象素都将使用该颜色,直到 当前颜色被设置为其它颜色为止。OpenGL 中大量地使用了这种状态机制, 如颜色模式、投影模式、单双显示缓存区的设置、背景色的设置、光源的位 置和特性等等。 2.3.3 OPENGL 基本结构基本结构 OpenGL 程序的基本结构可分为三个部分: 第一部分是初始化部分,主要是设置一些 OpenGL 的状态开关,如颜 色模式(RGBA 或 ALPHA 等)的选择,是否作光照处理(若有的话,还需设置 光源的特性),深度检验,裁剪等等。这些状态一般都用函数 glEnable(), glDisable()来设置, ()中为相应的状态。 第二部分设置观察坐标系下的取景模式和取景框位置及大小。主要利用了三 个函数: 1 函数 void glViewport(left, top, right, bottom):设置在屏幕上的窗口大小, 四个参数描述屏幕窗口四个边界坐标(以象素表示); 2函数 void glOrtho(left, right, bottom, top, near, far):设置投影方式为正交 投影(平行投影),其取景体积(观察体)是一个各面均为矩形的六面体; 3函数 void gluPerspective(fovy, aspect, zNear, zFar):设置投影方式为透视 投影,其取景体积(观察体)是一个截头锥体(棱台) ,在这个体积内 的物体投影到锥体的顶点。 第三部分是 OpenGL 的主要部分,使用 OpenGL 的库函数构造几何物 体对象的数学描述,包括点线面的位置和拓扑关系,几何变换,光照处理等 等。 2.4 程序所使用的程序所使用的 OPENGL 库函数库函数 1OpenGL 函数库分为以下几类: (1)OpenGL 核心库:gl 115 个函数 (2)OpenGL 编程辅助库:aux 31 个函数 (3)OpenGL 实用程序工具包(OpenGL utility toolkit,GLUT):glut 30 多个函数 (4)Windows 专用库:wgl 6 个函数 (5)OpenGL 实用库(GLU) 西安文理学院计算机科学系 课程设计报告 - 6 - 利用较低层 OpenGL 命令编写一些执行特殊任务的例程,如纹理映射、 坐标变换、NURBS 曲线曲面等。GLU 库函数前缀都用 glu。 (6)OpenGL 的 X Window 系统扩充(GLX) 在使用 X Window 系统的机器上,提供一种建立 OpenGL 现场(context), 并把它与可绘(draw able)窗口关联起来的方法。GLX 作为 OpenGL 的附件提 供。GLX 库函数前缀为 glx。 (7)OpenGL Programming Guide 辅助库(Auxiliary Library) 这个库建立了一系列简单而又较完整的编程例子,例如初始化窗口、 监控输入,以及绘制一些三维几何体等函数。辅助库函数用前缀 aux。 在 Windows95/98 中,相关的库以动态链接库的形式存在,opengl32.lib、 glu32.lib、glaux.lib 分别表示 OpenGL 库,实用库和辅助库,和它们相应的 头文件是 gl.h、glu.h 及 glaux.h。 2基本常用函数 初始化(glutInit ) 创建窗口(glutCreateWindow) 设定窗口的显示模式(glutInitDisplayMode) 指定窗口的位置和大小(glutInitWindowPosition 和 glutInitWindowSize ) 指定窗口的显示内容函数(glutDisplayFunc) 运行框架(glutMainLoop) 刷新窗口的缓冲区 glClear(GL_COLOR_BUFFER_BIT); 设定投影参数(将三维图形投影到显示窗口) glMatrixMode(GL_PROJECTION); 2.5 OPENGL 及及 WINDOWS 坐标系坐标系 OPENGL 的三维坐标系如图 2-1 所示: XOY 平面为屏幕所在 Z X Y O 图 2-1 OPENGL 三维坐标系 西安文理学院计算机科学系 课程设计报告 - 7 - WINDOWS 的窗体坐标如图 2-2 所示: X Y O 图 2-2WINDOWS 窗体二维坐标系 2.6 WINDOWS 下配置下配置 OPENGL 环境环境 第一步:选择一个编译环境 现在 Windows 系统的主流编译环境有 Visual Studio,Broland C+ Builder,Dev- C+等,它们都是支持 OpenGL 的。但这里我选择 VC+ 6.0 作为 OpenGL 的环 境。 第二步:安装 GLUT 工具包 GLUT 不是 OpenGL 所必须的,但它会给我们的学习带来一定的方便,推荐安 装。 Windows 环境下的 GLUT 下载地址:(大小约为 150k) /resources/libraries/glut/glutdlls37beta.zip Windows 环境下安装 GLUT 的步骤: 1、将下载的压缩包解开,将得到 5 个文件 2、以我的安装目录为例: (1) “d:Program FilesMicrosoft Visual StudioVC98includeGL 文件夹” 。把解 压得到的 glut.h 放到这个 GL 文件夹里。没有 GL 文件夹可以自己建一个,一般 都有的。 (2) “d:Program FilesMicrosoft Visual StudioVC98lib 文件夹” 。把解压得到的 glut.lib 和 glut32.lib 放到静态函数库所在文件夹,即 lib 文件夹。 (3)把解压得到的 glut.dll 和 glut32.dll 放到操作系统目录下面的 system32 文件 夹内。 (典型的位置为:C:WindowsSystem32)这是非常重要的动态链接库设 置! 西安文理学院计算机科学系 课程设计报告 - 8 - 2.7 WINDOWS 消息机制消息机制 消息机制是 Windows 应用程序的核心,在 Windows 中发生的一切都可以用消息来表示, 消息用于告诉操作系统发生了什么,所有的 Windows 应用程序都是消息驱动的,除了 WM_COMMAND 消息,所有以 WM_为前缀的消息都是标准的 Windows 消息,如窗口、 鼠标移动、窗口大小改变等,程序启动或退出甚至每一段固定的时间都会产生标准 Windows 消息。 Windows 消息控制中心一般是三层结构,其顶端就是 Windows 内核。Windows 内核维护着 一个消息队列,第二级控制中心从这个消息队列中获取属于自己管辖的消息,后做出处理, 有些消息直接处理掉,有些还要发送给下一级窗体(Window)或控件(Control) 。第二级控 制中心一般是各 Windows 应用程序的 Application 对象。第三级控制中心就是 Windows 窗 体对象,每一个窗体都有一个默认的窗体过程,这个过程负责处理各种接收到的消息。 1、消息的组成: 一个消息由一个消息名称(UINT) ,和两个参数(WPARAM,LPARAM) 。当用 户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转 中之后会有 WM_COMMAND 消息发送,WPARAM 的高字中(HIWORD(wParam))是命 令的 ID 号,对菜单来讲就是菜单 ID。当然用户也可以定义自己的消息名称,也可以利用 自定义消息来发送通知和传送数据。 2、谁将收到消息: 一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行 分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对 WM_COMMAND 进行处理的代码,如果希望在窗口中进行图形输出就必须对 WM_PAINT 进行处理。 3、未处理的消息到那里去了: M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。 正因为有了这个默认窗口过程我们才可以利用 Windows 的窗口进行开发而不必过多关注窗 口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系 统自己去处理。 4、窗口句柄: 说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个 窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都 会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口 过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗 口二。 一个消息从产生到被一个窗口响应,其中有 5 个步骤: 1) 系统中发生了某个事件。 2) Windows 把这个事件翻译为消息,然后把它放到消息队列中。 3) 应用程序从消息队列中接收到这个消息,把它存放在 TMsg 记录中。 4) 应用程序把消息传递给一个适当的窗口的窗口过程。 5) 窗口过程响应这个消息并进行处理。 步骤 3 和 4 构成了应用程序的消息循环。消息循环往往是 Windows 应用程序的核心,因为 消息循环 使一个应用程序能够响应外部的事件。消息循环的任务就是从消息队列中检 西安文理学院计算机科学系 课程设计报告 - 9 - 索消息,然后把消息传递给适当的窗口。如果消息队列中没有消息,Windows 就允许其他 应用程序处理它们的消息。 Windows 操作系统最大的特点就是其图形化的操作界面, 其图形化界面是建立在其消息处理机制这个基础之上的 2.8 大体设计方案大体设计方案 综上所述,在本程序中。首先使用相关的 WINDOWS API 创建窗口,其次实现 程序的相应功能: 1使用 OPENGL 相应库函数画出正方体。 2使之旋转起来。 3在窗体中响应鼠标事件,控制正方体的旋转。 程序流程图如图 2-3 所示: WINMAIN 主程序将程序激活并进入消息循环 程序激活由 CreateGLWindow() 创建窗体 创建窗体成功由函 数 InitGL()初始化 OPENGL 调用相 关参数 由 DrawGLscene 在窗体中实现绘图 旋转 程序完成由 KillGLWindows 销毁窗口,推出消息循环,结束程序。 图 2-3 程序流程图 程序的大体内容以及机构已经构造成型,功能部分还需要进一步的细化。显然 在消息循环中的内容还远不止这些,还需加入响应以下事件: 1当窗口大小发生变化时,重置窗口。 2响应鼠标事件,并改变相对应的参数值,来改变旋转速度。 3响应窗口中断事件,如关闭事件、屏保事件。 西安文理学院计算机科学系 课程设计报告 - 10 - 第三章第三章 详细设计详细设计 3.1 OPENGL 的绘制工作的绘制工作 上一章我们提到完成 OPENGL 的绘制工作主有两个主要方面的工作需要完成: 1OPENGL 的初始化。 2OPENGL 的绘制工作,其中包括了是正方体旋转。 以下我们分别来完成。 3.1.1 OPENGL 的初始化工作的初始化工作 通过查找资料 OPENGL 的初始化工作由如下库函数过程来完成 glShadeModel(GL_SMOOTH); / 启用阴影平滑 启用 smooth shading(阴影平滑)。阴影平滑通过多边形精细的混合色彩,并对 外部光进行平滑。 glClearColor(0.0f, 0.0f, 0.0f, 0.5f); / 黑色背景 色彩值的范围从 0.0f 到 1.0f。0.0f 代表最黑的情况,1.0f 就是最亮的情况。 glClearColor 后的第一个参数是 Red Intensity(红色分量),第二个是绿色, 第三个是蓝色。最大值也是 1.0f,代表特定颜色分量的最亮情况。 接下来的三个函数必须做的是关于 depth buffer(深度缓存)的。将深度缓存设 想为屏幕后面的层。深度缓存不断的对物体进入屏幕内部有多深进行跟踪。我 们本节的程序其实没有真正使用深度缓存,但几乎所有在屏幕上显示 3D 场景 OpenGL 程序都使用深度缓存。它的排序决定那个物体先画。这样您就不会将一 个圆形后面的正方形画到圆形上来。深度缓存是 OpenGL 十分重要的部分。 glClearDepth(1.0f); / 设置深度缓存 glEnable(GL_DEPTH_TEST); / 启用深度测试 glDepthFunc(GL_LEQUAL); / 所作深度测试的类型 接下来是透视图修饰使透视图好看些: glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);/ 真正精 细的透视修正 西安文理学院计算机科学系 课程设计报告 - 11 - 3.1.2 OPENGL 的主体绘制工作的主体绘制工作 首先使用 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 清除屏幕 和深度缓存 然后使用 glLoadIdentity();重置当前的模型观察矩阵,确定绘制好图形的位 置 glTranslatef(0.0f,0.0f,z);移入屏幕 z 个单位。函数 glTranslatef(x, y, z)作用为沿着 X, Y 和 Z 轴移动; 现在是本程序中最重要的语句:glRotatef(angle,0.0f,0.0f,0.0f),其中 angle 为每次旋转的角度,之后分别是 XYZ 三个轴的旋转分量,这三个旋转分 量构成了三维坐标轴中的旋转法向量。 glBegin(GL_QUADS);开始绘制四边形(使用每 4 个连续的顶点定义一个四边形 的“填充图元-GL_QUANS“) 开始绘制顶点: 前面 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);/ 纹理和四边 形的左下 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);/ 纹理和四边 形的右下 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);/ 纹理和四边 形的右上 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);/ 纹理和四边 形的左上 纹理的相关的内容在后面再介绍,先在正方体的前面已经绘制好了,接下来依 次绘制:后面,顶面,底面,右面,左面并以 glEnd();结束 3.2 鼠标控制正方体的旋转鼠标控制正方体的旋转 上面我们介绍到旋转函数的作用,来解决程序是要使正方体旋转起来的问题, 程序还有一个要求就是,当鼠标离屏幕中心越来越远时,正方体旋转速度加快。 我们可以在 WINDOWS 消息响应中加入鼠标事件,获取当前鼠标位置。 case WM_MOUSEMOVE: int mousex=LOWORD(lParam); /得到鼠 标的 x 方向分量 int mousey=HIWORD(lParam); /得到鼠 标的 y 方向分量 m_mousex=mousey-m_height/2; /控制增 西安文理学院计算机科学系 课程设计报告 - 12 - 加正方体绕 y 轴的旋转分量 m_mousey=mousex-m_width/2; /控制增 加正方体绕 x 轴的旋转分量 return 0; m_mousex,m_mousey 为控制旋转的全局变量。 3.3 重置重置 OPENGL 窗口窗口 下面的代码的作用是重新设置 OpenGL 场景的大小,而不管窗口的大小是否已经 改变(假定您没有使用全屏模式)。甚至您无法改变窗口的大小时(例如您在全屏 模式下),它至少仍将运行一次-在程序开始时设置我们的透视图。OpenGL 场 景的尺寸将被设置成它显示时所在窗口的大小。 GLvoid ReSizeGLScene(GLsizei width, GLsizei height)/ 重 置 OpenGL 窗口大小 if (height=0)/ 防止被零除 height=1;/ 将 Height 设为 1 glViewport(0, 0, width, height);/ 重置当前的视 口 下面几行为透视图设置屏幕。意味着越远的东西看起来越小。这么做创建了一 个现实外观的场景。此处透视按照基于窗口宽度和高度的 45 度视角来计算。 0.1f,100.0f 是我们在场景中所能绘制深度的起点和终点。 glMatrixMode(GL_PROJECTION)指明接下来的两行代码将影响 projection matrix(投影矩阵)。投影矩阵负责为我们的场景增加透视。 glLoadIdentity() 近似于重置。它将所选的矩阵状态恢复成其原始状态。调用 glLoadIdentity() 之后我们为场景设置透视图。 glMatrixMode(GL_MODELVIEW)指明任何新的变换将会影响 modelview matrix(模型观察矩阵)。模型观察矩阵中存放了我们的物体讯息。最后我们重 置模型观察矩阵 glMatrixMode(GL_PROJECTION);/ 选择投影矩阵 glLoadIdentity();/ 重置投影矩阵 / 设置视口的大小 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); 西安文理学院计算机科学系 课程设计报告 - 13 - glMatrixMode(GL_MODELVIEW);/ 选择模型观察矩阵 glLoadIdentity();/ 重置模型观察矩阵 3.4 WINDOWS 中中 OPENGL 窗体设置及创建窗体设置及创建 WINDOWS 中 OPENGL 的窗体的设置及创建主要有以下几个大的方面,其中具体细 节不再阐述: 1相关变量的设置 HGLRC hRC=NULL;/ 窗口着色描述表句 柄 HDC hDC=NULL;/ OpenGL 渲染描述表 句柄 HWND hWnd=NULL;/ 保存我们的窗口句 柄 HINSTANCE hInstance;/ 保存程序的实例 第一行设置的变量是 Rendering Context(着色描述表)。每一个 OpenGL 都被连 接到一个着色描述表上。着色描述表将所有的 OpenGL 调用命令连接到 Device Context(设备描述表)上。我将 OpenGL 的着色描述表定义为 hRC 。要让您的程 序能够绘制窗口的话,还需要创建一个设备描述表,也就是第二行的内容。 Windows 的设备描述表被定义为 hDC 。DC 将窗口连接到 GDI(Graphics Device Interface 图形设备接口)。而 RC 将 OpenGL 连接到 DC。第三行的变量 hWnd 将 保存由 Windows 给我们的窗口指派的句柄。最后,第四行为我们的程序创建了 一个 Instance(实例)。 2取得窗口实例,定义窗口类并注册 3创建窗口并检查窗口是否成功创建。我们将传递 CreateWindowEx()所需的 所有参数。如扩展风格、类名字(与您在注册窗口类时所用的名字相同)、窗口 标题、窗体风格、窗体的左上角坐标(0,0 是个安全的选择)、窗体的宽和高。 我们没有父窗口,也不想要菜单,这些参数被设为 NULL。还传递了窗口的实例, 最后一个参数被设为 NULL。 4OPENGL 提供了有限数量的像素模式,它包括的属性有颜色模式,深度缓冲 区,等等内容。像素模式与渲染窗口、设备环境、以及所支持的数据类型相关 联。在创建一个渲染环境之前,必须使用一种适当的像素格式,既 PIXELFORMATDESCRIPTO 来进行设置 5创建窗口成功并响应相应的事件。如重置窗口大小和推出。之后将它设为前 端窗口(给它更高的优先级),并将焦点移至此窗口。然后调用 ReSizeGLScene 将屏幕的宽度和高度设置给透视 OpenGL 屏幕。 西安文理学院计算机科学系 课程设计报告 - 14 - 3.5 完成完成 WINDOWS 主程序主程序 创建 WINDOWS 主程序,首先创建 OPENGL 窗口,并等待消息。其次响应一 系列的鼠标事件,和键盘事件。最后销毁窗口,结束程序。其中的细节问题不 再阐述,见附录中的完整代码。 第四章第四章 设计结果及分析设计结果及分析 4.1 设计结果分析设计结果分析 程序解决了老师提出的问题及相关的要求,能够用鼠标控制正方体的旋转速度, 以及旋转方向。大致取得了满意的结果。体现出了 OPENGL 图形库的易用性与 强大的图形设计功能,而且十分容易上手学习使用。 通过这次设计,掌握了以下几大方面的内容: 1WINDOWS 消息消息机制。 2OPENGL 库的调用方法,以及使用 OPENG 创建窗口与 WINDOWS 的交互 过程 3OPENGL 绘制图形的基本过程。 4.2 进一步美化程序进一步美化程序 为了一部美化程序界面,在 OPENGL 的学习过程中发现,可以使用纹理映射来 更加真实的表现三维场景。于是见 3.1.1OPENGL 的主题绘制中的纹理映射的相 关代码。用一句话来说,纹理映射就是将图像贴到多边形的表面,从而表现出 真实效果的一种技术。本程序中的具体实现只是比较简单的纹理映射。大家比 较熟悉的 CS 游戏中的纹理映射就制造出了相当逼真的枪战效果。这里限于篇 幅不再阐述,本程序相关内容详见附录中代码。 西安文理学院计算机科学系 课程设计报告 - 15 - 总总 结结 软件工程专业经过两年的课程学习,已经积累了相关高级语言程序设计的基 本知识。在学习了这么多的专业课程之后,如何体现本专业的实用性(在以后 的学习和生活中,如何能够更好的应用所学的内容)成为我一直在思考的问题。 通过本次课程设计:画出正方体并使之旋转这一题目,这一题目考察了程序设 计自顶而下、逐步细化的相关基本思想。 开始题目要求使用 C/C+或者 VB 语言来设计,为了克服并解决 C/C+编写 图新界面困难的问题,我查阅了相关资料。开始决定使用 WINDOWS 相关 API 来编写,但是看到复杂难以上手的 API 及 MFC 时,于是决定使用时下流行的 OPENGL 图形库来解决程序的核心问题。这就很好的体现了知识的实用性原则。 在以后的日子中可能很长一段时间里,OPENGL 还不会从历史舞台退去。微软 依旧会在主流编程平台上提供对 OPENGL 的支持。 OPENGL 结合 WINDOWS 并使用 C/C+语言来渲染可视化平面或立体程序 的办法,依旧不失为一个好的途径。 西安文理学院计算机科学系 课程设计报告 - 16 - 致致 谢谢 首先特别感谢孙少波老师,在一开始就为我们提供的使用 OPENGL 图形库的 思路,其次感谢雷伟军老师的悉心指导以及张红祥老师对于 WINDOWS 坐标系 的讲解。最后感谢本小组成员之间的通力合作,程序相关的代码是与邓楠轶同 学共同探讨完成的,在此也特别感谢。 西安文理学院计算机科学系 课程设计报告 - 17 - 参考文献参考文献 1谭浩强 C 程序设计(M)(第三版) 清华大学出版社 2010 2严蔚敏.吴伟民 数据结构M 高等教育 2004 3钱能 C+程序设计教程(M)(第二版)清华大学出版社 2009 4Edward Angel OPENEL 程序设计指南(M)(第二版) 清华大学出版社 2005 西安文理学院计算机科学系 课程设计报告 - 18 - 附录附录 主要程序代码: #include / Windows 的头文件 #include / 包含 OpenGL 实用库 #include #include /OpenGL 辅助库 #pragma comment(lib, “glaux.lib“) HGLRC hRC=NULL;/ 窗口着色描述表句 柄 HDC hDC=NULL;/ OpenGL 渲染描述表 句柄 HWND hWnd=NULL;/ 保存我们的窗口句 柄 HINSTANCE hInstance;/ 保存程序的实例 boolkeys256;/ 保存键盘按键的数组 boolactive=TRUE;/ 窗口的活动标志,缺省 为 TRUE float m_mousex; /距离屏幕中心的 x 轴距离 float m_mousey; /距离屏幕中心 的 y 轴距离 float m_width; float m_height; GLfloatxrot;/ X 轴旋转量 GLfloatyrot;/ Y 轴旋转量 西安文理学院计算机科学系 课程设计报告 - 19 - GLfloatz=-5.0f;/ 深入屏幕的距离 GLuint filter;/ 滤波类型 GLuint texture1;/ 纹理的储存 AUX_RGBImageRec *LoadBMP(char *Filename)/ 载入位图图 象 FILE *File=NULL;/ 文件句柄 if (!Filename)/ 确保文件名已提供 return NULL;/ 如果没提供,返回 NULL File=fopen(Filename,“r“);/ 尝试打开文件 if (File)/ 文件存在么? fclose(File);/ 关闭句柄 return auxDIBImageLoad(Filename);/ 载入位图并返 回指针 return NULL;/ 如果载入失败,返回 NULL int LoadGLTextures()/ 载入位图并转换成纹理 int Status=FALSE;/ 状态指示器 AUX_RGBImageRec *TextureImage1;/ 创建纹理的存 储空间 memset(TextureImage,0,sizeof(void *)*1);/ 将指针设为 NULL / 载入位图,检查有错,或位图不存在的话退出 if (TextureImage0=LoadBMP(“pic1.bmp“) Status=TRUE;/ 状态设为 TRUE glGenTextures(1, / 创建纹理 / 使用来自位图数据生成 的典型纹理 glBindTexture(GL_TEXTURE_2D, texture0); / 生成纹理 glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0- data); 西安文理学院计算机科学系 课程设计报告 - 20 - glTexPara

温馨提示

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

评论

0/150

提交评论