基于OpenGL的三维射击类游戏引擎的开发

 2022-09-29 11:09

论文总字数:29724字

摘 要

近些年来,游戏引擎越来越得到游戏开发商的重视,一款优秀的游戏引擎可以为游戏制作带来巨大的便利。游戏引擎编写过程中,需要借助相应的图像接口,OpenGL是一个性能优越的图形接口,具备很好的系统可移植性和扩展性。

本文在MFC框架下,基于OpenGL图像接口,实现了一款射击游戏引擎的编写,该游戏引擎能够构建场景,包括利用天空盒搭建天空,产生高低起伏的地形变化,提供第一视角的场景摄像漫游功能。该引擎支持外部导入BMP位图,3DS模型,MD2和MDL骨骼动画,丰富场景的布置和添加射击对象。更进一步的,本文加入了粒子系统和碰撞检测模块,可以检测游戏玩家是否与场景中的物体发生碰撞并作出相应的反映,同时,在检测到子弹击中目标时,可以调用粒子系统,模拟出子弹发生爆炸的效果。该引擎基于面向对象的设计思想,对各功能模块进行了类封装,一方面可以根据需要在主程序中,选择调用相关的模块;另一方面,也便于引擎提供方针对各模块单独进行修改,具有较好的扩展性。

关键词:射击游戏引擎;OpenGL;摄像漫游;粒子系统;碰撞检测

ABSTRACT

In recent years, Game engines get more and more attention to the game developers, and a good game engine for the game can bring great convenience. Game engines need to use the appropriate image interface, OpenGL is a superior performance of the graphical interface, with good system portability and scalability.

In the MFC framework, based on the OpenGL image interface, to achieve a shooting game engine, the game engine to build the scene, including the use of sky box to build the sky, resulting in ups and downs of terrain changes, providing the first perspective of the scene camera roaming Features. The engine supports external import BMP bitmaps, 3DS models, MD2 and MDL skeletal animations, rich scene layout and add shooting objects. Further, this article incorporates the particle system and the collision detection module to detect whether the game player collides with the object in the scene and makes a corresponding reflection. At the same time, when the bullet is hit, the particle system can be called and the Bullet explosion effect. The engine is based on object-oriented design ideas, the functional modules of the class package, on the one hand according to the need in the main program, select the call related modules; the other hand, it is also easy to provide the engine for each module to modify, Has a good scalability.

KEY WORDS: shooting game engines; OpenGL; camera roaming; particle system; collision detection

目 录

第1章 绪论 1

1.1 课题背景和研究意义 1

1.2 OpenGL与DirectX介绍 2

1.3 本文的工作和结构 2

第2章 相关理论基础 3

2.1 OpenGL变换 3

2.2 OpenGL光照与材质 5

2.2.1 光照模型 5

2.2.2 材质 7

2.3 纹理映射 7

2.3.1 BMP位图文件 7

2.3.2 OpenGL纹理映射 8

第3章 系统设计与实现 10

3.1 系统需求 10

3.2 场景搭建 11

3.2.1 天空:天空盒 12

3.2.2 地形 12

3.3 摄像漫游 15

3.4 资源管理 16

3.4.1 特殊平面树 16

3.4.2 3DS模型 17

3.4.3 MD2动画 19

3.4.4 MDL 动画模型 20

3.5 显示字体 22

3.6 粒子系统:爆炸 23

3.6.1 粒子系统的介绍 23

3.6.2 粒子系统的设计与实现 24

3.7 碰撞检测 26

3.7.1 碰撞绕行 27

3.7.2 子弹碰撞 28

第4章 总结与展望 29

4.1 全文总结 29

4.2 展望 29

第1章 绪论

1.1 课题背景和研究意义

游戏产业是当今世界蓬勃发展的行业之一。根据Newzoo发布的2017游戏市场调研预测报告显示,2017全球游戏市场的规模将会达到1089亿美元,其中,中国游戏市场的规模所占的比重也将会超过美国,成为全球第一名[[1]]。纵观2008年到2013年,如下图1-1所示,中国游戏总收入增长了将近4倍,表现出了极为强劲的势头。

图1-1 中国游戏市场增长

游戏正在成为全民娱乐的一种重要休闲方式。这其中一个重要的原因是由于技术的创新,如高品质的图形卡和更快的处理器。这些改进也更有利于3D游戏的开发,与2D游戏相比,3D游戏为用户提供了更加立体逼真的环境场景和丰富的图形模型。这其中,3D射击游戏自游戏一直是一个深受大众喜爱,经久不息的游戏种类[[2]]。纵观射击游戏的发展史,最早可以追溯到1962年美国麻省理工学院在一款名为PDP-1的电脑中,实现了一款名为《Spacewar》的多人飞船射击游戏。而历史上第一款商业射击游戏是1971年,基于一款叫做《电脑空间》的街头游戏机,其游戏射击对象依然以像素点为主。再后来,随着技术的不断革新,显示效果,以及射击的实现日益丰富,涌现出一大批饱受人们欢迎的设计游戏,包括80年代影响了一代人的经典动作射击游戏《魂斗罗》,到90年代的《合金弹头》。90年代最早应用于视频电影制作的3D技术逐渐进入游戏领域,1998年发行的《半条命》算是颠覆了射击游戏的传统认知,特别是第一视角的射击游戏。1999年发行的《反恐精英》成为二十世纪极为出色的一款射击游戏,其游戏的受众遍布世界各地,直到今天,仍有许多玩家在玩着这款跨世纪的游戏。两千年后,随着游戏引擎的出现和迅速发展,射击游戏的制作效率得到了很大提高,同时,依赖优异的射击游戏开发引擎,游戏画面的华丽程度以及游戏的沉浸感都有了质的突破,越来越多的游戏画面犹如电影一般真实,比如《使命召唤》,《战地》等等[[3]]

中国游戏市场规模越来越大,中国的游戏制作厂商也应该将自己的作品推向国际市场,让世界认可来自中国的游戏。同时,现在的3D射击游戏越来越依赖于游戏引擎,好的游戏引擎能够给游戏的开发提供很多便利,所以研究和开发属于自己的游戏引擎对游戏行业的发展具有极为重大的意义,即使该课题中开发的三维射击游戏引擎不能像国内外其他引擎一样,拥有丰富的功能和精细的画质渲染,但通过该课题,对三维图形游戏引擎进行研究并尝试自己搭建属于自己的引擎仍具有很大的意义。

1.2 OpenGL与DirectX介绍

OpenGL和DirectX是两类应用图形接口API(Application Programming Interface),目前有许多游戏开发都使用了这两类的API接口,本小节将对这两种API做一定的介绍,并比较两者的不同。

OpenGL(Open Graphics Library)直译过来叫做“开放图形库”,OpenGL是使用编程语言C实现的,OpenGL作为一种图形API,没有依赖于任何一种编程语言,可以通过适当的绑定在几乎所有的语言中调用。OpenGL可以为编程者提供一些小的几何图元,比如点、线,其采用的模式是一种状态机,里面内置了颜色,视图变换,光照等等状态,如果打开某一状态后,在之后所有用到该状态的操作中都将保持,直到对该状态进行修改或者关闭。

OpenGL具有非常良好的易用性,其指令直观,定义清楚,封装了基本的硬件信息,代码量小,执行的效率很高。由于OpenGL是低级的图像API接口,所以其具备良好的扩展性,开发商可以在根据各行业的需要,向其中加入相关的绘图功能,而OpenGL自身的版本迭代也不断更新着对硬件特性的升级。同时,利用该接口开发的程序将具有很好的可移植性,只要硬件符合OpenGL的API标准,即可进行运行,不需要另外加装驱动程序,而开发者又可以利用其扩展性,进行软件更新,极大的减少了利用该技术开发的成本。当然,该接口也有不足,由于它是一个纯粹的底层图形接口库,所以需要人工完成创建窗口,管理。如果程序中涉及使用鼠标,键盘等设备,需要额外编程实现对这部分的支持。该课题是基于OpenGL接口库进行编写的。

DirectX是由美国微软公司开发的一套底层应用程序编程接口(API)[[4]]。该接口由多组API接口组件构成,包含二维和三维图形处理,声音管理,输入设备接口,应用通信等相关模组。与OpenGL相比,微软是设计和开发DirectX API的完整和唯一的公司,而OpenGL则由Khronos Group维护。DirectX需要Windows操作系统,OpenGL则可跨平台使用,独立于操作系统,这也是其最大的优点所在。另外,与DirectX相比,OpenGL的图形质量也更好,而且可以通过较为简单的指令代码就可以实现较为复杂的效果。而且,OpenGL在嵌入式设备中有一个称为OpenGL ES的子集。现在它是嵌入式设备最广泛接受的图形标准。

1.3 本文的工作和结构

本文利用OpenGL的图形接口,在MFC框架下,实现一款射击游戏引擎的编程,借助该引擎,可以搭建场景,包括天空和地形,插入文字,具备场景的摄像漫游,并可以向场景中导入特定格式的模型和动画,最后,该引擎还加入了简单的粒子系统和碰撞检测。

本文第一章为绪论,对课题的研究背景,射击游戏的发展史做了回顾,并比较了OpenGL和directX的异同。

第二章对OpenGL进行了相关理论原理的介绍,包括变换,光照模型,纹理贴图等等。

第三章首先介绍了该课题的功能性需求和系统的总结架构设计,之后详细阐述了各模块的实现方案。

第四章对全文进行了总结,并对未来该课题的更进一步做出了展望。

第2章 相关理论基础

2.1 OpenGL变换

为了能够将世界坐标系中绘制的三维立体图形在屏幕上进行显示,需要经过一连串相关的步骤和流程,如图2-1所示。首先需要将待显示的三维图形进行适当的平面变换,包括简单的方向移动,旋转,大小缩放等等。其次,需要定义一个三维视景体,通过投影变换,将三维物体降维,使其能够显示在屏幕上,并利用视景体,对所显示的部分进行选择裁剪[[5]]。最后,需要在屏幕中定义显示视口,经过变换,显示图像。

图2-1 三维图形的显示流程

在OpenGL中,所有的变换都需要借助基本矩阵运算进行。OpenGL中的物体坐标采用的是齐次坐标,进行变换的矩阵为4×4方阵[[6]]。所有的变换指令,都会隐含的生成一个变换矩阵,通过与当前矩阵进行简单的矩阵乘法运算,更新当前状态下的矩阵。

图2-2 顶点变换的过程

如图2-2所示,是顶点变换的过程。在OpenGL中有4种不同类型的矩阵:GL_MODELVIEW、GL_PROJECTION、GL_TEXTIRE与GL_COLOR。通过使用指令glMatrixMode()切换当前类型。

模型视点矩阵

物体坐标是模型物体的初始坐标,标示了模型在坐标系中的位置和方向。

模型视点矩阵GL_MODELVIEW,是将视点和模型变换矩阵进行了组合(Mview*Mmodel)。

视点坐标由模型物体坐标乘以GL_MODELVIEW矩阵产生的。

视点变换的主要目的是设置视点的位置和方向,为了得到正确的变换结果,需要反过来执行原先指定的变换顺序。在OpenGL库中,通过调用gluLookAt()函数进行视点变换,该函数的作用相当于生成一个视点变换矩阵,然后用该矩阵和当前矩阵进行矩阵相乘。

模型变换是选定一个坐标系,然后在坐标系下,对图形进行下进行平移,变转等操作,该课题中用到了以下3个指令:

glTranslatef()用于模型平移,利用最右面3个矩阵元素(,,)沿坐标系三轴进行平移变换。元素为齐次坐标,主要用于投影变换。变转glRotatef()与缩放glScalef()利用元素集合(,,)、(,,)与(,,)进行。

投影矩阵

三维物体是一个立体模型,而屏幕上某一时刻只能显示出二维平面,所以需要对待显示物体进行降维,后输出到平面进行显示。首先,需要定义一个视景体。视景体的作用是对模型对象进行选择,将我们希望显示在屏幕上的部分予以保留,而去掉其他部分。OpenGL库中,可以通过GL_PROJECTION矩阵用于定义视景体[[7]]

裁剪坐标是通过视点坐标乘以GL_PROJECTION矩阵变换而来的,其原理如下:

OpenGL提供两个GL_PROJECTION变换函数,即对应两种不同的投影方式:透视和正交投影。透视投影,如下图2-3所示。透视投影的效果犹如日常照相一般,从某一点向外看去,视野中的物体呈现近处大远处小的特点。其视景体的形状类似一个椎体,通过这样的投影,可以很好的模拟真实的情况。该课题中主要应用的也是透视投影。

图2-3 OpenGL透视景体

glFrustum()透视函数用于生成了一个透视矩阵,函数原型如下:

void glFrustum(GLdouble left, GLdouble Right, GLdouble bottom, GLdouble top,

GLdouble near, GLdouble far);

该函数定义了图中标记两点的三维坐标,即和,参数far是远裁剪平面离视点的距离值, 远裁剪平面的顶点坐标位置可以通过以下计算公式得到:

另一种投影方式为正交投影,如下图2-4所示,视景体的形状类似一个长方体,该投影的特点是,始终呈现投影物体真实的大小。

图2-4 OpenGL正交景体

投影除法

归一化坐标是经过投影除法获得,即将上一步骤中得到坐标经过除以w,该坐标属于规格化的设备坐标系中的坐标[[8]]。投影除法后,三坐标轴上的坐标值范围都在之间。

视口变换

视口变换的主要目的是将上一步中,保留在视景体中的模型部分表示出来。视口指的是一特定矩形区域,在经过该变换过后,对投影除法后得到的设备坐标进行一定的平移和大小的改变来渲染屏幕,该步骤过后,得到窗口坐标[[9]]

OpenGL库中相关函数为:

glViewport(x,y,w,h);

剩余内容已隐藏,请支付后下载全文,论文总字数:29724字

您需要先支付 80元 才能查看全部内容!立即支付

该课题毕业论文、开题报告、外文翻译、程序设计、图纸设计等资料可联系客服协助查找;