《3D赛车游戏的设计与实现毕业设计.doc》由会员分享,可在线阅读,更多相关《3D赛车游戏的设计与实现毕业设计.doc(45页珍藏版)》请在三一办公上搜索。
1、Design and Implementation of the 3D racing gameby3D赛车游戏的设计与实现摘 要3D赛车游戏是整个游戏行业的重要组成,随着游戏行业的快速发展,2D游戏的市场份额已经大幅下降,目前3D游戏越来越受广大玩家的喜爱,特别是3D赛车游戏,一直是玩家的宠儿。本文实现了一款赛车游戏,该游戏分为场景渲染、赛车渲染、天空渲染、赛车在场景中的漫游、赛车的地形跟踪系统和碰撞检测等六部分。场景渲染、赛车渲染和天空渲染构成游戏的渲染画面,基于DirectX技术实现。赛车在场景中的漫游、赛车的地形跟踪系统和碰撞检测构成了游戏的主要逻辑。本文在一款游戏引擎的基础上,通过将第
2、三方软件制作的游戏场景模型和赛车模型导入到游戏中,完成对游戏的初始化;使用天空盒技术实现一个比较逼真的天空;通过输入模块完成对赛车的控制;通过摄像机类来实现漫游效果,通过汽车类来实现汽车的刚体运动,通过地形跟踪保持汽车始终位于地形之上来避免赛车穿透地形,通过碰撞系统使汽车始终行驶在赛道上,再将这些整合形成了三维赛车游戏。论文最后对全文进行总结,并对后续工作进行了展望。关键词:三维,DirectX,赛车,游戏,地形碰撞检测Design and Implementation of the 3D racing gameAbstract3D racing game is an important co
3、mponent 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 players pet.We achieved a racing game, the game can be divided into the scene rendering, car render
4、ing, 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.The game base on a third-
5、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 a
6、chieve 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.
7、Key Words: 3D, DirectX, Car, Game, Collision System 目 录摘 要IIIAbstractIV1绪论11.1课题来源、背景和目的11.2与课题相关的国内外研究综述21.3本文的内容安排42 DirectX、游戏引擎和游戏结构52.1 DirectX概述52.2游戏引擎62.2.1 游戏引擎概述62.2.1 选用的游戏引擎结构62.3游戏结构82.4本章小结93游戏的汽车类模块、场景渲染、输入控制103.1输入检测和响应103.2场景渲染103.2.1天空盒技术113.2.2模型运用123.2.3光照技术153.3汽车类模块153.4本章小结154
8、赛车的碰撞检测和测试174.1碰撞检测的相关技术174.1.1包围盒算法184.1.2 游戏引擎使用的BSP碰撞检测简要解析214.2本文采用的碰撞检测技术224.2.1 顶点/索引缓冲区234.2.2 地形的碰撞检测244.2.3 汽车与物体的碰撞检测264.3测试264.4本章小结275结论28致谢29参考文献30附录311绪论三维赛车游戏是当前流行的游戏,是速度与激情的代表,也代表着当今游戏界最顶尖的画面表现,拥有广大的玩家支持。本文基本实现了一个赛车游戏,该游戏有着较为逼真的游戏场景和简单的赛车操作。1.1课题来源、背景和目的随着社会的发展进步,游戏逐步成为一种重要的休闲娱乐和教育手段
9、。这种被称为是第九艺术的电子游戏起源于西方,是基于电子技术发展起来的一种具有娱乐性质的产业。随着电子技术的不断发展和扩充,游戏产业的内容也不断得到丰富,目前的游戏产业已经成为包含计算机软硬件技术、网络技术以及无线技术等最新科技和各种文化艺术的新型娱乐产业。而其中,游戏引擎技术可谓重中之重,它是整个游戏产业的核心技术。目前中国的游戏产业正处在一个稳定上升的发展阶段,中国将成为全球最大的游戏市场,现在我们所看到的仅仅是冰山之一角。根据IDSA的统计结果,如图1-1可以看出喜爱游戏是人类的天性,不分年龄段1。图1-1:游戏用户年龄分布,性别分布,日常时间闲暇分配从游戏的市场规模来看,2000年中国的
10、网络游戏销售额仅为0.38亿元,2001年即达3.25亿元,而2002年中国网络游戏市场规模达到10.2亿元,增长率为213.8%。根据IDC 2003年12月的最新研究,2003年中国网络游戏用户数量达到1380万,比2002年增长63.8%,占同年Internet用户数的20.2%,到2007年中国网络游戏用户数将达到4180万,从2002年到2007年这5年的年复合增长率将达到37.8%,届时网络游戏用户将占到Internet用户的29.5% 2。赛车是世界上的顶级运动,它使人们充满对速度的渴望然而这项运动的赘用和危险同样高得惊人,以致令绝大多数爱好者望尘奠及,这些人不得不终日守在电视机
11、前,借助想象力揣摩着车手究竟是如何驾驶赛车。80年代,电脑科技的迅猛发展改变了人们的生活,初出茅庐的虚拟技术使全世界车迷依稀触摸到速度的魔影;进入90年代,赛车游戏也进入到一个高速发展时期,模拟度越来越高的优秀作品不断给玩家和车迷带来惊喜;到了21世纪,电脑赛车游戏产业已发展到一个相当完善的程度,某些高水平作品的模拟度甚至达到90以上。今天,就让我们踏上富于传奇色彩的速度之旅,来回顾那些拥有无上经典的电脑赛车游戏。1985年-1995年,对于刚刚诞生的电脑赛车游戏来说,这是一个相对幼稚的历史时期,落后的电脑硬件还不足以使程序员营造出逼真的视听效果和驾驶感觉。这一时代的经典赛车游戏有:风驰电掣,
12、马达城市,名车志,世纪金冠军,印地大赛车,云斯顿赛车。1996年-1999年,1996年,英特尔奔腾一代中央处理器掀起了电脑硬件革命,电脑赛车游戏也由此翻开了崭新的篇章。性能游戏的CPU使赛车游戏的表现力大为提升,程序引擎被个大公司大幅改进和优化,深奥的物理法则和高等数学也被引入其中。电脑赛车游戏进入高速发展时期。代表作有:世纪金冠军2,拉力冠军,FI方程式赛车,摩托英豪,虚拟一级方程式大奖赛,横冲直撞,星球大战前传之极速飞梭,F1传奇,世嘉拉力23。一款好的赛车是一个公司技术实力和策划能力的体现,能创造巨大的经济、社会效益。1.2与课题相关的国内外研究综述极品飞车目前可能是最受欢迎的赛车游戏
13、,第一代作品诞生于1995,到目前已经诞生了13代作品。在极品飞车中,玩家可以中仿照真实的地下改装车辆一般对自己的爱车进行从里到外的全面改造,当然,这是需要通过在游戏中获得比赛胜利,依靠奖金来实现的。高速奔驰下前方道路和环境移动的效果逼真绚丽。不论是黑夜中高楼林立的城市,眩目的霓虹灯残影,还是四周景物因高速而产生模糊效果都制作得非常细致。漂移、冲刺等等多种花样技巧的引入,使这款游戏具备了单纯竞速所不具备的快感。至于“辅助驾驶开关”也让游戏在驾驶和竞速方面得到了一定的平衡,给系统融入了新的活力。游戏的音响效果也非常好细腻,甚至连变速箱齿轮咬合的声音都被真实呈现,加上贯穿游戏的节奏感极强的摇滚乐,
14、所有这些视觉、听觉上的高水准制作使得极品飞车逼真的刻画出深受西方年轻人喜爱的改车、飚车世界。提供多种玩法,单人游戏分为快速模式、生涯模式两种。在快速模式中,玩家可以选择已解开的地图和车辆进行选定的比赛。而解开这些地图和车辆也需要在生涯模式中得到,所以生涯模式才是极品飞车的精髓所在。生涯模式就是故事模式,玩家扮演一个在乡村比赛中受伤的车手,养好伤之后来到城市里并且在各种比赛中赢取金钱和名声,最后终于让自己和之前让自己受伤的车手决一死战。在故事模式中,玩家可以享受到高自由度的车辆配件组专,车体商店可以更改车灯、车头、引擎盖、防撞栏之类的组件,可以在众多不同样式的组件中选择自己最喜欢的配件组装,组装
15、后可以在画面右边看到评价星级。图案商店,主要为车辆进行喷涂油漆,以及各种贴纸、花纹以及车灯等。除了车身外,车顶、后视镜、扰流板、刹车、轮圈等都可以分别涂上不同颜色。车身上的花纹可从许多花纹中选择一种或者几种进行自由搭配,可以将你的爱车打造得个性并且炫目。而车辆配件商店则负责定制车辆的仪表盘,霓虹灯,液压装置等。车展销售中心可以买到许多车型。有多种比赛方式,比赛分为平常比赛和地下赛车联盟的正式比赛(U.R.L),平常比赛可以选择参加,而U.R.L是必须参加而且只有完成U.R.L才能够进入下一个赛事。平常比赛中又包括“跑道赛”“竞速赛”“直线加速赛”“甩尾赛”“街道赛”等五个类型,各种类型所需要的
16、技术和车辆都不同。跑道赛的赛场多是环城公路,甚至市区的街道,整个赛道为一个封闭的圆圈,车手们必须驾车行驶指定的圈数,以先完成全部圈道者为胜利。跑道赛对车的综合素质要求比较高,减速过弯、直线加速、车辆的闪避甚至道路的选择都对比赛结果有很大的影响。开跑道赛所选择的车必须是集速度和操控性于一身,任何一个方面有欠缺都会吃大亏。竞速赛和跑道赛基本相同,不过赛道是线形的而不是跑道赛一样环形的。直线加速赛的赛场大多安排在笔直的高速公路、火车站甚至飞机场,车手不需要担心减速过弯的问题,仅仅需要将自己的车以最短的时间加到最快的速度。在直线加速赛中,唯一的限制是必须使用手动换档,使用默认的左Shift和左Ctrl
17、进行加档或降档虽然几乎没有机会用到降档。对于这个比赛,车辆的性能和车辆的换档的时机至关重要,要等到发动机达到最大马力的时候进行加档为最完美的换档。而发动机的最大马力时的转速可以在马力测试的时候看到。极品飞车会给玩家带来有令人难忘的高细节的照片品质的图像,让你更有代入感。它将Autosculpt技术提升到了新的高度,允许你调整和改装你富有个性的车辆,并立刻在其外观和性能上体现出来。碰撞效果逼真精确,每一次的碰撞,每一次的刮擦和每一次的车体变形都将成为你战斗的印记,是对你的承诺和勇气的最佳证明。富有进攻性和高技巧的AI系统能够让你得到无比真实可信的赛车体验,而革命性的在线模式将会重新定义多人游戏。
18、目前国内的赛车游戏主要都是网络游戏类型,单从游戏画面的角度上讲,是不能和欧美的单机赛车游戏相比的,没有逼真的碰撞以及实时出现的火花四溅的效果,赛车的驾驶感也不够真实,但是由于是网络休闲游戏,在牺牲了驾驶的真实感的同时,驾驶的易操作性得到了极大的提升,只需要控制方向和加速,减速,大刹车即可。1.3本文的内容安排本论文主要研究了三维赛车游戏的制作,设计了一个简单的三维赛车游戏,实现了赛车游戏的基本功能。全文共分六章,具体安排如下:第二章主要介绍DirectX和游戏引擎的相关知识,第三章介绍了游戏的结构,第四章介绍如何实现游戏的汽车类、输入控制和场景渲染,第五章重点介绍了赛车游戏中的各种碰撞检测技术
19、和本文采用的碰撞检测技术,最后第六章介绍了最终实现的赛车游戏的效果和缺陷。2 DirectX、游戏引擎和游戏结构 DirectX是PC平台上开发游戏的事实上的标准,游戏引擎能使开发游戏的工作量大大的减少。2.1 DirectX概述Microsoft公司的DirectX是一个多媒体应用编程接口工具包,用于为Windows操作系统开发交互式软件。DirectX诞生于1995年,已成为在Microsoft平台上开发多媒体软件的一种标准,全世界的开发人员都在使用它。DirectX主要用于游戏开发,但其中部分用于开发其他类型的软件,这些软件包括游戏虚拟角色,网络软件和游戏无关的图形软件。DirectX通
20、过和底成硬件打交道,从而获取软件的最大性能4。如图2-1。图 2-1基本应用架构API DirectX主要由DirectGraphics、DirectInput、DirectPlay、DirectMusic和DirectSound组成。每个API之间相互独立,负责完成DirectX内核中不同的功能。DirectX中的每个API都可以通过硬件加速。这意味着这些API可以直接和运行软件的底成硬件对话。这样可以带来很好的性能,并提供开发商业软件的能力。DirectGraphics主要负责向屏幕上渲染二维图形和三维图形。DirectInput可以直接使用所有与计算机关联的输入设备。这些设备包括键盘、鼠
21、标、和游戏控制器设备。通过DirectInput,可以最快速确定作为输入设备的状态。更重要的是,DirectInput可以和所有现在的或将来的输入设备对话。由于DirectInput的本质,所以使用它可以很容易的支持以后的输入的设备,而不必更新自己的API。DirectPlay可以让应用程序对机器进行网络功能设置,从而可以通过连接和其他网络玩家交流。DirectMusic和DirectSound负责与声音相关的操作,两者在控制声音的数量方面存在差异,DirectMusic可以提供更多的底成控制与更多的灵活性,而且方便使用。而使用DirectSound就不必做很多的控制,因为DirectSoun
22、d比DirectMusic更高级些。DirectX目前已经发展到到DirectX10.1,从很不成功DirectX 1到引发了显卡革命的DirectX 8,在到目前的DirectX10.1,这一路走来,DirectX给游戏业带来了巨大的发展。接下来的DirectX最新产品是DirectX11,DirectX 11增加了新的计算shader技术,可以允许GPU从事更多的通用计算工作,而不仅仅是3D运算,这可以鼓励开发人员更好地将GPU作为并行处理器使用。另外,DirectX 11还支持tessellation镶嵌化技术,这有助于开发人员创建更为细腻流畅的模型,实现高质量实时渲染和预渲染场景。多线
23、程是DirectX 11的另外一大亮点,DX11可以更好地利用多线程资源,从而使游戏更有效地利用多核处理器。2.2游戏引擎2.2.1 游戏引擎概述游戏引擎是游戏中与具体的游戏无关的核心技术部分,而游戏的部分就是场景和角色模型、动画、声音和代码等其他控制部分。经过游戏业的不断的发展,如今的游戏引擎己经发展为一套由多个子系统共同构成的复杂系统。一般这些引擎都是3D游戏引擎,从建模、动画到光影、粒子特效,从物理系统、碰撞检测到文件管理、网络特性,还有专业的编辑工具和插件,几乎涵盖了开发过程中的所有重要环节。游戏引擎就是游戏开发者们为了降低重复劳动,节省开发时间和开发费用而诞生的,它封装了些在游戏制作
24、中常用的功能,让我们能直接调用这些功能而不用在从头编写。2.2.1 选用的游戏引擎结构在3D游戏中,游戏引擎涵盖的内容很多。选用的该游戏引擎是一个处理所有事务的系统,它是一个控制模块,向所有的子系统发出命令。因此,需要与每个游戏子系统联系。该游戏引擎也是一个容器,它容纳了其他所有的组件,控制整个系统的各个部分。目前该3D游戏引擎实现的功能模块包括:声音控制、输入控制、图形渲染、游戏界面控制等。其中图形渲染是引擎的核心模块,涉及面较广,目前实现的功能点包括:顶点、纹理、光照、材质、文字、雾化、天空盒、摄像机、广告牌、静态网格模型、骨骼动画、粒子特效、LOD地形场景、地形多层细节纹理等。最后,使用
25、BSP技术实现了碰撞检测。该游戏引擎各模块之间的协同操作如图 2-2所示。图 2-2引擎各模块之间的协同操作输入系统:接受玩家的键盘、鼠标等外设的输入信息,然后引擎对这些信息进行响应作出相应效果(即游戏逻辑处理),实现与玩家的交互。声音控制:加载、播放、停止声音等操作。并提供较逼真的三维音效,使玩家如身临其境的感觉。游戏UI:即游戏的界面。加载图片实现了图形化的界面控件。方便玩家对游戏进行操作,提高用户体验性。图形渲染:是整个引擎的核心模块,涉及面较广,主要功能是绘制渲染三维游戏世界。目前实现的功能点包括:顶点、纹理、光照、材质、文字、雾化、天空盒、摄像机、广告牌、网格模型、粒子特效、地形场景
26、等。碰撞检测:主要使用了二叉空间分割技术,把碰撞网格存储进二叉树,实现快速的碰撞检测。2.3游戏结构游戏与其他应用软件有着一定的区别,它不是我们的单线、事件驱动或顺序逻辑的程序。一个3D游戏本质上是一个持续不断的while循环,它执行逻辑并在屏幕上不间断的绘制更新图像通常以4060帧每秒或更高的速度不断的绘制5。这类似于电影放映方式,不同的是,我们将控制电影的情节发展。本引擎中所使用的游戏最基本的流程框架如图 2-3所示。图2-3 3D游戏基本流程框架初始化:这部分执行与其他任何程序类似的标准操作,如内存分配、资源获取、从磁盘加载数据等。进入游戏循环:这部分进入主游戏循环,用户将在这里不断地执
27、行动作,直到退出主循环为止。读取玩家输入:这部分处理玩家输入,或将其存储到缓冲区中,供游戏逻辑使用。执行游戏逻辑:这部分包含游戏代码的主体部分,将执行人工智能、物理系统和通用游戏逻辑,并根据结果在屏幕上绘制下一帧。图形渲染:在这一部分中,将根据玩家输入以及逻辑的执行结果,生成下一个游戏动画帧。在甚于3D游戏引擎中,将由一个复杂的3D图形流水线来渲染构成世界的成千上万甚至上百万个多边形。在基于Direct3D的3D硬件加速中,大部分工作都由硬件来承担。循环:这部分相当简单,只需返回到游戏循环的开头,然后重新执行整个循环。关闭:这是游戏的末尾,意味着用户退出游戏循环,并返回到操作系统。但是,与其它
28、任何软件一样,需要在返回操作系统之前释放占用的所有资源,并清理系统。游戏控制台控制流程如图 2-4所示。图2-4 游戏控制台的控制流程2.4本章小结本章主要介绍了DirectX和游戏引擎,让我们了解两者的大概功能和关系。在了解两者的基础上,着重介绍了该游戏选用的游戏引擎的各个功能模块及各模块是如何协同工作的,为接下来的游戏制作打下了坚实的基础。最后介绍了下游戏的基本结构,一个游戏本质上是一个持续不断的while循环,它执行逻辑,并根据逻辑计算出下一帧图像,并在屏幕上不间断的绘制更新图像。游戏最终表现出来的就是一帧又一帧连续的画面,我们所要作的就是在循环中,不断的获取用户的输入,根据输入执行游戏
29、逻辑,生成下一个游戏动画帧,最后渲染该动画帧。3游戏的汽车类模块、场景渲染、输入控制3.1输入检测和响应每个交互式程序都要为用户提供一些与其交互的方法。在视频游戏中,通常可以通过诸如游戏垫、方向盘、操纵杆、键盘和鼠标等这类输入设备实现。输入检测不仅要和大量设备打交道,还要能够对于具有速度高要求的视频游戏做出快速反应。在Windows操作系统中,输入可以通过DirectInput API汇总到一起。DirectInput是DirectX API的一部分,负责对所有连接到机器上的设备进行输入检测。从对Win32 API编程的分析可以知道,键盘或鼠标的用户输入消息并不是直接传递给应用程序来处理的,面
30、是是转发回Windows操作系统,最后由Windows回调应用程序的窗口过程函数进行相应的消息代码处理。显然,如果游戏程序仍采用这种方式来处理用户的输入将不会获得理想的执行效率。DirectInput是DirectX 的一个组件接口,提供了大量的接口函数处理用户在键盘、鼠标、游戏杆以及力回馈等游戏装置上的输入,而且DirectInput是直接与硬件驱动程序打交道,因此DirectInput可较快地处理用户的输入。另一方面,正是由于DirectInput直接与驱动程序进行通信,所以在控制面板上所做的任何键盘和鼠标的属性设置,如键盘按键的延迟重复和鼠标的左右手习惯等,都不会对应用DirectInp
31、ut的程序起作用,除非是修改同驱动程序提供的属性设置。游戏引擎封装了DirectInput,我们只用初始化游戏引擎的输入控制类,调用该类的函数IsKeyPress()判断哪个键位被敲击,即可响应该键位的事件。3.2场景渲染 在现实的许多商业游戏中,场景十分复杂,有着逼真的天空、高低起伏且十分精细的地形、各种天气效果(雨、雾等)以及光照阴影等。我们的游戏场景是个简单的,只由天空,模型(该模型包含了地形)和光照组成的,这些组成部分涉及到了许多技术。3.2.1天空盒技术在虚拟现实和视景仿真应用系统中,天空仿真是必不可少的内容之一。天空背景的真实感对用户来说能大大提高视觉享受和沉浸感。所以,一个活动的
32、、完整的天空是整个虚拟三维系统真实感体现所必须具备的。本文所实现的游戏的天空采用的就是天空盒技术,只要使用好的纹理,就能实现令人信服的画面。天空盒只不过是一个6个面正方形,中心就是视点。上下左右前后分别贴上天空纹理后,基本天空盒就制作完成。如图3-13-6。图3-1 front 图3-2 back 图3-3 left图3-4 right 图3-5 top 图3-6 bottom渲染的后的天空效果如图3-7所示。需要注意的是玩家在场景中不停的漫游,而天空的大小是有限,我们可以采用一种简单方法来让玩家走不出天空盒的范围,每次渲染时我们始终让摄像机的坐标位于天空盒的中心,这样就可以给我们一种感觉,天
33、空是无限大的,怎么走也走不出。最后是渲染天空盒,我们的天空盒是有大小的,所以我们渲染时禁止Z缓冲写入,否则渲染时,天空盒Z大小都写了进去,导致超出天空盒大小的场景渲染不了,而且还要最先渲染,否则因为你禁止Z缓冲写入,先渲染场景再渲染天空盒,天空盒把整个场景覆盖了。图 3-7 天空盒效果3.2.2模型运用我们使用的模型是X模型,这种模型是DirectX本身的格式,可以通过几个内置函数直接加载和渲染到API。X模型最大的优点就是它们十分易用,可以直接和Direct3D交互使用。X文件格式基于模板格式,Direct3D有一些内置模板,可以用于定义X文件中的网格。这些标准模板包括外观、纹理坐标和法线。
34、因为X文件格式基于模板格式,所以Direct3D需要知道一些存储在文件中用于某种目的的信息。X模型可以被保存为文本文件,也可以被保存为二进制文件,这意味着可以在任意的文本编辑器中打开X文本文件,并修改其内容。X文件中的Material标准模板用于指定可以施加在单个表面(多边形)的材质。针对材质的标准模板定义了环境颜色、发射能量、镜面颜色、反射量、与材质相关的纹理图像文件名。X文件中的Mesh模板定义了X文件中的完整网格。X模型可以包含多个网格。网格模板结构开始先定义顶点总数,然后是顶点的x,y,z坐标。定义完顶点之后,接下来必须定义网格的外观或多边形。开始先是网格中的外观数,后面是每个外观的三
35、角形索引。每个三角形索引行开始是代表该外观使用的三角形数目,后面才是索引号。定义完顶点和三角形之后,就可以随意定义其他属性了,如每一外观的材质、纹理坐标等。X文件中的MeshMaterialList模板指明网格中的哪个外观使用哪种材质。材质链表结构开始先定义材质数目,然后是将材质施加的外观总数。这之后,每个外观占一行。每行定义一个值,用该值引用要用的材质。该结构的最后一行是涉及到的所有材质链表。第一个材质索引号为0,第二个为1,依此类推。X文件中的MeshTextureCoords模板开始先指定网格中的索引数,然后用逗号隔开,简单的列出每个顶点的纹理坐标。有了该模板就可以在Direct3D中将
36、纹理映射到网格上。加载和渲染X模型很简单。所有的X模型都保存在相同的名为LPD3DXMESH的结构中。调用D3DXLoadMeshFromX()即可。调用LPD3DXMESH对象的DrawSubset()函数可以绘制模型。我们需要注意的是,X模型本身所有顶点位置都是基于其自身坐标,而我们要最终要将模型显现在外面的屏幕上,这就需要进行些坐标变换。首先简要说明一下三维物体的成像过程。三维物体可通过建模的微分方法,把弯曲的表面切分为一个个的三角形面,这样三维物体表面的绘制,就转化为物体表面中所有三角形面的绘制。要渲染由众多三维物体组成的三维场景,需要先引入局部坐标系,为场景中的各个三维物体进行三角形
37、顶点的坐标量化。局部坐标系示例如图 3-8所示。图3-8 局部坐标系引入世界坐标系,把整个场景中所有三维物体的各自顶点局部坐标,转换为同一个世界坐标系下的坐标。在同一个世界坐标系中,场景中各个三角形面的顶点坐标如实地给出了场景中物体间的空间关系。如果需要对场景实施光照处理,还要对顶点的颜色值进行计算。这个过程最终是输出具有世界坐标的场景下的所有三维物体的顶点信息。世界坐标系示例如图 3-9所示:图3-9 世界坐标系在三维场景中选定位置和方向架设摄影机,取景范围由一个棱台视截体决定。在视截体之内部分,应显示处理;视截体之外的部分则要裁剪掉,而不显示出来。为了便于裁剪,在摄影机的位置处建立一个摄影
38、坐标系,其Z轴指向摄影机的视线方向,从而使视截体的6个外围侧面具有较为简单的方程式。此时,需要将场景中所有物体的三角形顶点的世界坐标转换为摄影坐标系下的坐标。这个过程最终输出变换为摄影坐标的顶点信息。取得场景中所有物体的三角形顶点摄影坐标之后,开始进行裁剪和透视投影处理。这个过程最终是输出位于视觉区域内,并且已变换为投影坐标的顶点信息。最后将平面投影的点变换到计算机屏幕的视口中,并根据投影点的Z坐标值反映的顶点远近遮隐关系,确定屏幕视口中每个像素的颜色值6,以此实现三维场景的平面着色显示。总之,在加载模型后,要想成功的渲染模型还需要进行坐标转换,在模型文件中所有顶点使用的都是其局部的3D坐标,
39、并非渲染函数能够直接使用的屏幕坐标。要想将其输出到屏幕中通常需要经过以下三种坐标转换: 1. 全局转换。将所有的物体转换为统一的全局坐标,还可以在这里完成各种对物体位置的操作。2. 视图转换。转为从观察者角度看到的全局坐标。先在全局坐标系的指定位置架一台摄影机,指定一个注视点和一个参考点。坐标将被转换到以摄影机为原点,从原点到注视点为Z轴,再加上参考点,所确定的平面为Y-Z平面的坐标系中。3. 透视转换。透视转换将各顶点的x,Y值转换为实际的屏幕坐标,而z值就是Z-Bufer里的深度信息。基本的坐标转换(平移、旋转、放缩),在3D程序里,都是将该点(就是一个列向量)乘以一个4x4矩阵。然后调用
40、相应的三个函数告诉D3D:用这个矩阵完成全局转换,然后用那个矩阵完成视图转换。3.2.3光照技术 光照是一门为3D场景增加真实感的技术,它以某种方式通过对物体分布不同的亮度和黑暗形成阴影而实现真实感。如同现在许多游戏中见到的一样,光照可以将场景带入到一个全新的真实感层次。为场景增加光照会对已渲染的场景产生巨大的影响。在计算机图形学中就三类光源需要考虑,分别是点光源、聚光光源和方向性光源。每类光源分别描述了日常生活中见到的不同类型的光。计算机图形中有许多不同的反射模型,但最常用的模型分别是环境光反射模型、漫反射模型和镜面反射模型,反射同物体的材质有关。反射模型和光属性一起确定了3D场景中物体的外
41、观。在本文中,我们只要设置调用灯光类的SetLightType()设置光源类型,SetDiffuseColor()设置灯光颜色,在设置光源朝向,分配光源序号,是该序号光源可用即可实现场景中的光照效果。3.3汽车类模块赛车类游戏需要有个比较完善的汽车类,他们基本表达汽车的刚体运动,为此我们针对汽车建模。该汽车具有速度和加速度,最大速度,刹车加速度和方向盘灵敏度(决定汽车每次转动方向盘拐弯大小)。同时该汽车可以绕x轴,绕y轴,绕z轴旋转,还得有两个向量值实时记录汽车的位置和朝向,最后是赛车的渲染。如图3-10所示:3.4本章小结 本章主要介绍了输入检测和响应,场景渲染中的天空是如何实现的、模型的渲
42、染流水线以及场景的各种光照效果,最后介绍了一个简单的汽车类该具有哪些功能。图3-10 汽车效果图4赛车的碰撞检测和测试对于不同类型的不同需要的碰撞检测我们将采用不同的方案解决1. 第一类碰撞主要是发生在主体和场景物体之间或者发生在主体和游戏中某些非场景物体(特定物体,或者其他游戏玩家)之间的碰撞,对于我们提到的第一类碰撞并且在不需要测试最初碰撞点的情况下,我们适合用包围盒的方法给出碰撞检测算法2. 第二类碰撞是由粒子和场景以及游戏者之间发生的碰撞一个粒子(比如子弹)打出后可以近似等价为一条光线,由此光线便能近似地知道粒子是否会与某些物体发生碰撞通过遍历BSP树便能得到相应的结果也就可以获得和那
43、个面碰撞的信息3. 第三类碰撞是对于高速行使或飞行的物体的碰撞,如果不出现失真的现象就必须使用生成超立方体(四维物体)这里,为了简化计算,在生成超立方体时仍然用一个规则的包围盒等价物体后再生成超立方体4. 第四类碰撞是最后一种情况,也最简单那就是当被碰撞物体发生碰撞后不需要得到任何信息,也就是说碰撞反映只需要碰撞检测的一个简单的判断结果的条件下,我们仅仅需要利用数学公式计算轨迹是否和物体有穿越可能就可以满足条件了74.1碰撞检测的相关技术我们知道场景是由多个物体构成的,充满了成万或成千万的三角形,那么如何用一种快速有效的方式检测和避免可能发生的碰撞。使用数学检查两个三角形之间是否存在碰撞,非常
44、消耗CPU,同样对于射线到三角形的测试也是如此。假想一下,如果一个三角形需要很大的CPU开支,那么几千个或几百万个三角形将会立即摧毁所有现代处理器的性能。在游戏开发中实现某些事物的最快方法是采用捷径,并在必要的时候使用近似值。如果问题可以简化为一个更容易处理、计算更快的形式,那么有可能实现某一技术而不会影响程序性能,而这是在长时间做某事时才会出现的情况。在碰撞检测中,我们常常使用包围盒来代替物体组成的成千上万个三角形来参与碰撞的检测,这能简化碰撞检测和加快处理速度。碰撞检测算法主要有三种:基于包围盒的碰撞检测算法,基于距离计算的碰撞检测算法,基于维诺图的碰撞检测算法。基于包围盒的碰撞检测算法是
45、碰撞检测算法中应用最为广泛的一种,虽然这种方法具有不精确的缺点,但与其他两种算法相比较,它具有应用范围广、适应性强的优点,它能应用于各种多面体之间的碰撞检测。另外的两种算法只能简单解决凸多面体之间的碰撞检测.4.1.1包围盒算法包围盒是指用规则的形状把场景中的物体(其中包括规则物体和不规则物体)包裹起来,以达到快速、简单检测多面体之间是否相交的目的。在进行碰撞检测的过程中,先对物体的包围盒进行粗略检测,当两个几何体的包围盒相交时,这两个物体才有可能相交;当包围盒不相交时,这两个物体一定不相交。这样可以排除大量不可能相交的几何体,从而快速找到可能相交的几何体。包围盒算法主要包括:轴平行包围盒AA
46、BB(Axis Aligned Bounding Boxes)算法,包围球(sphere)算法,沿任意方向包围盒OBB(Oriented Bounding Box)算法,固定方向包围盒FDH(Fixed Directions Hulls)算法等。FDH是由事先确定好的K个方向的半平面组成的包围体,FDH又称为KDOP(DOP是在包围盒对物体逼近的紧密性和包围盒碰撞检测的复杂性之间取的折中方案) 8。1. 轴平行包围盒AABB(Axis Aligned Bounding Boxes)算法AABB是进行碰撞检测的三维几何体的外接平行六面体,并且每条边都平行于坐标轴。因此,描述一个AABB包围盒仅需
47、要六个标量。在构造AABB时,需要沿着物体局部坐标系的轴向进行构造,所以AABB具有一致的方向。AABB的算法简单、易于实现。但其紧密性较差,当几何体旋转后需要对AABB也进行同样的旋转,从而增加计算量,使计算速度减慢。计算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,c2. 包围球(sphere)算法包围球是进行碰撞检测的三维几何体的最小外接球,当几何体旋转后不需要对包围球进行旋转。包围球同样具有计算较为简单,紧密性较差的缺点。计算包围球的重点在于计算包围球的球心和半径。其球心的计算与AABB的计算相同。半径则是长、宽、高的最大