基于flare3d引擎的赛车游戏的毕业论文.doc_第1页
基于flare3d引擎的赛车游戏的毕业论文.doc_第2页
基于flare3d引擎的赛车游戏的毕业论文.doc_第3页
基于flare3d引擎的赛车游戏的毕业论文.doc_第4页
基于flare3d引擎的赛车游戏的毕业论文.doc_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

基于flare3d引擎的赛车游戏的毕业论文目 录前 言4第一章 3D游戏概论4第一节 3D游戏研究背景4第二节 国内外发展现状和趋势4第三节 本论文研究的主要内容4第二章 框架以及图形引擎概述4第一节 flex简介4第二节 flare3d引擎介绍4第三节 flare3d项目资源4第三章 3D赛车游戏开发过程4第一节 项目准备工作4创建新游戏项目4创建场景4加载3d模型4增加监听处理函数4游戏组件4第二节 键盘输入和用户界面的实现4一、使用Input3D类来获取键盘输入4二、Input3D类中的Update方法4第三节 摄像机管理的实现4一、创建摄像机4二、旋转、移动摄像机4三、摄像机追踪效果4第四节 碰撞检测与处理4第五节 加速度,摩擦,速度和角速度的实现4一、加速度,速度,摩擦的实现4二、前后车轮旋转的实现4第六节 氮气加速效果的实现4第四章 程序运行测试4结 论4致谢4参考文献4附 录4一、英文原文:4二、英文翻译:4三、源程序:447重庆邮电大学本科毕业设计(论文)前 言如今3D游戏受到人们狂热地追捧,游戏种类层出不穷,产业规模空前壮大,开发流程日趋成熟,玩家更是跨越了所有年龄群。不仅PC平台,手机、Web、PDA等众多平台都出现了相应的3D游戏。因此,国内外学者、工作室、游戏公司都十分热衷于对3D游戏的开发。使用的实现工具也多种多样,编程语言方面,有AS3、C+、C#、Java等;图形引擎方面有Stage3d、DirectX、OpenGL、flare3d等。本论文是使用AS3语言结合Adobe flash builder开发环境完成的网页3D赛车游戏开发。在开发3D赛车游戏的过程中,引擎是程序支持的核心组件,利用引擎,开发者可迅速建立、铺设程序所需的功能。通过对市面上常见的几款引擎的对比,在本文后续的几个章节中,分别用flare3d引擎实现了游戏中的碰撞检测技术和摄像机控制技术。本项目通过实现网页版的3D赛车游戏,来亲身体验3D游戏开发中的乐趣和经验,并且对flare3D引擎的多项功能及代码实现方式做了研究和实现。第一章 3D游戏概论第一节 3D游戏研究背景在电子游戏的发展历史进程中,3D游戏占据了举足轻重的地位。3D游戏以其栩栩如生的画面效果、声音、粒子、三维等特效而带给玩家一种全新的体验。建立在3D技术之上所构建的游戏世界,可以轻松地实现传统2D游戏所无法实现的效果,例如摄像机跟踪、镜头回旋、慢动作播放等推拉摇移的电影化效果1。3D游戏虚构了一个真实的世界,并力图呈现出一个场景空间感强,有着动态视角、真实光源、全屏特效等融合在一起的亮丽画面。这将在视觉效果上极大地增强冲击力,引领玩家进入一个绮丽梦幻般的幻想空间1。在游戏中建立中3D环境,使画面不仅在视觉效果上,更在游戏规则上带来相当大的突破,玩家需要面对的不再是一个平面,而需要在一个虚拟的立体环境中进行思考,全方位地考虑如何在地面、天空中展开竞技比赛,并迎接来自于360度立体环境中的对手的挑战。游戏的变化丰富度,要远远超出传统的2D、2.5D画面表现下的前代产品。然而如何真实高效地渲染3D场景、构建完整的游戏模式成为广大3D游戏开发人员的难题。首先,3D游戏效果虽被人们熟知,但是想要使用某种常规方法来描述其形成是不容易的。其次,3D游戏的种类多种多样,这使得没有一种统一的方式对其描述。再次,创建物体模型并且真实地展现它们,这些步骤需要大量的设计时间和存储空间,而且生成的景物有可能过于单调,与真实世界相差甚远。因此,急需一套完整的解决方案来开发3D游戏。使用Adobe Flash Builder 4(前身的Adobe Flex Builder中)软件,旨在帮助软件开发商快速开发跨平台的富互联网应用程序(RIA)和内容使用开源的Flex框架2。它包括对智能编码,调试,可视化设计和功能强大的测试工具,加快发展,并导致更高性能的应用程序的支持。该软件可以帮助软件开发人员使用开放源 Flex 框架快速开发跨平台的 Internet 应用程序 (RIA) 和内容。它包含对智能编码、调试及可视设计的支持,提供功能强大的测试工具,这些工具可以提高开发速度并创建出性能更高的应用程序。Flex 是一个高效、免费的开放源框架,可用于构建具有表现力的 Web 应用程序,这些应用程序利用 Adobe Flash Player 和 Adobe AIR 运行时跨浏览器、桌面和操作系统实现一致的部署3。 2009年5月,Adobe宣布了将下一代Flex Builder,即Flex Builder 4.0(是IDE,而非SDK)改名为Flash Builder。虽然只能使用 Flex 框架构建 Flex 应用程序,但是Adobe Flash Builder软件可以通过智能编码、交互式遍历调试以及可视设计用户界面布局等功能加快开发。本论文是使用ActionScript3语言结合Adobe flash builder4.6开发环境完成的网页3D flash赛车游戏开发。第二节 国内外发展现状和趋势极品飞车目前可能是最受欢迎的赛车游戏,第一代作品诞生于1995,到目前已经诞生了13代作品。在极品飞车中,玩家可以中仿照真实的地下改装车辆一般对自己的爱车进行从里到外的全面改造,当然,这是需要通过在游戏中获得比赛胜利,依靠奖金来实现的。高速奔驰下前方道路和环境移动的效果逼真绚丽。不论是黑夜中高楼林立的城市,眩目的霓虹灯残影,还是四周景物因高速而产生模糊效果都制作得非常细致。漂移、冲刺等等多种花样技巧的引入,使这款游戏具备了单纯竞速所不具备的快感。至于“辅助驾驶开关”也让游戏在驾驶和竞速方面得到了一定的平衡,给系统融入了新的活力。游戏的音响效果也非常好细腻,甚至连变速箱齿轮咬合的声音都被真实呈现,加上贯穿游戏的节奏感极强的摇滚乐,所有这些视觉、听觉上的高水准制作使得极品飞车逼真的刻画出深受西方年轻人喜爱的改车、飚车世界。目前国内的赛车游戏主要都是网络游戏类型,单从游戏画面的角度上讲,是不能和欧美的单机赛车游戏相比的,没有逼真的碰撞以及实时出现的火花四溅的效果,赛车的驾驶感也不够真实,但是由于是网络休闲游戏,在牺牲了驾驶的真实感的同时,驾驶的易操作性得到了极大的提升,只需要控制方向和加速,减速,大刹车即可。第三节 本论文研究的主要内容本论文主要研究了三维赛车游戏的制作,设计了一个简单的三维赛车游戏,实现了赛车游戏的基本功能。全文共分六章,具体安排如下:第二章主要介绍AS3语言和游戏引擎的相关知识,第三章介绍了游戏的结构以及赛本文采用的碰撞检测技术,摄像机控制技术等,最后第四章介绍了最终实现的赛车游戏的效果。本论文在全新的Adobe Flash Builder 4平台上,本研究课题的最终目标是学习、分析、运用flare3d技术和游戏开发技术进行网页3D赛车游戏的开发,并对flare3d技术本身的不足和游戏开发中出现的问题、难点进行分析总结。为了实现这一目标,本研究课题选用Adobe Flash Builder 4.6为开发环境,以3DMAX为建模工具,构建基于ActionScript3的3D游戏框架(需要安装新版flash player播放器运行)。整个研发过程解决如下技术问题:1.图形化用户界面2.摄像机管理3.碰撞检测与处理4.场景特效5.模型加载6.速度,加速度,和角速度的实现本课题的软件环境如下:编程语言:ActionScript3软件集成开发环境:Adobe Flash Builder 4.6, Flash Professional、Flash Develop图形引擎:flare3d运行时环境:Flash Player、AIR操作系统平台:Windows 7 x86浏览器:IE9硬件环境如下:CPU:Intel Pentium Dual T6600 2.2.GHz主板:Intel PM 965显卡:nVIDIA GeForce 8400GS内存:DDR3 4GB硬盘:520GB第二章 框架以及图形引擎概述第一节 flex简介使用 Flex 创建的 RIA 可运行于使用 Adobe Flash Player 软件的浏览器中,或在浏览器外运行于跨操作系统运行时 Adobe AIR上,它们可以跨所有主要浏览器、在桌面上实现一致的运行4。连接到 Internet 的计算机中超过 98% 装有 Flash Player,这是一个企业级客户端运行时,它的高级矢量图形能处理要求最高、数据密集型应用程序,到桌面应用程序的执行速度。本文使用的语言是AS3,AS3即ActionScript3.0的简称。 ActionScript 动作脚本是遵循 ECMAscript第四版 的 Adobe Flash Player 运行时环境的编程语言。它在 Flash 内容和应用程序中实现交互性、数据处理以及其他功能。 ActionScript是Flash的脚本语言,与JavaScript相似,ActionScript是一种面向对象编程语言2。第二节 flare3d引擎介绍游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。游戏引擎包含以下系统:渲染引擎、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理3。引擎的功能包括以下几个部分:碰撞探测是引擎物理系统的核心组成部分,它可以探测游戏中各物体的物理边缘。当两个3D物体撞在一起的时候,这种技术可以防止它们相互穿过 3。渲染是引擎最重要的功能之一,当3D模型制作完毕之后,美工会按照不同的面把材质贴图赋予模型,这相当于为骨骼蒙上皮肤,最后再通过渲染引擎把模型、动画、光影、特效等所有效果实时计算出来并展示在屏幕上。渲染引擎在引擎的所有部件当中是最复杂的,它的强大与否直接决定着最终的输出质量。引擎还有一个重要的职责就是负责玩家与电脑之间的沟通,处理来自键盘、鼠标、摇杆和其它外设的信号。如果游戏支持联网特性的话,网络代码也会被集成在引擎中,用于管理客户端与服务器之间的通信。市面上常用的游戏引擎有stage3D, flare3D,Wolfenstein 3D等,还有许多大型的网络游戏引擎都是游戏公司自己内部开发的,代码不对外开放。本文中选取flare3D来实现赛车游戏。flare3D 是一款功能强大的游戏引擎,引擎的使用使得 Flash 中的 3D 内容管理变得更为简便。使用该引擎来制作游戏能够提供一个完美的开发工作流程,能够使开发者能够获得事半功倍的效果5。Flare3D也是一个制作Flash3D程序的完整的套件。它包括:3DS Max导出插件和Collada支持,资源管理器(Resource Manager),游戏制作类库,以及碰撞检测、物理、动画、支持键盘和Joystick的设备控制等子系统。Flare3D平台能够借助Molehill GPU的渲染能力为Flash创建3D内容。利用Flare3D为Flash创建的内容无需任何额外的插件。在开发游戏大多数的引擎中存在两种的3D坐标系,flare3d引擎与别的引擎不同的事采用左手系坐标系统。这个左手系坐标系统就比如伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上。其余的手指指向前方。这样就建立了一个左手坐标系。拇指、食指和其余手指分别代表x,y,z轴的正方向。左手坐标系如图2.1所示图2.1左手坐标系第三节 flare3d项目资源一个游戏作品可以分为游戏引擎和游戏资源两大部分,游戏资源包括图象,声音,动画等部分。本项目中的flare3d项目资源包括如下几点:3D Max文件:所有用于本游戏的模型均使用 3D Max 进行建模。由于模型通常有很多个,所以在进行文件命名时模型文件必须有有描述性的名称,以便它们能够方便地与相应的游戏组件一一对应。2D 文件以及动画文件:这些文件包括后缀名为.jpg,.swf的文件Flare3D files:文件后缀为.f3d 是使用 Flare3 插件从 3D Max 直接导入的。这些文件放置于 bin 文件夹中。声音文件:是在游戏背景音乐时播放的文件,后缀名为.mp3第三章 3D赛车游戏开发过程第一节 项目准备工作一、 创建新游戏项目创建新游戏的第一步就是要新建ActionScript项目,在新建项目的过程中,本文选择应用程序类型为web(在Adobe Flash Player中运行),并且选择Flex SDK版本为Flex4.6.0,在这里设置的项目名称为“007_Flash3DCar”。新建项目完成后源文件中会自动引入一个名字为flash.display的包,并且在项目源代码中main函数需要重载Sprite类。这个Sprite类是AS3中基本显示列表构造块,是一个可显示图形并且也可包含子项的显示列表节点。此时项目中需要手动导入Flare3D_Trial_2048c.swc文件到项目目录下的“引用的库”文件夹中。后缀名为 SWC的文件是类似 zip 的文件(通过 PKZIP 归档格式打包和展开),它由 Flash 编译工具compc生成。二、 创建场景为了实现创建场景的功能,首先,需要创建一个保存3d对象的内容,该容器在本文中被命名成为“_scene”,本文中创建一个新的scene的实现代码如下:private var _scene:Scene3D;/声明_scenethis._scene = new Viewer3D(this);this._scene.registerClass(Flare3DLoader1);this._scene.registerClass(SpecularFilter);在引擎中,scene是一个容器,它的作用是来保存3D对象。在构建scene的时候,源程序中会注册一些基本的类,而SpecularFilter则是例外,所以要手动注册它。第二行代码的作用是使该场景是实例化一个Viewer3d,Viewer3d是Scene3d的版本,该对象能够通过场景旋转(scene rotation)功能和使用鼠标的缩放功能添加到viewer的功能中来扩展Scene3d的功能。三、 加载3d模型在场景创建完成之后,此时的场景是一片空白,为了将创建好的跑道和赛车以及其他附加的3d模型加载到场景中,本文使用如下代码来实现:private var _axis:Pivot3D;private var _car:Pivot3D;private var _map1:Pivot3D;private var _map2:Pivot3D;private var _map3:Pivot3D;private var _mapCollider:Pivot3D;private var _carCollider:Pivot3D;private var _weiqi:Pivot3D;this._axis = _scene.addChildFromFile(res/axis.f3d);/加载坐标轴this._car = _scene.addChildFromFile(res/jinngame_car.f3d);/加载汽车模型this._map1=_scene.addChildFromFile(res/map/jinngame_track0.f3d);/加载跑道模型this._map2=_scene.addChildFromFile(res/map/jinngame_track1.f3d);/加载天空模型this._map3=_scene.addChildFromFile(res/map/jinngame_track2.f3d);/加载街景模型this._mapCollider=_scene.addChildFromFile(res/jinngame_trackpzt.f3d);/加载跑道碰撞体模型this._carCollider=_scene.addChildFromFile(res/jinngame_carpzt.f3d);/加载汽车碰撞体模型this._weiqi=_scene.addChildFromFile(res/jinngame_weiqi.f3d);/加载尾气模型注:本文中,所有的资源文件被放到项目目录下的res文件夹中,后缀为.f3d的文件是使用3DMAX做的模型。当以上8个3d模型加载完成后,添加代码this._scene.pause(),该代码的作用是使模型避免边加载边渲染,也就是使模型全部加载完成后再渲染。在以上代码中,addChildFromFile()方法每加载一个新的资源,就会触发底层的Scene3D.COMPLETE_EVENT的方法。该方法的作用是将一个外部资源作为child添加到舞台上,并且将该对象作为一个Pivot3D容器返回。四、 增加监听处理函数在本文中上一节的3d模型加载的过程中,需要添加资源全局的加载进度和加载之后需要处理的事件,这些需要处理的事件包括摄像头的跟踪,碰撞检测的处理以及赛车的加速减速算法,因此,在这里本节创建了两个监听函数,代码如下:this._scene.addEventListener(Scene3D.PROGRESS_EVENT,onSceneProgress);this._scene.addEventListener(Scene3D.COMPLETE_EVENT,onSceneComplete);private function onProgress(e:Event):voidtrace(this._loaderManager.totalLoadProgress * 100 + %);this._loadingMC.gotoAndStop(Math.round(_loaderManager.totalLoadProgress*100 );private function onComplete(e:Event):void /省略到此为止,本文游戏的应用程序模型和基本框架已经搭建完成,后面游戏实现的代码全部都写在onComplete()函数中。之所以使用事件监听,是为了更利于项目组织代码和系统设计的分层。在AS3编程中,flash事件模型的核心是监听器,在这里本节调用了Scene3D类中封装好的PROGRESS_EVENT和COMPLETE_EVENT方法,前一个方法使舞台正在加载时在后台显示加载进度(以百分比显示,每毫秒进行刷新),后一个方法来完成舞台加载后进行的下一步操作,包括定义其他部件,定义input3d类获取键盘操作,进行汽车与跑道碰撞体的碰撞检测等。五、 游戏组件游戏组件提供一种有标准组件的方法向游戏添加功能。通过通过继承Sprite类来创建游戏组件。然后通过重载Pivot3D、SphereCollision 、Camera3D 和Scene3D向游戏组件添加游戏逻辑和渲染代码。第二节 键盘输入和用户界面的实现一、使用Input3D类来获取键盘输入在AS3语言中,flare3D引擎提供了一个Input类封装控制输入,这个Input3D类具有许多轻松获得所有最常用的键盘,鼠标状态的属性。此类最重要的方法是Update方法。在程序中,通过Input3D类的属性可获取键盘参数,检查是否有另一个键或按钮被按下,当键盘的上下左右及空格键被按下时,通过代码分别进行不同的处理。通过Input3D类来获取键盘输入方法的代码如下:private var _carSpeed:Number = 0; /汽车的初始速度设置为0if(Input3D.keyDown(Input3D.UP) | Input3D.keyDown(Input3D.W)_carSpeed += 0.2;/当按下UP或者w键时,汽车的速度增加0.2if(Input3D.keyDown(Input3D.DOWN) | Input3D.keyDown(Input3D.S) _carSpeed -= 0.2; /当按下DOWN或者S键时,汽车的速度降低0.2if(Input3D.keyDown(Input3D.LEFT) | Input3D.keyDown(Input3D.A) _carRotation -= 6; if(Input3D.keyDown(Input3D.RIGHT) | Input3D.keyDown(Input3D.D) _carRotation += 6;/前轮沿着Y轴旋转if(Input3D.keyDown(Input3D.R)trace(汽车位置: + _car.x + , + _car.y + , + _car.z); /控制台打印汽车位置在上述代码中,当按下不同按键时,数值也跟随发生了变化,这些数值分别改变了汽车的速度和坐标数值。关于这些数值如何实现改变汽车的旋转方向以及旋转速度的方法将在本文后面的章节做讨论。二、Input3D类中的Update方法在Input3D类获取键盘输入参数时,Update方法是该类中最重要的部分,因为上一帧的所有状态被复制,然后获得每一个键盘,鼠标输入的新状态。该方法每一帧都被调用(在BaseGame类的Update方法中被自动调用)。三、游戏屏幕本游戏的用户界面不是很复杂,由一个进入游戏时进度条加载界面和游戏主界面组成,两个界面由加载模型的时间自由衔接切换。游戏加载进度条的主界面如图3.1所示:图3.1 进度条界面在进度条加载的界面中,屏幕左侧的小圆圈会随着加载的进度不断充满,直到场景加载完成结束。本文中实现这个功能的要点在于小圆圈不断充满的过程是事先用Adobe flash做好的动画,该文件后缀名为.swf,该文件被放在项目目录下的“res”资源文件夹中。同时,在main函数中,加载器需要创建监听函数,本文中的监听事件命名为onProgress,onProgress函数的实现代码如下:private function onProgress(e:Event):void this._loadingMC.gotoAndStop(Math.round(_loaderManager.totalLoadP rogress*100 );当进度条加载完成后,游戏运行的的主界面如图3.2所示:图3.2游戏运行的的主界面街景地图缩略图如图3.3所示:图3.3街景地图缩略图游戏中的键盘操作方式:前进:W键或者后退:S键或者左转:A键或者右转:D键或者氮气加速:空格键第三节 摄像机管理的实现一、创建摄像机首先,需要创建一个Camera3D,实现该功能的代码如下:private var _camera:Camera3D;this._camera = new Camera3D(myCamera);this._scene.camera = _camera;此时,Camera3D默认是被摆放在3D世界的中心(0,0,0)点的,在这个视角里,玩家看不到跑道,也看不到赛车。因此,还需要对摄像机设置一个相对于赛车的相对位置和视角的初始值,这将在本节的后续部分讲述。二、旋转、移动摄像机相机的Position和Target向量是指向3D空间中的真实位置,在创建摄像机完成后,需要为摄像机分配初始值,本文中实现该功能需要两个步骤: 确定摄像机的世界坐标。相机的Position和Target向量指向3D空间中的真实位置,在多数赛车游戏中,摄像机的相对位置是在赛车后方的,就是说需要我们把摄像机观察的角度放在汽车尾部,以便于玩家从尾部观察赛车的前方道路和方向。在本文中设置的赛车的初始位置为跑道起点位置,赛车的初始起点位置被设置在了x,y,z坐标数值分别为-200,0,-230的空间坐标系中,赛车的起点位置设置代码为:this._carCollider.setPosition(-200, 0, -230)因此在摄像头的坐标选取上,只需把摄像机3d坐标中的x,y,z坐标相对于汽车坐标分别调大一些即可。在确定摄像机位置时需要经过多次尝试,不断的对比,才能确定更好的可视角度。经多次测试,将摄像机的x坐标设为-10,y坐标设为7,z坐标设为-11是一个理想的坐标,该段实现代码为:this._camera.setPosition(-10, 7, -11); 确定旋转摄像机所需的观察点。 相机的位置确定之后,需要手动调试摄像机观察的角度,这个角度是相对于摄像机来说的角度,并且在游戏中这个角度将不能改变。为了便于理解,摄像机的x,y,z角度如图3.4所示:图3.4摄像机在本文中该角度被设置为(0,0,0),实现代码为:this._camera.lookAt(0, 0, 0);三、摄像机追踪效果经过上述两个步骤,确定了摄像机的位置,观察目标和相机的up方向,因此相机已经被唯一确定了。但是,目前为止,当赛车前进后退时,镜头还不能跟随汽车移动,甚至当汽车前进过多时,就超出了摄像头的可视范围,此时,屏幕上显示的就好像汽车消失了一样,这样来玩家完全不能体会到游戏的真实感和乐趣。此时,本文使用代码实现了一个摄像机的追踪效果,这个追踪需要让摄像机连续不断的跟踪赛车位置,追踪效果的原理如图3.5:图3.5 摄像机追逐原理实现摄像机追踪的代码如下:Pivot3DUtils.setPositionWithReference(_camera, 0, 10, -10, _carCollider, 0.025);Pivot3DUtils.lookAtWithReference(_camera, 0, 0, 0, _carCollider);摄像机的追踪效果的实现在于重载Pivot3DUtils 类的setPositionWithReference函数和lookAtWithReference 函数。前者对输入的摄像机目标位置和原摄像机位置进行插值,得到平滑的摄像机移动轨迹。而后者是摄像机在这个位置时镜头的偏移情况,此时的偏移情况为0,0,0。上述代码中,setPositionWithReference方法重载的第5个参数为0.025,表示赛车摄像机的弹力(弹簧)效果。游戏摄像机绑定需要有一个缓冲,因为车子转弯的时候,视觉并不是实时地转弯,会有延迟,加一个缓冲,会使效果更逼真。在此处,经过多次测试,0.025能表现一个很好的效果。第四节 碰撞检测与处理边界碰撞检测是游戏中的一项重要功能,是游戏乐趣的硬件基础。目前人们已经研究出了多种碰撞检测的方法,例如包围盒、八叉树等。但在本游戏中并没有采用这些方法,原因是这些边界碰撞的方法较为复杂,并且需要大量的场景数据作支撑,虽说效果较好,但前期准备工作较多,不利于整个项目的开发。目前成功商业3D游戏普遍采用的碰撞检测是采用包装盒方式。简单讲就是采用一个描述用的正方体或者球型体包裹住3D物体对象整体(或者是主要部分),之后根据“描述用”包装盒的距离、位置等信息来计算是否发生碰撞6。在flare3d引擎中,SphereCollision 是一款用于处理复杂几何图形碰撞的工具。它是引擎中计算强度很大的数学算法,它本质上是一个与一个或多个 mesh 对象碰撞和相互作用的虚拟球体。此外,该 SphereCollision 工具在碰撞发生时还能够提供一段平滑的位移,这一情形被称为滑块(slider)。在SphereCollision算法中,碰撞检测最直观的想法是把一个OBB盒子的每个边都和另一个盒子的所有面来比较,如果这个边穿过了另一个OBB盒子的一个面,则两个OBB盒子发生了碰撞7。显然这种方法的计算量是比较大的,因为要进行1262=144次边和面的比较。实际上,在考察两个没有碰撞的OBB盒子时,算法中还有一些规律来简化比较:(1)如果两个OBB盒子不互相接触,则应该可以找到一个盒子上的一个面,这个面所在的平面可以把3D空间分为两部分,两个OBB盒子各在两边。(2)如果没有这样的表面存在,则一定可以在两个OBB盒子上各找出一条边,这两条边所在的平面可以把两个OBB盒子分在两边。有了这个平面,就可以找到垂直于它的分割轴(separatingaxis)13。(3)进行相交测试时,可以把包装盒投影到分割轴上,并检查它们是否线性相交8。在本课题的碰撞检测的实现过程中,检测方法的步骤是用3Dmax制作赛车碰撞体和跑道碰撞体,这个碰撞体就好像一个灰色的虚拟盒子,然后再将赛车碰撞体和跑道碰撞体进行球体碰撞检测。球体的碰撞检测的实现有以下几个步骤:1. 运用3dmax,创建汽车碰撞体实例。为了方便观察,本节中分别将赛车和赛车碰撞体做了截图来做对比。赛车模型原图如图3.6所示:图3.6 赛车模型原图赛车碰撞体模型如图3.7所示:图3.7 赛车碰撞体模型赛车和赛车碰撞体结合后的效果如图3.8所示:图3.8 赛车和赛车碰撞体结合跑道模型如图3.9所示:图3.9 跑道模型跑道碰撞体模型如图3.10所示:图3.10 跑道碰撞体模型跑道与跑道碰撞体结合后的效果如图3.11所示:图3.11跑道与跑道碰撞体结合2.创建一个 SphereCollision 实例,然后将赛车碰撞体模型球体和一个碰撞的球体半径值传递给它。private var _sphereCollision:SphereCollision;/创建一个 SphereCollision 实例this._mapCollider = _loaderManager.getPivot3D(mapCollider);this._carCollider = _loaderManager.getPivot3D(carCollider);/分别获取跑到碰撞体和赛车碰撞体模型this._sphereCollision = new SphereCollision(_carCollider, 5.5);/球体半径设置为5.5,这个值确定了碰撞体是否发生了碰撞3.使用 collisions.addCollisionWith( object ) 方法添加对象以便对球体进行测试。this._sphereCollision.addCollisionWith(_mapCollider);this._mapCollider.visible = false;/碰撞体在游戏中隐身不见4.通过调用 collisions.slider()方法更新碰撞。if(this._sphereCollision.slider() trace(发生了碰撞);第五节 加速度,摩擦,速度和角速度的实现一、 加速度,速度,摩擦的实现本段代码是接着第二节第一部分的代码继续实现的,前一段的代码实现了按下上下左右按键时加速度和角速度的增加,代码部分就不重复写在这里了。摩擦力和速度的实现代码如下:_carSpeed *= 0.9;_carRotation *= 0.9;/设置一个摩擦力来模拟一些物理现象,来逐渐降低速度和旋转_carCollider.translateZ(carSpeed);/使赛车沿Z轴向前走这段代码的作用是使赛车的前进速度随着时间不断下降,这带来的结果是玩家如果突然停止按前进键,那么赛车的速度终会变为0。二、 前后车轮旋转的实现在赛车模型中,赛车总共有四个轮子。当玩家按下键盘的左或者右键时,需要对前轮进行一个向左或者向右的位置偏移,这个偏移是相对于X轴的偏移,偏移量的数值被命名为_whellRotation,这个偏移量是随着赛车的速度增加而增加的。对于前轮来说,在X和Y轴都实现了不同的偏移,对于后轮来说,只实现了对X轴的偏移。实现赛车前后轮旋转的代码如下:_whellRotation += _carSpeed * 10;/对车轮设置随X轴的旋转偏移量_wheelFL.setRotation(-_whellRotation, _carRotation - 180, 0);/对赛车的前左轮进行绝对旋转_wheelFR.setRotation(-_whellRotation, _carRotation - 180, 0);/对赛车的前右轮进行绝对旋转_wheelBL.rotateX(-_carSpeed * 8);_wheelBR.rotateX(-_carSpeed * 8);/对赛车后轮使用本地旋转_carCollider.rotateY(_carRotation * _carSpeed / 20);/使赛车车身沿着Y轴旋转第六节 氮气加速效果的实现要实现赛车氮气加速的尾气效果,首先需要做赛车尾气效果的3d模型,模型做好后导入舞台,并且让其尾随汽车移动,在这里将尾气的初始值默认为隐身不可见。当玩家触发键盘上的空格按键时,需要将尾气设置为可见。为了实现加速的过程,程序中使用了AS3语言中的定时器类。定时器类是ActionScript 3.0的内置类,通过AS3的事件分发响应机制实现周期触发9。在本文代码中创建了一个总触发次数为5次的定时器timer。当timer启动后,每隔0.2秒会发出一次定时器触发事件。并且当timer启动时,设定了 “addEventListener()”函数来对timer事件进行监听,监听后编写addspeed ()方法来处理这个事件。当定义了定时器和监听函数之后,需要使用 “start()”方法启动定时器。当加速的过程完成之后,还需要再次绑定一个事件监听,这个事件的作用是将赛车尾气的效果重新设置为不可见。 实现这些功能的代码及注释如下文所示:private var i:int=3;/氮气次数最多为3次if(Input3D.keyHit(Input3D.SPACE)i-; /剩余氮气次数减少if(i=0)_weiqi.visible=true; /制造尾气效果,尾气的初值效果已经被设置为false var timer:Timer=new Timer(200,5); /每隔0.2秒会调用函数一次,调用5次后结束timer.start();timer.addEventListener(TimerEvent.TIMER,addSpeed);/4次加速完成后,自动调用timercomplete这个方法timer.addEventListener(TimerEvent.TIMER_COMPLETE,timerComplete)Private function addSpeed(e:TimerEvent):void_carSpeed+=3; /汽车速度提升trace(加速了.); private function timerComplete(e:TimerEvent):void_weiqi.visible=false;/加速过程的时钟调用完成后,将尾气复原为不可见赛车的尾气加速效果如图3.12所示:图3.12 尾气加速效果图第四章 程序运行测试当游戏程序启动开始时,首先在屏幕画面出现的是游戏的加载进度条界面。加载进度条界面截图如图4.1所示:图4.1 加载进度条界面截图游戏文件加载完成后,系统会自动进度游戏主界面,游戏主界面如图4-2所示,此时是长镜头由远到近,按下相应按键即可开动赛车。游戏街景的界面截图如图4.2所示:图4.2 游戏街景的界面截图结 论本项目研究基本上达到了预期计划和目标。论文讨论了基于flare3d的网页版3D赛车游戏开发,探讨了目前国外3D游戏的发展现状和发展方向,详细说明了3D赛车游戏的建模方式和使用flare3d技术进行三维图形编程的方法。并利用flare3d引擎开发出了一款3D赛车游戏,实现了诸多功能,增加了碰撞检测、场景特效等游戏理论和技术的研究,达到了预期效果。在功能点上分别实现了边界碰撞检测、汽车力学分析、三维建模,氮气加速,摄像机管理和场景切换。当然,整个项目还存在诸多不足。技术上,比如程序加载资源耗费较多CPU时间,导致玩家进入游戏缓慢;汽车的氮气加速的尾气物理效果如较为粗糙,和实际效果有一定差距;游戏特效较少;没有加入网络模块,不能进行联机对战;项目规划上,前期缺乏细致严密的思考,对项目进度考虑欠佳,导致开发过程没有很好的条理性和均匀的进度。 这些不足一方面是由于对flare3d新技术研究不深所造成的,另一方面也是由于我前期考虑不周密造成的。在目前的基础上,今后有如下开发计划:(1)添加更多的特效,比如说汽车碰撞之后的损毁、汽车之间碰撞时的火花、汽车急速刹车时轮胎印等。(2)增强物理效果,如重力、碰撞、减速、拐弯的真实性。(3)添加网络模块,实现局域网联机对战。(4)优化程序,减少CPU和内存占用。(5)优化机器人的智能性。添加各种特效,例如爆炸、汽车灯光、轮胎痕迹等。“游戏开发是高度的设计奇思”。游戏设计是一门学问,它涉及的技术和知识太交叉、太综合。它包含众多单独的环节,最后还得把这些部分有机地结合起来。经过此次游戏开发经历,我感觉自己还有众多不足,单有良好的技术是不够的,设计理念和灵感也同等重要。但只要时间允许,这些都可以经过后天的努力去弥补。此次开发经历所积累的经验,必将成为我人生中的一份宝贵的财富!致谢首先非常感谢我的导师刘歆老师在毕业设计过程中给我的巨大帮助和鼓励。这次毕业设计对我影响很大,学到了许多课本上学不到的东西。在这三个月中,通过刘歆老师的指导,我不但从理论上对自己的专业有了更好的认识,还积累了不少实践经验,使我在思想深处体会到,学以致用才是最终的目的,实践是检验所学专业程度的最好途径。这三个月,对我来说是宝贵的三个月,它让我懂得了一个软件人员不但要有良好的编程习惯,还要有不断学习的精神和不断挑战自己的勇气。这次的毕业设计的题目对我来说并不是个全新的课题,因为之前我学过图形学和OpenGL的相关知识,它们和flare3d关系十分密切。关于本次毕业设计的课题,所完成的只是一个简单的3D赛车游戏,还有许多的设想由于时间和自身的因素无法得到实现,这是本次设计的遗憾之处。但是,至少它能够启发了我的思维,提高动手能力和解决问题的水平,这是我在课本和课堂中学不到的。这次毕业设计为以后的学习和工作中上发挥自己、表现自己提供了坚实的基础。再次感谢刘歆老师和在整个毕业设计过程中给我提供建议和帮助的所有同学!参考文献1 Reeves,W.T. Particle SystemsA Technique for Modelling a Class of Fuzzy Objects. Computer Graphics,1983,17(3):359-376.2 美Richard S.Wright,Jr. Benjamin Lipchak著,OpenGL超级宝典(第三版),北京,陈冀康,20053 Dave Shreiner ,Mason Woo ,Jackie Neider ,Tom Davis著,OpenGL编程指南(第四版),北京,李岚,20054 美Christian Gross编著,AS3基础教程:第2版,北京,人民邮电出版社,20105 美Andrew Kirmse编著,游戏编程精粹4,北京,李岚,20056 潘云鹤、董金祥、陈德人著,计算机图形学-原理,方法及应用(修订版),北京,高等教育出版社,20037 史济民等编著,软件工程(第二版),北京,史济民,20028 美Frank D.Luna编著,DirectX 9.0 3D游戏开发编程基础,北京,清华大学出版社,2007.049 美Miller, Tom编著,Managed Directx 9,Macmillan Computer Pub Press,200510 美Harrison, Lynn Thomas编著,Introduction to 3d Game Engine Design Using DirectX 9 and C#,Springer-Verlag New York Inc,2004.0711 周卫荣,朱天相. 碰撞检测引擎模块的设计. 南华大学学报J. 2005 (19):85-88.12 李文娟, 阎光伟, 王媛. 三维物体碰撞检测中的包围盒算法. 中国电力教育J.2008(z2).13 Frank Luna. Introduction to 3D Game Programming with Direct X 9.0c: A Shader Approach

温馨提示

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

评论

0/150

提交评论