毕业设计基于OpenGL的游戏设计_第1页
毕业设计基于OpenGL的游戏设计_第2页
毕业设计基于OpenGL的游戏设计_第3页
毕业设计基于OpenGL的游戏设计_第4页
毕业设计基于OpenGL的游戏设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、毕业设计(论文)基于OpenGL的游戏设计 教学单位 计算机科学系学生学号 061712412本科毕业论文(设计)题目 基于OpenGL的游戏软件设计学生姓名 夏 德 雄 专业名称 计算机科学与技术专业 指导教师 李 志 敏2008年3月18日基于OpenGL的游戏软件设计摘要:本软件是基于OpenGL,使用计算机图形学相关知识,在VC+环境下实现的3D游戏软件系统。该软件集可操作性,实用性,趣味性于一体,通过美观逼真的场景,丰富的色彩及友好的界面以实现各种算法。本课题讲述了OpenGL的相关知识,并按游戏制作的步骤一步一步完成。课题中程序涉及到以下几个模块:OpenGL的程序框架;OpenG

2、L的基本图形;OpenGL的组合图形;游戏场景生成;OpenGL中的文字显示;特殊平面_树木;显示3D模型;3D动画模型;射击、爆炸;碰撞检测;游戏进度保存;3D场景编辑等。关键词: OpenGL; 3D动画模型; 随机地面; 射击与爆炸; 碰撞检测;Design Game Software Based on OpenGLAbstract:We present a 3D game system based on OpenGL which runs under VC+.It gathers the maneuverability, practicability and interesting t

3、ogether and gives us a good-looking and lifelike scene. It also gives us abundant of color and friendly interface. So we can implement kinds of algorithms by the software. This design guides us how to develop game software.This paper contains modules as follows: the frame of program of OpenGL; basic

4、 graphics of OpenGL; combination graphics on OpenGL; creating the sky and terra; showing words in OpenGL; special plain and tree; showing the 3D model; 3Dcartoon-model; shooting and exploding; collision check; saving the schedule; the scene compilation of OpenGLKeywords: OpenGL; 3Dcartoon-model; ran

5、dom-ground; shooting and exploding; collision check目 录1引言11.1 概述11.1.1 本课题的研究目的及意义11.1.2 本课题国内外研究现状11.2 需求分析21.3 开发工具选择32什么是OpenGL32.1 OpenGL的特点32.2 OpenGL的基本原理43 OpenGL的图形生成53.1基本图形的绘制方法63.2窗口模式下的像素绘制73.3 复杂图形的生成83.3.1模型骨架构成83.3.2外观真实化84场景生成与渲染94.1摄像机原理和构成94.2地面生成方法104.3天空生成方法104.4树木草地生成方法105 OpenG

6、L显文字116模型与动画的生成126.1 三维模型绘制及读入:126.2 动画模型的实现136.2.1使用双缓存实现动画136.2.2后备缓冲模型的算法实现146.2.3窗口模式下的游戏动画156.3 特殊动画模型157 射击爆炸与碰撞检测167.1爆炸、粒子167.2 碰撞及检测187.2.1 通过范围检测碰撞187.2.2 通过颜色检测碰撞187.2.3 通过行进路线检测碰撞198 游戏剧情规划208.1游戏主题的确立218.2剧情的发展过程218.3主要人物的突出218.4悬念的安排218.5节奏与风格的选取229 游戏保存229.1进度保存229.2 3D场景编辑2310 本软件测试2

7、411 系统评价和改进24结束语25参考文献26致 谢271引言我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体我们又生活在一个充满信息的世界中,能否尽快地理解并运用这些信息将直接影响事业的成败,所以我们需要用一种最直接的形式来表示这些信息。OpenGL使人们进入三维图形世界OpenGL已被认为是高性能图形和交互式视景处理的标准最近几年计算机图形学的发展使得三维表现技术得以形成,这些三维表现技术使我们能够再现三维世界中的物体,能够用三维形体来表示复杂的信息,这种技术就是可视化(Visualization)技术。可视化技术使人能够在三维图

8、形世界中直接对具有形体的信息进行操作,和计算机直接交流。这都依赖于计算机图形学、计算机可视化技术的发展。人们对计算机可视化技术的研究已经历了一个很长的历程,而且形成了许多可视化工具,其中SGI公司推出的GL三维图形库表现突出,易于使用而且功能强大。OpenGL是一种图形与硬件的接口。它包括了个图形函数,开发者可以用这些函数来建立三维模型和进行三维实时交互。与其他图形程序设计接口不同,OpenGL提供了十分清晰明了的图形函数,因此初学的程序设计员也能利用OpenGL的图形处理能力和1670万种色彩的调色板很快地设计出三维图形以及三维交互软件。OpenGL强有力的图形函数不要求开发者把三维物体模型

9、的数据写成固定的数据格式,这样开发者不但可以直接使用自己的数据,而且可以利用其他不同格式的数据源。这种灵活性极大地节省了开发者的时间,提高了软件开发效益。长期以来,从事三维图形开发的技术人员都不得不在自己的程序中编写矩阵变换、外部设备访问等函数,这样为调制这些与自己的软件开发目标关系并不十分密切的函数费脑筋,而OpenGL正是提供一种直观的编程环境,它提供的一系列函数大大地简化了三维图形程序。OpenGL提供一系列的三维图形单元供开发者调用。OpenGL提供一系列的图形变换函数。 OpenGL提供一系列的外部设备访问函数,使开发者可以方便地访问鼠标、键盘、空间球、数据手套等这种直观的三维图形开

10、发环境体现了OpenGL的技术优势,这也是许多三维图形开发者热衷于OpenGL的缘由所在。用简单图形来构成两个复杂一点的模型引入摄像机方法,在OpenGL场景中漫游场景在OpenGL场景中显示天、地、物在OpenGL场景中显示3DS模型OpenGL场景产生3D动画 MDL骨骼动画在OpenGL上的调用和显示逼真的爆炸效果,是用程序仿真爆炸的物理过程子弹与目标碰撞,游戏有真实感场景 或进度 保存和调入是游戏必不可少3D场景编辑的核心算法是3D场景中对象拾取,因为只有有效的选择对象,才能对它进行位置编辑界面友好1.3 开发工具选择依据需求分析,OpenGL的基本框架由四个函数组成。3 OpenGL

11、的图形生成OpenGL是一个与平台无关的三维图形接口,操作系统必须提供像素格式管理和渲染环境管理。OpenGL在Windows NT上的实现是基于Client/Server模式的,应用程序发出OpenGL命令,由动态链接库OpenGL32.DLL接收和打包后,发送到服务器端的WINSRV.DLL,然后由它通过DDI层发给视频显示驱动程序。如果系统安装了硬件加速器,则由硬件DDI来处理。OpenGL采用渲染上下文RC Render Context,又称渲染描述表 绘图。渲染上下文主要由以下6个wgl函数来管理:HGLRCwglCreateContext GDC hdc 、BOOLwglDdlet

12、eContext HGLRC hglrc 、HGLRCwglGetCurrentContext void 、HDCwglGetCurrentDC void 、BOOLwglMakeCurrent HDC hdc,HGLRC hglrc 、BOOLwglUseFontBitmaps HDC hdc, DWORD dwFirst, DWORD dwCount, DWORD dwBase OpenGL中所图形都是由点glVertex3f 构成,基本图形画法形式如下glBegin type ; /连接各顶点的方式/图形的顶点坐标集;glEnd ;顶点连接方式(构图类型)决定了构成图形的形式。点void

13、 Point /画点 glBegin GL_POINTS ;/单个顶点glVertex3f 0.0f, 1.0f,-1.0f ;/a点glVertex3f -1.0f,-1.0f, 0.0f ;/b点glVertex3f 1.0f,-1.0f, 0.0f ;/c点glEnd ; 线void Line /画线 glBegin GL_LINE_LOOP ;/闭合折线glVertex3f 0.0f, 1.0f,-1.0f ;?/a点glVertex3f -1.0f,-1.0f, 0.0f ;?/b点glVertex3f 1.0f,-1.0f, 0.0f ;?/c点glEnd ; 面void Tria

14、ngle /画面 glBegin GL_POLYGON ;/填充凸多边形glVertex3f 0.0f, 1.0f,-1.0f ;/a点glVertex3f -1.0f,-1.0f, 0.0f ;/b点glVertex3f 1.0f,-1.0f, 0.0f ;/c点glEnd ; 3.2窗口模式下的像素绘制在窗口模式下,不允许页面交换。必须使用双缓冲显示模型,只能在缓冲中创建一个同用户区一样大小的另一个画面,在它上面绘制,然后变换到主画面上窗口中的用户区。为此,初始化DirectDraw时,必须使用DDSCL_NORMAL参数设置合作层,并调用GetWindowsRect 函数获得用户窗口。在

15、屏幕窗口内点P x, y 用color进行。绘制的程序代码如下:Void DrawPixel int x, int y, UCHAR color DDSURFACEDESC2 ddsd; RECT client;GetWindowRect handle, &client ; DDRAW_INIT_STRUCT ddsd ;Lpddsprimay - Lock NULL, &ddsd, DDLOCK_SURFACEM-EMORYPTR|DDLOCK_WAIT, NULL ;UCHAR*primary buffer UCHAR* ddsd.lpSurface;Primary_ bu

16、fferx +y* ddsd.lPitch color; lpddsprimay- Un-Lock NULL ; 3.3 复杂图形的生成用OpenGL的基本图形和坐标变换,来构造我们在后面游戏可能用到的模型,以此了解在3D游戏中各种琳琅满目的三维形象构成方法,也进一步理解OpenGL的基本图形和坐标变换。用途绘图命令螺旋桨、机翼auxSolidBox 长方体机头auxSolidSphere()球机身。auxSolidCylinder 圆柱机尾auxSolidCone 圆锥图3-2飞机部件合成3.3.2外观真实化OpenGL中实现外观真实化的主要方法是贴图。提供的在模型上贴图的方法也有许多,比如

17、在长方形表面加上墙面的贴图,造就一幢逼真的房子,在上例中飞机外表贴上飞机表面图片显示为一架逼真的飞机,在3D游戏中这种贴图方法比较普遍。下图给出了飞机与雷达站的示例与构造方法:(雷达站的天线中可以旋转的我们摄像机,就可以在OpenGL场景中漫游了察世界我们的眼睛一架照机,将外部影像到我们的大脑。在3D图形处理技术中,有类似我们眼睛的gluLookAt 参数列表 ,如果观察点在OpenGL场景中的位置发生变化,我们在计算机屏幕上的图像(我们大脑的映象)就发生变化。在OpenGL中观察虚拟世界的主要函数gluLookAt ,它的主要的作用是可以改变我们在OpenGL场景的观察点,这个观察点就好像是

18、我们的眼睛,也好像是我们手中的摄像机。我们在一个场景中行走时,看到前面的物景越来越近,两边的物体在向后退,这就是我们的观察点在场景中的位置改变的结果。一个平行于OpenGL场景XZ面的网状面,将它为地面,以此观察漫游效果。在用双重FOR循环生成地面的平面,这个平面是一个三维量,其中的高 Y分量 取随机数。并形成顶点索引和贴图索引。显示时用命令glDrawElements . ;显示由顶点数组指定的面,结果就形成了高低不平的曲面。在这个曲面上贴上表示地面的图形,就形成了。天是由一个长方体 称为天空盒 ,在它的各个面上贴有表示天的图片形成的。用于天空背景的图片有特殊要求。4面图的边与顶图的边相连,

19、4面图前后相连。图片大小为2的N次方 32、64、128. 在OpenGL场景中栽些树种些草,让这个小世界充满生机在三维场景中的树,显示速度。OpenGL是一个3D图形界面,在它上面显示文字有别于在Windows图形环境下显示文字。在OpenGL上文字。?这文字显示是一种高效能的、以位图方式绘制字体的方法,它采用了一种平面图形的方法,所以显示的是平面文字?OpenGL中文字作为3D对象来显示这种3D文字可以缩放、旋转、贴图,有其它3D对象的所有特性。在程序还加入了对双字节汉字的处理,也能显示立体汉字。OpenGL显示平面汉字基本原理是:在系统内部建立一个字体的设备场景(MDC),用GDI方式将

20、文字在设备场景中形成单色位图,再用OpenGL的平面位图显示函数glBitmap()将文字显示出来。在实际应用中有一些专用的3D模型可以帮助我们构建各种复杂的3D模型。我们怎样在自己的程序中使用这些3D模型 销毁DirectDraw接口对象等END(结束)6.2.3窗口模式下的游戏动画在窗口模式下,工作在8位彩色深度的800×600或更高的分辨率模式,当改变调色板时,其它应用程序会变得难看,因为每个在桌面上运行的应用程序都有一个逻辑调色板,存放着要用的色彩。但是,物理调色板实际上只有一个。物理调色板反映实际的硬件调色板,当应用程序想聚焦时,逻辑调色板被激活,Windows调色板管理器

21、将色彩以最大程度映射到物理调色板,所以,为了使其它程序正常工作,我们必须调整Windows的调色板管理器,留下大约20个调色板入口(Windows和系统色彩)。所以,将全屏幕绘制扩展为窗口模式,我们必须设计一种8位彩色调色板,包含使其它程序正常工作的16基色,使3D游戏建立在该调色板模式上。6.3 特殊动画模型骨骼动画模型是形象模型为蒙皮,动作架构为骨骼而有机组成的3D动画。骨骼动画的优势所在,是用线段代表动物的骨骼关节,动物的一切复杂动作,是用数据量极小的线段在空间位置的变化来表示。不管动作什么变,动物的形象模型只有一个,这个形象模型就象动物的皮肉一样,随着骨骼的位置变化而变化。所以即使很小

22、MDL模型文件,却可以做出极为丰富的动作。爆炸效果,它们原理上是利用程序仿真爆炸的物理过程3D场景中爆炸效果不是图片回放,而是用程序仿真爆炸的物理过程,3D中“爆炸、燃烧、喷泉、水流”等等都是基于 “粒子” 算法auxDIBImageLoad 函数实现。粒子与场景的初始化主要包括绘制场景的初始化和其它一些数据的初始化,包括粒子的纹理数据、各粒子及参数的初始化等。粒子与场景的绘制函数是程序的核心代码,具体包括屏幕颜色缓冲区和深度缓冲区的清除、各粒子的绘制等。多个粒子构成粒子系统,它是不断进化的,在生命的每一时刻它都进行以下四部分活动:由粒子源产生新的粒子更新粒子属性删除“死粒子”绘制粒子程序中爆

23、炸粒子图像的形成是基于一个平面矩形,在矩形上贴有粒子图片。爆炸时,每一个无序的粒子都用一个带有粒子贴图的矩形块的运动代替,这个带有粒子贴图的矩形块在作了透明等处理后,图像就是一团火球。众多的火球在一起就是爆炸的图像效果。加入鼠标操作,场景方位角左右移动、俯仰角上下移动由鼠标的移动完成7.2 碰撞及检测物体间的碰撞应用到游戏中,比如说人物走到了窗口的尽头,或者碰撞到了其它的物体等等,这时都要进行检测。而事实上检测碰撞的方法不只一种,有的碰撞检测是通过范畴来检测碰撞,有的碰撞检测是通过颜色来检测碰撞,有的则是通过行进路线是否交叉来检测碰撞。7.2.1 通过范围检测碰撞通过范围检测碰撞的方法适用于可

24、取得其范围大小的规则几何图形。它是一种最简单、最快速的检测方法。只不过在制作游戏程序时,使用到非规则形状图形的情况非常多,但如果在允许的范围内,我们希望能够用这种方法来检测物体是否碰撞,这将节省到很多用于计算的时间。如果我想要更精确地判断非规则形状的物体是否产生碰撞,最常用的方法还是利用颜色来判断。7.2.2 通过颜色检测碰撞 通过颜色检测碰撞的方式比较麻烦,不过这种方法却可以很精确地判断两个非规则物体是否真的发生了碰撞。例如,有这样一种情况,汽车与树发生碰撞的检测:我们先将树的颜色作黑色处理,那么判断的要点就是黑色部分与汽车 非纯色 是否会产生交集,因为任何颜色与黑色做“与”运算后的结果都是

25、黑色,所以将黑色与汽车的颜色进行“AND”运算,看结果是否有黑色部分,而那个黑色部分就是进行了碰撞的部分。 图7-2通过颜色判断检测实例效果图7-3通过颜色判断检测原理分析7.2.3 通过行进路线检测碰撞通过行进路线来检测是否发生碰撞的方法主要用来检测两个移动的物体,或者是移动物体与平面是否发生碰撞,如图7-4示:两球行进路线交叉有可能发生碰撞 球行进路线与平面交叉可能会碰撞图7-4通过行进路线检测碰撞论文程序中用到了子弹的碰撞检测算法如下:/子弹碰撞检测算法Bool baiscobj:Hitexamina float x, float y, float z for int k 0;k 6;k

26、+ /精确化子弹轨迹 for int i 0;i RNSHU;i+ /对所有人物对象循环检测 if m_anmobj- mani.dz 15 continue;/死的就不要再打了if abs m_anmobj- mani.qd0-x 1.0f&&abs m_anmobj- mani.qd1+z 1.0f continue; /已打偏了 if abs m_anmobj- mani.qd0-x .1f&&abs m_anmobj- mani.qd2-y .1f&&abs m_anmobj- mani.qd1+z .1f /打中 m_anmobj- m

27、ani.dz 16+rand %3; /取3种死法之一m_anmobj- framei m_ anmobj- anim0m_ anmobj- mani.dz.start;rocketX x; rocketZ z; rocketY y; /子弹位置取击中位置rnshu-;/人物数-1return true; /返回命中 x+ 1.0f*cos rad_xz ;/X方向的精确化步进z+ 1.0f*sin rad_xz ;/Z方向的精确化步进y+ 1.0f*tan g_elev*PI/360 ;/Y方向的精确化步进 return false; /返回未命中,场景 或进度 保存和调入是游戏必不可少的场

28、景,给提供的在我们这个游戏中,有这样一些数据随调入的文件不同,可以决定游戏的场景不同。它们可以由外部文件来决定。诸如地形、地表贴图、天空背景、树木的分布道具模型。一些数据表示了当前的游戏进度,如视点位置(我们走到那里了)、游戏中角色的活动情况、敌人的存活数量等等。我们将这些数据保存到一个文件中,下次有调入这个文件,游戏就回到上次保存时的状态了。在这我们调整了游戏中的基本对象的数据结构。建立了以下文件操作新建场景文件调入场景文件存贮场景文件程序开始运行时调入的场景 进度 文件"aa.txt"。如果没有场景 进度 文件,就调用新建场景文件功能,初始场景。程序退出时提示存贮,场景

29、 进度 将存为"aa.txt"文件。下次运行时就自动调入了。3D场景中对象拾取,因为只有有效的选择对象,才能对它进行位置编辑。3D对象的屏幕拾取的关键,是将鼠标在屏幕上的平面位置 int mouse X,int mouse Y 转换成3D场景中的立体位置xyz(xyz. x, xyz. y, xyz. z)。图9-2 2D平面与3D平面转换2 .场景的选择在程序运行时可以选择调入不同的场景文件。程序退出时可以将场景存为你新命名的文件。)2)本游戏软件的不足之处及其改进:本游戏软件只能完成CS对战类游戏的部分功能。如角色选择,多人联机战等功能有待提高。结束语通过这次毕业设计,我觉得自己学到了很多东西,主要有以下几点: 1 快速查阅各种资料和收集、整理资料的能力,这对以后参加工作学习和接受新知识是一种很好的锻炼。 2 平时学习的都是一些理论知识,并没有真正的去应用和动手实践。通过这次毕业设计,锻炼了动手能力。 3 毕业设计培养了严肃认真和实事求是的科学态度,而且培养了吃苦耐劳的精神及相应的工程意识,同学间友谊互助也充分在毕业设计中体现出来。参考文献1OpenGL三维图形系

温馨提示

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

评论

0/150

提交评论