1DELTA3D中文指南OmanEmail:gelu110@sohu.com转载请注明出处。前言该文档内容来源于那份古老的英文教程,中间删除了一些没用的片段以及场景编辑器、粒子编辑器和3Dmax的介绍,只保留了Delta3D引擎开发本身的一些内容。该译文是为个人学习之用,没做过多斟酌和细致处理,难免有纰漏,还请理解。翻译过程中原文的actor本人硬是翻译成了”角色”,本人更喜欢这个词,各位看官要是不习惯,也就将就着吧。此外,由于原文件是基于1.3版本的,本人没有结合新版本进行纠正一些内容,有时间该部分工作会在今后补上。鉴于本人英文水平及专业技术水平非常有限,翻译或整理的不当之处还请见谅。一、特点Delta3D是一套可以用在游戏开发、仿真项目开发以及其他三维图像应用开发方面的开源引擎。该引擎采用模块化设计,集成了著名的OSG图形渲染引擎,ODE物理引擎,CAL3D动画库,OpenAL立体音效,Qt,CEGUI,Xerces-C,Producer,智能感知驱动,HawkNL网络引擎,以及GNE游戏网络引擎。Delta3D没有采用将这些第三方引擎或框架屏蔽到底层的方式,而是采用比较简单的方式直接将其集成在一起,这样以来,用户在需要的时候就可以直接访问这些库的API,使用起来更加灵活。Delta3D的主要目的就是提供一套可以在游戏开发以及所有虚拟现实应用开发方便使用的简单、灵活的API库。在这些基础组件的基础上,它还提供了很多的工具供用户使用,如仿真工具,训练工具,游戏场景编辑器,BSP编译器,粒子编辑器,模型浏览器,HLA浏览器等。此外,它还扩展了一些应用开发框架,比如应用基础类库dtABC,动态角色层dtDAL,通过该框架可以在动态情况下处理角色的角色代理以及角色属性等,直接方法连接的信号/槽(实现系统的消息机制),用于管理角色的游戏管理器,插件式的地形读取、渲染、装饰工具以及用于角色之间互相通信的高层消息处理。dtCore包含以下基本功能:输入设备映射(Keyboard,Mouse,Joystick,Trackers)2运动模型(类似OSG的场景漫游器,我们可以用Delta3D的这种运动模型对场景角色施加运动驱动,也可以直接驱动相机,我们也可以直接用OSG的场景漫游器)(Fly,UFO,Walk,Orbit,FirstPerson)环境渲染(clouds,haze,skyboxes,timeofday)粒子特效(Smoke,Explosion,Custom)地形渲染(InfiniteProceduralterrain,Heightfield-basedterrain)文件加载o.3dc,.3ds,.ac,.dw,.flt,.geo,.ive,.logo,.lwo,.lws,.md2,.obj,.osg,.tgz,.x,.zipo.bmp,.dds,.gif,.jpg,.pic,.png,.pnm,.rgb,.tga,.tiff,.txpo.wav相机控制(FieldofView,Tripod)多相机支持多窗口支持物理系统(RigidBody,CollisionDetection,Auto-boundingshapes)OpenGL光照贝塞尔路径节点OpenGL2.0支持GLSL顶点、片元着色器dtAnimation(新版本已废除dtChar,不知道是删除了还是被其他库替换了,因为对老版本不清楚,感觉像是现在的dtAnimation)动画混合dtABC高层应用开发基础组件.可以看做是一个应用层框架,方便应用层的开发.应用程序模板天气接口(visibility,cloudcoverage)与FLTK的窗口集成与其他窗口系统集成的控件封装dtHLA(新版本已废除,统一用dtNet)dtTerrain3实现地形加载、渲染、装饰的地形处理框架。对地形数据的读取、渲染及地形装饰采用插件式结构。地形分页分块,地形图像处理,地形噪声生成DTED数据读取具有连续层次细节的SOARX渲染程序化的植被布放–landcoverclassification(LCC)support图形覆盖–GEOTIFFsupportdtDAL动态角色层提供了一个创建、访问和操纵场景角色的通用框架,主要包含以下内容:角色代理和角色属性角色插件库管理角色工程和角色关系图加载角色属性类型:Sound,Terrain,Character,Texture,StaticMesh,ParticleSystem,Enumeration,Actor,Color,Vec2/3/4,String,Int,Double,andmore角色代理基础引擎dtGUI与CEGUI结合的GUI接口库UI元素绘制和渲染可扩展的界面皮肤接口默认GUIdtGame该库为用户提供了一个创建复杂游戏或仿真训练应用的完整框架。游戏管理器是一个用于单机或C/S网络模式下系统角色或组件之间进行通信的高层基础框架。游戏角色和代理GM组件结构采用插件方式,有默认的消息处理器,规则组件和日志组建;消息组件结构–包含消息和消息工厂网络诊断–支持单机、C/S网络模式以及回放用于发送、接收和记录消息的消息流基础的游戏客户端、服务器管理器4dtUtilDelta3D中使用的基础实用对象功能.文件日志和XercesXML文件操作纹理、噪声、矩阵、字符串操作程序库管理类型安全dtBSP(新版本已废除)dtAudio提供高级声音回放功能2D/3D音效完整的音效控制(gain,pitch,position,play,stop,pause,rewind,etc.)多普勒音效声音硬件的高效使用dtNet提供用于多玩家网络应用的高层APIC/S结构可靠/非可靠数据包网络传输dtPython*提供通过Python脚本访问API的接口完整的API访问接口*需要下载Python和BoostSTAGE–仿真、训练、游戏场景编辑器一个完整的可视化的场景编辑器,可以通过该编辑器创建程序场景。5地图编辑–工程资源和库(如角色库)管理角色的可视化创建与操纵属性编辑器以及角色链接的撤销与重做单屏多视口线框光照及纹理模式可配置的撤销、重做用户接口角色搜索与全局角色管理纹理,网格,声音和粒子浏览TestsDelta3D提供了一系列应用例程测试,通过这些测试可以帮助用户进行快速熟悉Delta3D的使用以及应用开发。几乎覆盖了Delta3D各个方面的几十个实验例程几千行的测试单元代码CrossPlatformSupportsWindowsandLinux(FedoraCore4)binaryandcompilation.MSVisualStudio2003solutionsandprojectsCompleteSConsscriptsUtilities图形化的粒子特效编辑器模型浏览器BSPCompiler(已废除)HLA图像化的行为浏览器二、三、GMTutorialParts1.GMTutorialParts1and26现在让我们开始游戏管理器开发指南之路。该指南的目的就是让新手熟悉在使用Delta3D的游戏管理器开发游戏或仿真应用时会用到工具。PartOne:游戏管理器介绍o什么是游戏管理器?o什么是游戏角色?o什么事游戏管理器组件?o什么是游戏消息?PartTwo:游戏角色oHover坦克游戏角色oHover坦克游戏角色代理o注册我们指南中的游戏角色o在场景编辑器中加载我们的Hover坦克PartThree:用GameStart创建一个游戏oGameStart和theGameEntryPoint库o创建TutorialGameEntryPoint类PartFour:消息以及可激活体o游戏事件o可激活体(ie.MessageHandlers)o输入组件o坦克驱动1.PartOne–IntroductiontotheGameManager这部分介绍游戏管理器的基础结构。包括游戏管理器,游戏角色,游戏组件以及游戏消息。下图就是这几大部分的一个整体的高层结构图。7Figure1.GameManagerOverviewTheGameManager(GM)?什么是游戏管理器?如果你看了上面这个图,你最先应该注意到游戏管理器拥有所有的游戏角色,普通角色,组件以及消息。具体来说就是它管理你的整个虚拟世界中存在的所有要素以及角色或组件之间的交互。Delta3D给了我们需要的所有的东西:场景管理,物理系统,立体音效,对象加载,动态角色库,环境特效,光照,地形支持,相机以及角色动画。但是,有了这些我们怎么将它们放在一起组成个游戏呢?在游戏中谁来维护游戏中所有对象的列表?还有,如何管理通信?武器装备如何进入游戏并装备玩家呢?如何告诉玩家他被射中了?并且,如果你射中了他,你怎么告诉网络上得其它玩家他受伤了?有很多很多需要我们关注如何管理我们的游戏。幸运的是,游戏管理器提供了一个核心基础结构来完成这些。消息,角色及组件!8为了管理你的游戏,游戏管理器主要做三件事。第一,也是最重要的就是管理消息,确切讲就是游戏消息。通过消息,我们就可以在角色、组件以及游戏管理器之间进行通信。消息可以用于任何事物之间的通信,比如玩家建康指数的更新,人质营救事件通知,新的玩家进入我们的虚拟世界,甚至是简单的滴答事件。在系统内部消息在所有的行为以及状态变化之间进行通信,但消息并不发送消息本身,消息的发送由游戏管理器来处理,游戏管理器接收、路由角色以及组件的消息。游戏管理器的第二大工作就是维护系统内部的所有的角色,包括游戏角色以及以及普通角色。它可以跟踪我们通过代码创建或者从Map文件(由场景管理器创建)加载进来的角色。同喜管理器可以通知角色处理消息,保证它们在合适的时间进入场景或退出场景,甚至通知它们对滴答事件作出响应。第三大工作就是提供游戏管理组件功能。你可能要问,什么是游戏组件?一个游戏组件就是一个和游戏消息一起工作的高层对象。但是,那不是游戏角色的工作吗?是,也不是。为什么这么说呢?游戏角色的确处理消息,但是,我们在游戏中往往会有很多的角色实例。而游戏组件处于更高层面。它们处理像网络行为,游戏规则,日志,航位推测等事务。而游戏角色只是接受它们感兴趣的特定消息,而游戏组件接受所有的消息。什么是游戏角色?希望你对游戏角色和游戏角色代理已经熟悉了。那么,什么是游戏角色呢?简单说一个游戏角色就是一个被设计成为可以直接和游戏管理器一起工作的一个角色。如果你对游戏角色布熟悉的话,现在应该花点时间学习一下游戏角色以及动态角色层的概念。为什么我们要区分普通角色和游戏角色呢?普通角色或者称之为非游戏角色一般指那些游戏世界中得静态的物体,比如房子,不移动的灯光,树木或者地形等。但是游戏中只有静态的物体是很枯燥的,游戏角色是那些给你的游戏带来生命的东西。游戏角色可以做出滴答响应,可以处理游戏消息并且可以和整个游戏世界进行交互。Figure2.GameActorProxy游戏角色是建立在动态角色层中的角色概念基础上的。所有自然地,一个游戏角色就需要一个游戏角色代理。事实上,游戏管理器只识别游戏角色代理,不直接识别游戏角色,这就意味着我们必须使用角色代理。聚焦到角色代理上,游戏管理器就会变得非常灵活。就想游戏场景管理器一样,对它们来说,游戏管理器的通用性非常重要。它不必知道一个坦克和一个玩家之间的区别,也不必知道一个9导弹和一个帐篷之间的区别。如果游戏管理器不是通用的,我们就无法实现非常漂亮的日志记录以及回放功能。什么是游戏管理器组件?简单来说,一个游戏管理器组件就是一个由游戏管理器管理的可以处理和发送消息的对象。它不像游戏角色,游戏管理器组件接受系统中所有的消息。通常情况下组件提供高层的系统行为,但它们可以处理你想要的任何事情。游戏管理器组件是我们向游戏管理器添加自定义行为的最主要的方式。你可能想知道我们究竟为什么需要这些组件。为什么我们不能直接从游戏管理器派生我们的子类并将我们的特