3D赛车游戏的设计与实现 - 图文

更新时间:2024-06-14 16:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

湖南大学毕业论文 第I页

HUNAN UNIVERSITY

毕业设计(论文)

设计论文题目

湖南大学毕业论文 第II页

Design and Implementation of

the 3D racing game

by

湖南大学毕业论文 第III页

3D赛车游戏的设计与实现

摘 要

3D赛车游戏是整个游戏行业的重要组成,随着游戏行业的快速发展,2D游戏的市场份额已经大幅下降,目前3D游戏越来越受广大玩家的喜爱,特别是3D赛车游戏,一直是玩家的宠儿。 本文实现了一款赛车游戏,该游戏分为场景渲染、赛车渲染、天空渲染、赛车在场景中的漫游、赛车的地形跟踪系统和碰撞检测等六部分。场景渲染、赛车渲染和天空渲染构成游戏的渲染画面,基于DirectX技术实现。赛车在场景中的漫游、赛车的地形跟踪系统和碰撞检测构成了游戏的主要逻辑。

本文在一款游戏引擎的基础上,通过将第三方软件制作的游戏场景模型和赛车模型导入到游戏中,完成对游戏的初始化;使用天空盒技术实现一个比较逼真的天空;通过输入模块完成对赛车的控制;通过摄像机类来实现漫游效果,通过汽车类来实现汽车的刚体运动,通过地形跟踪保持汽车始终位于地形之上来避免赛车穿透地形,通过碰撞系统使汽车始终行驶在赛道上,再将这些整合形成了三维赛车游戏。

论文最后对全文进行总结,并对后续工作进行了展望。 关键词:三维,DirectX,赛车,游戏,地形碰撞检测

湖南大学毕业论文 第IV页

Design and Implementation of the 3D racing game

Abstract

3D racing game is an important component of the gaming industry.With the development of the game industry, the market share of 2D game has dropped,and now more and more players love 3D game,especially the 3D racing game what alway is player's pet. We achieved a racing game, the game can be divided into the scene rendering, car rendering, sky rendering, car roaming,car tracking system and collision detection.Scene rendering, car rendering and sky rendering make up of the game screen, based on DirectX technology.Car roaming,car tracking system and collision detection make up of the main logic of the game.

湖南大学毕业论文 第V页

The game base on a third-party game engine,through a third-party software to make game scenes models and car models,then import into game to complete the game initialization;To using the sky box technology to achieve a realistic sky;Through the input module to complete the control of the car;Through the class of camera to achieve the effect of roaming;Through the class of car to achiece the rigid body motion,through the terrain following to holding the car always located above the terrain,through the collision detection system to holding the car always running on the track.And then integrated to form a 3D racing game.

Key Words: 3D, DirectX, Car, Game, Collision System

目 录

摘 要 ............................................................................................. III Abstract ............................................................................................... IV 1绪论 .................................................................................................... 1

湖南大学毕业论文 第VI页

1.1课题来源、背景和目的......................... 错误!未定义书签。 1.2与课题相关的国内外研究综述 .............................................. 1 1.3本文的内容安排 ..................................... 错误!未定义书签。 2 DirectX、游戏引擎和游戏结构 ....................................................... 3

2.1 DirectX概述 ............................................................................. 3 2.2游戏引擎 ................................................................................... 5

2.2.1 游戏引擎概述 ................................................................. 5 2.2.1 选用的游戏引擎结构 .................................................... 5 2.3游戏结构 ................................................................................... 7 2.4本章小结 ................................................................................... 9 3游戏的汽车类模块、场景渲染、输入控制 ................................. 11

3.1输入检测和响应 ..................................................................... 11 3.2场景渲染 ................................................................................. 12

3.2.1天空盒技术 .................................................................... 12 3.2.2模型运用 ........................................................................ 14 3.2.3光照技术 ........................................................................ 18 3.3汽车类模块 ............................................................................. 19 3.4本章小结 ................................................................................. 19 4赛车的碰撞检测和测试 .................................................................. 21

4.1碰撞检测的相关技术 ............................................................. 22

4.1.1包围盒算法 .................................................................... 23

湖南大学毕业论文 第VII页

4.1.2 游戏引擎使用的BSP碰撞检测简要解析 ................. 27 4.2本文采用的碰撞检测技术 .................................................... 29

4.2.1 顶点/索引缓冲区 ......................................................... 30 4.2.2 地形的碰撞检测........................................................... 31 4.2.3 汽车与物体的碰撞检测 .............................................. 35 4.3测试 ......................................................................................... 35 4.4本章小结 ................................................................................. 35 5结论 .................................................................................................. 37 致谢 ..................................................................................................... 38 参考文献 ............................................................................................. 39 附录 ..................................................................................................... 40

湖南大学毕业论文 第1页

1

赛车是世界上的顶级运动,它使人们充满对速度的渴望.然而这项运动的赘用和危险同样高得惊人,以致令绝大多数爱好者望尘奠及,这些人不得不终日守在电视机前,借助想象力揣摩着车手究竟是如何驾驶赛车。80年代,电脑科技的迅猛发展改变了人们的生活,初出茅庐的虚拟技术使全世界车迷依稀触摸到速度的魔影;进入90年代,赛车游戏也进入到一个高速发展时期,模拟度越来越高的优秀作品不断给玩家和车迷带来惊喜;到了21世纪,电脑赛车游戏产业已发展到一个相当完善的程度,某些高水平作品的模拟度甚至达到90%以上。今天,就让我们踏上富于传奇色彩的速度之旅,来回顾 那些拥有无上经典的电脑赛车游戏。

1985年-1995年,对于刚刚诞生的电脑赛车游戏来说,这是一个相对幼稚的历史时期,落后的电脑硬件还不足以使程序员营造出逼真的视听效果和驾驶感觉。这一时代的经典赛车游戏有:《风驰电掣》,《马达城市》,《名车志》,《世纪金冠军》,《印地大赛车》,《云斯顿赛车》。

1996年-1999年,1996年,英特尔奔腾一代中央处理器掀起了电脑硬件革命,电脑赛车游戏也由此翻开了崭新的篇章。性能游戏的CPU使赛车游戏的表现力大为提升,程序引擎被个大公司大幅改进和优化,深奥的物理法则和高等数学也被引入其中。电脑赛车游戏进入高速发展时期。代表作有:《世纪金冠军2》,《拉力冠军》,《FI方程式赛车》,《摩托英豪》,《虚拟一级方程式大奖赛》,《横冲直撞》,《星球大战前传之极速飞梭》,《F1传奇》,《世嘉拉力2》[3]。

一款好的赛车是一个公司技术实力和策划能力的体现,能创造巨大的经济、社会效益。

1.2与课题相关的国内外研究综述

《极品飞车》目前可能是最受欢迎的赛车游戏,第一代作品诞生于1995,到目前已经诞生了13代作品。

在《极品飞车》中,玩家可以中仿照真实的地下改装车辆一般对自己的爱车进行从里到外的全面改造,当然,这是需要通过在游戏中获得比赛胜利,依靠奖金来实现的。高速奔驰下前方道路和环境移动的效果逼真绚丽。不论是黑夜中高楼林立的城市,眩目

湖南大学毕业论文 第2页

的霓虹灯残影,还是四周景物因高速而产生模糊效果都制作得非常细致。漂移、冲刺等等多种花样技巧的引入,使这款游戏具备了单纯竞速所不具备的快感。至于“辅助驾驶开关”也让游戏在驾驶和竞速方面得到了一定的平衡,给系统融入了新的活力。游戏的 ,第五章重点介绍了赛车游戏中的各种碰撞检测技术和本文采用的碰撞检测技术,最后第六章介绍了最终实现的赛车游戏的效果和缺陷。

湖南大学毕业论文 第3页

2 DirectX、游戏引擎和游戏结构

DirectX是PC平台上开发游戏的事实上的标准,游戏引擎能使开发游戏的工作量大大的减少。 2.1 DirectX概述

Microsoft公司的DirectX是一个多媒体应用编程接口工具包,用于为Windows操作系统开发交互式软件。DirectX诞生于1995年,已成为在Microsoft平台上开发多媒体软件的一种标准,全世界的开发人员都在使用它。DirectX主要用于游戏开发,但其中部分用于开发其他类型的软件,这些软件包括游戏虚拟角色,网络软件和游戏无关的图形软件。DirectX通过和底成硬件打交道,从而获取软件的最大性能[4]。如图2-1。

图 2-1基本应用架构

API DirectX主要由DirectGraphics、DirectInput、DirectPlay、DirectMusic和DirectSound组成。每个API之间相互独立,负责完成DirectX内核中不同的功能。DirectX中的每个API都可以通过硬件加速。这意味着这些API可以直接和运行软件的底成硬件对话。这样可以带来很好的性能,并提供开发商业软件的能力。

DirectGraphics主要负责向屏幕上渲染二维图形和三维图形。

湖南大学毕业论文 第4页

DirectInput可以直接使用所有与计算机关联的输入设备。这些设备包括键盘、鼠标、和游戏控制器设备。通过DirectInput,可以最快速确定作为输入设备的状态。更重要的是,DirectInput可以和所有现在的或将来的输入设备对话。由于DirectInput的本质,所以使用它可以很容易的支持以后的输入的设备,而不必更新自己的API。

DirectPlay可以让应用程序对机器进行网络功能设置,从而可以通过连接和其他网络玩家交流。

DirectMusic和DirectSound负责与声音相关的操作,两者在控制声音的数量方面存在差异,DirectMusic可以提供更多的底成控制与更多的灵活性,而且方便使用。而使用DirectSound就不必做很多的控制,因为DirectSound比DirectMusic更高级些。

DirectX目前已经发展到到DirectX10.1,从很不成功DirectX 1到引发了显卡革命的DirectX 8,在到目前的DirectX10.1,这一路走来,DirectX给游戏业带来了巨大的发展。接下来的DirectX最新产品是DirectX11,DirectX 11增加了新的计算shader技术,可以允许GPU从事更多的通用计算工作,而不仅仅是3D运算,这可以鼓励开发人员更好地将GPU作为并行处理器使用。另外,DirectX 11还支持tessellation镶嵌化技术,这有助于开发人员创建更为细腻流畅的模型,实现高质量实时渲染和预渲染场景。多线程是DirectX 11的另外一大亮点,DX11可以更好地利用多线程资源,从而使游戏更有效地利用多核处理器。

湖南大学毕业论文 第5页

2.2游戏引擎 2.2.1 游戏引擎概述

游戏引擎是游戏中与具体的游戏无关的核心技术部分,而游戏的部分就是场景和角色模型、动画、声音和代码等其他控制部分。经过游戏业的不断的发展,如今的游戏引擎己经发展为一套由多个子系统共同构成的复杂系统。一般这些引擎都是3D游戏引擎,从建模、动画到光影、粒子特效,从物理系统、碰撞检测到文件管理、网络特性,还有专业的编辑工具和插件,几乎涵盖了开发过程中的所有重要环节。游戏引擎就是游戏开发者们为了降低重复劳动,节省开发时间和开发费用而诞生的,它封装了些在游戏制作中常用的功能,让我们能直接调用这些功能而不用在从头编写。 2.2.1 选用的游戏引擎结构

在3D游戏中,游戏引擎涵盖的内容很多。选用的该游戏引擎是一个处理所有事务的系统,它是一个控制模块,向所有的子系统发出命令。因此,需要与每个游戏子系统联系。该游戏引擎也是一个容器,它容纳了其他所有的组件,控制整个系统的各个部分。

目前该3D游戏引擎实现的功能模块包括:声音控制、输入控制、图形渲染、游戏界面控制等。其中图形渲染是引擎的核心模块,涉及面较广,目前实现的功能点包括:顶点、纹理、光照、材质、文字、雾化、天空盒、摄像机、广告牌、静态网格模型、骨骼动画、粒子特

湖南大学毕业论文 第6页

效、LOD地形场景、地形多层细节纹理等。最后,使用BSP技术实现了碰撞检测。

该游戏引擎各模块之间的协同操作如图 2-2所示。

图 2-2引擎各模块之间的协同操作

输入系统:接受玩家的键盘、鼠标等外设的输入信息,然后引擎对这些信息进行响应作出相应效果(即游戏逻辑处理),实现与玩家的交互。

声音控制:加载、播放、停止声音等操作。并提供较逼真的三维音效,使玩家如身临其境的感觉。

游戏UI:即游戏的界面。加载图片实现了图形化的界面控件。方便玩家对游戏进行操作,提高用户体验性。

图形渲染:是整个引擎的核心模块,涉及面较广,主要功能是绘制渲染三维游戏世界。目前实现的功能点包括:顶点、纹理、光照、

湖南大学毕业论文 第7页

材质、文字、雾化、天空盒、摄像机、广告牌、网格模型、粒子特效、地形场景等。

碰撞检测:主要使用了二叉空间分割技术,把碰撞网格存储进二叉树,实现快速的碰撞检测。

2.3游戏结构

游戏与其他应用软件有着一定的区别,它不是我们的单线、事件驱动或顺序逻辑的程序。一个3D游戏本质上是一个持续不断的while循环,它执行逻辑并在屏幕上不间断的绘制更新图像——通常以40~60帧每秒或更高的速度不断的绘制[5]。这类似于电影放映方式,不同的是,我们将控制电影的情节发展。

本引擎中所使用的游戏最基本的流程框架如图 2-3所示。

图2-3 3D游戏基本流程框架

初始化:这部分执行与其他任何程序类似的标准操作,如内存分配、资源获取、从磁盘加载数据等。

湖南大学毕业论文 第8页

进入游戏循环:这部分进入主游戏循环,用户将在这里不断地执行动作,直到退出主循环为止。

读取玩家输入:这部分处理玩家输入,或将其存储到缓冲区中,供游戏逻辑使用。

执行游戏逻辑:这部分包含游戏代码的主体部分,将执行人工智能、物理系统和通用游戏逻辑,并根据结果在屏幕上绘制下一帧。

图形渲染:在这一部分中,将根据玩家输入以及逻辑的执行结果,生成下一个游戏动画帧。在甚于3D游戏引擎中,将由一个复杂的3D图形流水线来渲染构成世界的成千上万甚至上百万个多边形。在基于Direct3D的3D硬件加速中,大部分工作都由硬件来承担。

循环:这部分相当简单,只需返回到游戏循环的开头,然后重新执行整个循环。

关闭:这是游戏的末尾,意味着用户退出游戏循环,并返回到操作系统。但是,与其它任何软件一样,需要在返回操作系统之前释放占用的所有资源,并清理系统。

游戏控制台控制流程如图 2-4所示。

湖南大学毕业论文 第9页

图2-4 游戏控制台的控制流程

2.4本章小结

本章主要介绍了DirectX和游戏引擎,让我们了解两者的大概功能和关系。在了解两者的基础上,着重介绍了该游戏选用的游戏引擎的各个功能模块及各模块是如何协同工作的,为接下来的游戏制作打下了坚实的基础。最后介绍了下游戏的基本结构,一个游戏本质上是一个持续不断的while循环,它执行逻辑,并根据逻辑计算出下一帧图像,并在屏幕上不间断的绘制更新图像。游戏最终表现出来的就是一帧又一帧连续的画面,我们所要作的就是在循环中,不断的获取用户的输

湖南大学毕业论文 第10页

入,根据输入执行游戏逻辑,生成下一个游戏动画帧,最后渲染该动画帧。

湖南大学毕业论文 第11页

3游戏的汽车类模块、场景渲染、输入控制 3.1输入检测和响应

每个交互式程序都要为用户提供一些与其交互的方法。在视频游戏中,通常可以通过诸如游戏垫、方向盘、操纵杆、键盘和鼠标等这类输入设备实现。输入检测不仅要和大量设备打交道,还要能够对于具有速度高要求的视频游戏做出快速反应。在Windows操作系统中,输入可以通过DirectInput API汇总到一起。DirectInput是DirectX API的一部分,负责对所有连接到机器上的设备进行输入检测。

从对Win32 API编程的分析可以知道,键盘或鼠标的用户输入消息并不是直接传递给应用程序来处理的,面是是转发回Windows操作系统,最后由Windows回调应用程序的窗口过程函数进行相应的消息代码处理。显然,如果游戏程序仍采用这种方式来处理用户的输入将不会获得理想的执行效率。

DirectInput是DirectX 的一个组件接口,提供了大量的接口函数处理用户在键盘、鼠标、游戏杆以及力回馈等游戏装置上的输入,而且DirectInput是直接与硬件驱动程序打交道,因此DirectInput可较快地处理用户的输入。另一方面,正是由于DirectInput直接与驱动程序进行通信,所以在控制面板上所做的任何键盘和鼠标的属性设置,如键盘按键的延迟重复和鼠标的左右手习惯等,都不会对应用DirectInput的程序起作用,除非是修改同驱动程序提供的属性设置。

湖南大学毕业论文 第12页

游戏引擎封装了DirectInput,我们只用初始化游戏引擎的输入控制类,调用该类的函数IsKeyPress()判断哪个键位被敲击,即可响应该键位的事件。 3.2场景渲染

在现实的许多商业游戏中,场景十分复杂,有着逼真的天空、高低起伏且十分精细的地形、各种天气效果(雨、雾等)以及光照阴影等。我们的游戏场景是个简单的,只由天空,模型(该模型包含了地形)和光照组成的,这些组成部分涉及到了许多技术。 3.2.1天空盒技术

在虚拟现实和视景仿真应用系统中,天空仿真是必不可少的内容之一。天空背景的真实感对用户来说能大大提高视觉享受和沉浸感。所以,一个活动的、完整的天空是整个虚拟三维系统真实感体现所必须具备的。本文所实现的游戏的天空采用的就是天空盒技术,只要使用好的纹理,就能实现令人信服的画面。天空盒只不过是一个6个面正方形,中心就是视点。上下左右前后分别贴上天空纹理后,基本天空盒就制作完成。如图3-1~3-6。

湖南大学毕业论文 第13页

图3-1 front 图3-2 back

图3-3 left

图3-4 right 图3-5 top

图3-6 bottom

渲染的后的天空效果如图3-7所示。

需要注意的是玩家在场景中不停的漫游,而天空的大小是有限,我们可以采用一种简单方法来让玩家走不出天空盒的范围,每次渲染时我们始终让摄像机的坐标位于天空盒的中心,这样就可以给我们一种感觉,天空是无限大的,怎么走也走不出。最后是渲染天空盒,我们的天空盒是有大小的,所以我们渲染时禁止Z缓冲写入,否则渲染时,天空盒Z大小都写了进去,导致超出天空盒大小的场景渲染不了,而且还要最先渲染,否则因为你禁止Z缓冲写入,先渲染场景再渲染天空盒,天空盒把整个场景覆盖了。

湖南大学毕业论文 第14页

图 3-7 天空盒效果

3.2.2模型运用

我们使用的模型是X模型,这种模型是DirectX本身的格式,可以通过几个内置函数直接加载和渲染到API。X模型最大的优点就是它们十分易用,可以直接和Direct3D交互使用。X文件格式基于模板格式,Direct3D有一些内置模板,可以用于定义X文件中的网格。这些标准模板包括外观、纹理坐标和法线。因为X文件格式基于模板格式,所以Direct3D需要知道一些存储在文件中用于某种目的的信息。X模型可以被保存为文本文件,也可以被保存为二进制文件,这意味着可以在任意的文本编辑器中打开X文本文件,并修改其内容。

湖南大学毕业论文 第15页

X文件中的Material标准模板用于指定可以施加在单个表面(多边形)的材质。针对材质的标准模板定义了环境颜色、发射能量、镜面颜色、反射量、与材质相关的纹理图像文件名。

X文件中的Mesh模板定义了X文件中的完整网格。X模型可以包含多个网格。网格模板结构开始先定义顶点总数,然后是顶点的x,y,z坐标。定义完顶点之后,接下来必须定义网格的外观或多边形。开始先是网格中的外观数,后面是每个外观的三角形索引。每个三角形索引行开始是代表该外观使用的三角形数目,后面才是索引号。定义完顶点和三角形之后,就可以随意定义其他属性了,如每一外观的材质、纹理坐标等。

X文件中的MeshMaterialList模板指明网格中的哪个外观使用哪种材质。材质链表结构开始先定义材质数目,然后是将材质施加的外观总数。这之后,每个外观占一行。每行定义一个值,用该值引用要用的材质。该结构的最后一行是涉及到的所有材质链表。第一个材质索引号为0,第二个为1,依此类推。

X文件中的MeshTextureCoords模板开始先指定网格中的索引数,然后用逗号隔开,简单的列出每个顶点的纹理坐标。有了该模板就可以在Direct3D中将纹理映射到网格上。

加载和渲染X模型很简单。所有的X模型都保存在相同的名为LPD3DXMESH的结构中。调用D3DXLoadMeshFromX()即可。调用LPD3DXMESH对象的DrawSubset()函数可以绘制模型。

湖南大学毕业论文 第16页

我们需要注意的是,X模型本身所有顶点位置都是基于其自身坐标,而我们要最终要将模型显现在外面的屏幕上,这就需要进行些坐标变换。

首先简要说明一下三维物体的成像过程。三维物体可通过建模的微分方法,把弯曲的表面切分为一个个的三角形面,这样三维物体表面的绘制,就转化为物体表面中所有三角形面的绘制。要渲染由众多三维物体组成的三维场景,需要先引入局部坐标系,为场景中的各个三维物体进行三角形顶点的坐标量化。局部坐标系示例如图 3-8所示。

图3-8 局部坐标系

引入世界坐标系,把整个场景中所有三维物体的各自顶点局部坐标,转换为同一个世界坐标系下的坐标。在同一个世界坐标系中,场景中各个三角形面的顶点坐标如实地给出了场景中物体间的空间关系。如果需要对场景实施光照处理,还要对顶点的颜色值进行计算。这个过程最终是输出具有世界坐标的场景下的所有三维物体的顶点信息。世界坐标系示例如图 3-9所示:

湖南大学毕业论文 第17页

图3-9 世界坐标系

在三维场景中选定位置和方向架设摄影机,取景范围由一个棱台视截体决定。在视截体之内部分,应显示处理;视截体之外的部分则要裁剪掉,而不显示出来。为了便于裁剪,在摄影机的位置处建立一个摄影坐标系,其Z轴指向摄影机的视线方向,从而使视截体的6个外围侧面具有较为简单的方程式。此时,需要将场景中所有物体的三角形顶点的世界坐标转换为摄影坐标系下的坐标。这个过程最终输出变换为摄影坐标的顶点信息。取得场景中所有物体的三角形顶点摄影坐标之后,开始进行裁剪和透视投影处理。这个过程最终是输出位于视觉区域内,并且已变换为投影坐标的顶点信息。最后将平面投影的点变换到计算机屏幕的视口中,并根据投影点的Z坐标值反映的顶点远近遮隐关系,确定屏幕视口中每个像素的颜色值[6],以此实现三维场景的平面着色显示。

总之,在加载模型后,要想成功的渲染模型还需要进行坐标转换,在模型文件中所有顶点使用的都是其局部的3D坐标,并非渲染函数能够直接使用的屏幕坐标。要想将其输出到屏幕中通常需要经过以下三种坐标转换:

湖南大学毕业论文 第18页

1. 全局转换。将所有的物体转换为统一的全局坐标,还可以在这里完成各种对物体位置的操作。

2. 视图转换。转为从观察者角度看到的全局坐标。先在全局坐标系的指定位置架一台摄影机,指定一个注视点和一个参考点。坐标将被转换到以摄影机为原点,从原点到注视点为Z轴,再加上参考点,所确定的平面为Y-Z平面的坐标系中。

3. 透视转换。透视转换将各顶点的x,Y值转换为实际的屏幕坐标,而z值就是Z-Bufer里的深度信息。

基本的坐标转换(平移、旋转、放缩),在3D程序里,都是将该点(就是一个列向量)乘以一个4x4矩阵。然后调用相应的三个函数告诉D3D:用这个矩阵完成全局转换,然后用那个矩阵完成视图转换。 3.2.3光照技术

光照是一门为3D场景增加真实感的技术,它以某种方式通过对物体分布不同的亮度和黑暗形成阴影而实现真实感。如同现在许多游戏中见到的一样,光照可以将场景带入到一个全新的真实感层次。为场景增加光照会对已渲染的场景产生巨大的影响。在计算机图形学中就三类光源需要考虑,分别是点光源、聚光光源和方向性光源。每类光源分别描述了日常生活中见到的不同类型的光。计算机图形中有许多不同的反射模型,但最常用的模型分别是环境光反射模型、漫反射模型和镜面反射模型,反射同物体的材质有关。反射模型和光属性一起

湖南大学毕业论文 第19页

确定了3D场景中物体的外观。在本文中,我们只要设置调用灯光类的SetLightType()设置光源类型,SetDiffuseColor()设置灯光颜色,在设置光源朝向,分配光源序号,是该序号光源可用即可实现场景中的光照效果。 3.3汽车类模块

赛车类游戏需要有个比较完善的汽车类,他们基本表达汽车的刚体运动,为此我们针对汽车建模。该汽车具有速度和加速度,最大速度,刹车加速度和方向盘灵敏度(决定汽车每次转动方向盘拐弯大小)。同时该汽车可以绕x轴,绕y轴,绕z轴旋转,还得有两个向量值实时记录汽车的位置和朝向,最后是赛车的渲染。如图3-10所示: 3.4本章小结

本章主要介绍了输入检测和响应,场景渲染中的天空是如何实现的、模型的渲染流水线以及场景的各种光照效果,最后介绍了一个简单的汽车类该具有哪些功能。

湖南大学毕业论文 第20页

图3-10 汽车效果图

湖南大学毕业论文 第21页

4赛车的碰撞检测和测试

对于不同类型的不同需要的碰撞检测我们将采用不同的方案解决.

1. 第一类碰撞主要是发生在主体和场景物体之间或者发生在主体和游戏中某些非场景物体(特定物体,或者其他游戏玩家)之间的碰撞,对于我们提到的第一类碰撞并且在不需要测试最初碰撞点的情况下,我们适合用包围盒的方法给出碰撞检测算法.

2. 第二类碰撞是由粒子和场景以及游戏者之间发生的碰撞.一个粒子(比如子弹)打出后可以近似等价为一条光线,由此光线便能近似地知道粒子是否会与某些物体发生碰撞.通过遍历BSP树便能得到相应的结果.也就可以获得和那个面碰撞的信息.

3. 第三类碰撞是对于高速行使或飞行的物体的碰撞,如果不出现失真的现象就必须使用生成超立方体(四维物体).这里,为了简化计算,在生成超立方体时仍然用一个规则的包围盒等价物体后再生成超立方体.

4. 第四类碰撞是最后一种情况,也最简单.那就是当被碰撞物体发生碰撞后不需要得到任何信息,也就是说碰撞反映只需要碰撞检测的一个简单的判断结果的条件下,我们仅仅需要利用数学公式计算轨迹是否和物体有穿越可能就可以满足条件了[7].

湖南大学毕业论文 第22页

4.1碰撞检测的相关技术

我们知道场景是由多个物体构成的,充满了成万或成千万的三角形,那么如何用一种快速有效的方式检测和避免可能发生的碰撞。使用数学检查两个三角形之间是否存在碰撞,非常消耗CPU,同样对于射线到三角形的测试也是如此。假想一下,如果一个三角形需要很大的CPU开支,那么几千个或几百万个三角形将会立即摧毁所有现代处理器的性能。

在游戏开发中实现某些事物的最快方法是采用捷径,并在必要的时候使用近似值。如果问题可以简化为一个更容易处理、计算更快的形式,那么有可能实现某一技术而不会影响程序性能,而这是在长时间做某事时才会出现的情况。在碰撞检测中,我们常常使用包围盒来代替物体组成的成千上万个三角形来参与碰撞的检测,这能简化碰撞检测和加快处理速度。

碰撞检测算法主要有三种:基于包围盒的碰撞检测算法,基于距离计算的碰撞检测算法,基于维诺图的碰撞检测算法。基于包围盒的碰撞检测算法是碰撞检测算法中应用最为广泛的一种,虽然这种方法具有不精确的缺点,但与其他两种算法相比较,它具有应用范围广、适应性强的优点,它能应用于各种多面体之间的碰撞检测。另外的两种算法只能简单解决凸多面体之间的碰撞检测.

湖南大学毕业论文 第23页

4.1.1包围盒算法

包围盒是指用规则的形状把场景中的物体(其中包括规则物体和不规则物体)包裹起来,以达到快速、简单检测多面体之间是否相交的目的。在进行碰撞检测的过程中,先对物体的包围盒进行粗略检测,当两个几何体的包围盒相交时,这两个物体才有可能相交;当包围盒不相交时,这两个物体一定不相交。这样可以排除大量不可能相交的几何体,从而快速找到可能相交的几何体。

包围盒算法主要包括:轴平行包围盒AABB(Axis Aligned Bounding Boxes)算法,包围球(sphere)算法,沿任意方向包围盒OBB(Oriented Bounding Box)算法,固定方向包围盒FDH(Fixed Directions Hulls)算法等。FDH是由事先确定好的K个方向的半平面组成的包围体,FDH又称为K—DOP(DOP是在包围盒对物体逼近的紧密性和包围盒碰撞检测的复杂性之间取的折中方案) [8]。

1. 轴平行包围盒AABB(Axis Aligned Bounding Boxes)算法 AABB是进行碰撞检测的三维几何体的外接平行六面体,并且每条边都平行于坐标轴。因此,描述一个AABB包围盒仅需要六个标量。在构造AABB时,需要沿着物体局部坐标系的轴向进行构造,所以AABB具有一致的方向。

AABB的算法简单、易于实现。但其紧密性较差,当几何体旋转后需要对AABB也进行同样的旋转,从而增加计算量,使计算速度减慢。

湖南大学毕业论文 第24页

计算AABB的重点在于计算AABB的中心及盒子的长、宽、高,由此确定包围盒的尺寸。AABB内的任一点V(x,y,z)都需要满足:如图4-1.

其中Xmax、Xmin。分别指模型中各个点在x轴方向的最大、最小值,Ymax、Ymin分别指模型中各个点在Y轴方向的最大、最小值,Zmax、Zmin分别指模型中各个点在z轴

图4-1 AABB内的任一点V(x,y,z)满足条件

方向的最大、最小值。根据两个重要的点:Pmin=[ Xmin,Ymin,Zmin],Pmax=[Xmax,Ymax,Zmax],求出包围盒的中心点。

中心点m和长、宽、高a,b,c分别为,如图4-2

图4-2 中心点m和长、宽、高a,b,c

2. 包围球(sphere)算法

包围球是进行碰撞检测的三维几何体的最小外接球,当几何体旋转后不需要对包围球进行旋转。包围球同样具有计算较为简单,紧密性较差的缺点。计算包围球的重点在于计算包围球的球心和半径。其球

湖南大学毕业论文 第25页

心的计算与AABB的计算相同。半径则是长、宽、高的最大值。根据已介绍的AABB算法对包围球的球心及半径进行计算,如图4-3。

图4-3 球心m和半径R

3. 沿任意方向包围盒OBB(Onented Bounding Box)算法

OBB是最贴近三维几何体的平行六面体。一个物体的OBB被定义位包含该三维碰撞体并且相对于坐标轴方向任意的正六面体。与AABB包围盒相比,OBB包围盒的最大特点是其方向的任意性,这使得它可以根据被包裹对象的形状特点尽可能紧密地包裹对象。同时,当几何对象进行旋转后,不需要做复杂的运算,只需对OBB的基底进行同样的旋转即可。虽然这个算法实现起来有些复杂,但这并不会影响场景的运行速度。

构造OBB包围盒的关键是寻找最佳方向即确定一组正交的基底,并确定在该方向上包围对象的包围盒的最小尺寸。它的计算相对复杂,需要对包围盒的方向、中心位置、尺寸分别进行计算。其中,其中心位置和方向是利用一次矩(均值)和二次矩(协方差矩阵)统计量来计算的。尺寸则是通过位置和方向这两个量进行计算的。需要进行碰撞检测的物体是由多个三角形面片组成的,设三角形集的第i个三角形的顶点矢量为n,qi和ri组成包围盒包围对象的三角面片数为n。则包围盒的中心位置m为:如图4-4.

湖南大学毕业论文 第26页

图4-4 包围盒的中心位置m

协方差矩阵元素Cjk,如图4-5.

图4-5 协方差矩阵元素Cjk

其中,公式pi=pi—m,qi=q—m和ri=ri—m都是3*1向量。 利用数值的方法解出协方差矩阵的特征向量并单位化,由于C是一个实对称矩阵,所以矩阵C的特征向量相互垂直,可以作为包围盒的方向轴。把将要包围的几何体的顶点向方向轴上投影,找出各方向轴的投影区间,各投影区间的长度就是所求包围盒相应的尺寸。 4.固定方向包围盒FDH(Fixed Directions Hulls)算法

固定方向包围盒FDH法,其概念最早是由Kay和Kajiya提出的,他们在分析了以往采用的层次包围盒进行光线跟踪计算的缺点后,提出了一个高效的场景层次结构应满足的条件。综合起来就是个层次包围盒都应尽可能紧密地包裹其中所含的三维碰撞体。

在此算法中,其包围盒的所有面的方向量都来自一个固定的方向向量集合,因此它的简单性较好;但是当物体变形后,需要对变形的叶结点包围盒进行重新计算,然后严格按照自底向上的顺序,由子结点的FDH合成父结点的FDH。重新计算包围盒的计算量较大。

湖南大学毕业论文 第27页

包围盒的简单性与其包裹几何体的紧密性是一对矛盾,包围盒越简单它对几何体的包裹紧密性就越差。 4.1.2 游戏引擎使用的BSP碰撞检测简要解析

BSP Trees英文全称为Binary Space Partioning trees,二维空间分割树,简称为二叉树。它于1969年被Shumacker在文章《Study for Applying Computer-Generated Images to Visual Simulation》首次提出,并被ID公司第一次使用到FPS游戏Doom中,Doom的推出获得了空前的成功,不仅奠定了ID公司在FPS游戏开发的宗师地位,也使BSP技术成为室内渲染的工业标准,从BSP产生到现在已经有30多年了,其间虽然产生了大量的室内渲染的算法,但却无人能撼动它的地位,对于以摩尔定律发展的计算机业来说这不能不是一个奇迹。BSP技术作为室内引擎渲染的主流技术虽然已经存在多年,但是生命力仍然非常顽强,最新的DOOM3,HL2仍然将它作为渲染的主流技术。

该引擎实现的BSP树原理很简单:它将场景中所有的三角形面组织存储于一颗二叉树内,每个平面均将空间分为前后两个空间,这两个空间又被其它面分成更小的空间??直到最后,按照前面的算法,确定每个房间相对于摄像机的遮档顺序。这是一个非常标准的二分法,仅按照“前”和“后”两个逻辑上的概念来划分空间。如图 4-6所示:

湖南大学毕业论文 第28页

图 4-6 BSP原理简要解析图

空间ABC由A、B、C三个独立的空间组成,首先,分割平面1将空间分成了平面正向的A空间和平面负向的BC空间,BC空间被2紧接着分割为平面2正向的C空间和负向B空间。如果一个人处于C房间内,那么如何判断空间的遮挡顺序呢?从根结点开始,由于处于平面1的“后面”,所以,BC空间应该先于A空间,然后,由于人处于分割平面2的“前”面,所以,C空间应该先于B空间。这样,整个空间离人由近到远的顺序就可以确定了:C-B-A。仅需要通过两次平面的前后判断就可以确定空间的先后顺序,算法威力可见一斑。

该引擎使用二叉树主要用于碰撞检测。原理很简单,对场景中的碰撞网格进行了二叉树分割之后,网格存储进了一颗二叉树内。当需要判断一个面与一个物体是否发生碰撞时,只需要在二叉树内查找该面,然后计算是否碰撞即可。因为使用了二叉树存储,平均查找100

湖南大学毕业论文 第29页

万个三角形面,也只需要比较20次左右,效率非常高。碰撞检测示例如图 4-7所示:

图 4-7 BSP碰撞检测示例(上面的文字显示当前已碰撞)

4.2本文采用的碰撞检测技术

碰撞检测是要根据具体的情况来决定选用哪种检测方法,在本文中我们的场景是通过两个X模型来实现,一个是环形赛道模型,一个是赛道周围环境的模型。通过分析这两个模型,我们发现在碰撞检测中最常用的包围盒技术不能用在本游戏中,但在研究包围盒技术中学到的思想可以帮助我们解决这个问题。我们可以可以把赛车看成一个点,为了使赛车不穿透地形,在设置赛车下一位置的坐标时,我们可以取得该坐标,并判断该坐标点位于哪个三角形内,修改该坐标的Y值,确保其始终在地形之上。在介绍本文采用的地形碰撞检测时,有必要

湖南大学毕业论文 第30页

要先了解DirectX是如何加载X模型文件中的信息的,特别是如何确定网格中的每个三角形的。 4.2.1 顶点/索引缓冲区

在Direct3D中的顶点包含了许多附加的属性,而不再单纯的只有空间位置的信息[9]。例如:一个顶点可以有颜色、法线向量属性和纹理坐标,如图4-8

图4-8 顶点结构

一个顶点缓冲区是一块连续的存储了顶点数据的内存,同样的,一个索引缓冲区是一块连续存储了索引数据的内存。我们使用顶点和索引缓存区保存我们的数据是应为它们能被放置在显存中。渲染显存中的数据要比渲染系统能够内存中的数据快的多。

在我们调用DirectX完成加载X模型时,会把模型的顶点信息和索引信息放在其顶点缓冲区和索引缓冲区中,我们可以自定义一个顶点

湖南大学毕业论文 第31页

缓冲区和索引缓冲区接受模型的顶点和索引数据,随后可以对这些数据进行操作。 4.2.2 地形的碰撞检测

从几何形态来看,不同的地形外貌,取决于地形的每一个点距离地形面的高度值。一般地形都是根据高度图生成,高度图其实就是一个数组,其中的每一个元素都表示在地形网格中的一个顶点的高度。我们通常将张高度图当作是一个矩阵来处理,这样以便其中的每项都与地形网格的每一个顶点一一对应。地形高度由高度图的灰度值决定,这样就容易的生成一个地形网格,

我们知道一个场景是模型的集合,一个模型可以用网格(Mesh)来近似的表示。如图4-9:

湖南大学毕业论文 第32页

图4-9 模型

地形跟踪算法和汽车的物理模型是彼此相关的,问题是这样的:我们使用相机来表示玩家的视点(当然,相机前面是预先渲染好的小型汽车)。玩家驾驶的汽车必须在地形表面,而不能穿入地面,因此需要计算相机所在位置处的地形高度,并将视点相应地往上移[10],如图4-10所示:

湖南大学毕业论文 第33页

图4-10 地形跟踪算法

解决这种问题的方法很多。可以为汽车创建一个真正的考虑了动量的物理模型,但对于这样简单的问题,这过于复杂。也可以走另一个极端,根据相机所在单元格的最大高度上下移动相机,但效果不会太好。可以走一条中间路线:使用一个基于速度、重力和瞬时加速度的简化物理模型,其中瞬时加速度取决于相机的位置和方向。这个物理模型的要点如下:

1. 汽车有前进速度和前进方向,可使用箭头键来控制它们(玩家按住前进方向键或后退方向键时,加速度为常量)。 2. 有一个向上的作用于汽车的法向力,如果汽车在海平面之下,这个力将其往上推。

3. 在任何时候,都根据沙地汽车在世界坐标空间中的位置来确定它在哪个地形单元格之上,并计算该单元格4个顶点的平均高

本文来源:https://www.bwwdw.com/article/10y3.html

Top