计算机时代2014年第2期0引言目前,作战实验中大量采用了3D图形技术。在游戏和仿真领域,从技术实现上可将3D图形技术分为基础层、中间层和应用层三个层次。基础层主要是3D加速硬件和厂商提供的基本的API函数接口;中间层则是根据游戏和仿真各自不同的需求编写的公共引擎或软件(在游戏领域多称之为游戏引擎,仿真领域则称之为仿真软件或仿真环境);应用层则是具体的游戏产品或仿真应用。一个良好的仿真引擎是仿真应用研发的基础,在一个相对成熟的仿真引擎基础上,作战实验系统研发人员能够根据需求较快地开发出相应的作战仿真软件,仿真软件厂商也能很快地为客户建立各种仿真应用。目前仿真软件中有大量的商业化软件,如IdSoftware公司的Quake、QuakeII和QuakeIII引擎,EpicMegagames公司(即现在的Epic游戏公司)的UnrealTournament引擎,Monolith公司的LithTech引擎,但这些软件价格昂贵,且源码不开放,对作战实验这种需要从底层保证其结果可靠性的应用来说,造成很大困难。美军较早意识到了这种困难,他们积极转向开源软件。Delta3D是一款由美国海军研究生院(NavalPostgraduateSchool)开发的全功能游戏与仿真引擎,得到美国军方巨大的支持与丰厚的投资[1]。该引擎应用领域极为广泛,在培训、教育、娱乐行业和科学计算可视化领域等方面建模与仿真软件的开发中都得到了广泛的应用。它的标准化设计把一些知名开源软件和引擎如OpenSceneGraph(OSG),OpenDynamicsEngine(ODE),CharacterAnimationLibrary(CAL3D),以及OpenAL等融为一体。Delta3D通过对这些底层模块进行隐藏封装、整合在一起,从而形成了一个使用更加方便的高级API函数库,使得开发者在必要的时候能够使用底层函数进行二次开发。本文将对开源软件Delta3D的模块组成、开发方法以及与相关仿真软件的配合使用进行介绍。1Delta3D功能模块介绍Delta3D在软件系列中,处于中间层(Middlelayer)的位置上。Delta3D主要目标是提供一套简单可行的API函数库,构成搭建任何可视化软件的基本要素。Delta3D是一个开放源码的引擎,研发开始于2002年4月,集成了现有最先进的开源软件(OpenSourceprojects),并经过全球Delta3D关注者的增补与完善,相对于购买一款价格很高又不开放源代码的引擎具有很大的优势,使用Delta3d可以任意修改代码并且定制所需的功能,这是不开放源代码的商业引擎无法做到的[2]。Delta3D提供了一套与引擎高度集成的庞大的仿真模块体系,Delta3D主要含有的内部功能模块如图1所示。开源仿真引擎Delta3D在军用仿真中的应用陈喜春(石家庄机械化步兵学院作战训练实验中心,河北石家庄050083)摘要:由于商业仿真软件的高昂费用以及源码的不开放,许多军事仿真已转而使用开源仿真软件。Delta3D是一款由美军开发的全功能游戏与仿真引擎,通过对底层模块进行隐藏封装,将多个相关功能模块整合在一起形成一个使用更加方便的高级API函数库,目前在军用仿真领域已经较有影响。文章介绍了Delta3D的模块组成,应用程序开发的基本框架,以及与相关仿真软件的配合使用,并就开发过程中的相关问题给出了建议。关键词:Delta3D;仿真引擎;开源软件;军事仿真中图分类号:TP319文献标志码:A文章编号:1006-8228(2014)02-33-03ApplicationofopensourcesimulationengineDelta3DinmilitarysimulationChenXichun(ShijiazhuangMechanizedInfantryAcademy,Shijiazhuang,Hebei050083,China)Abstract:Becauseofthehighpriceofcommercialsimulationsoftwareanditsclosedcode,manymilitarysimulationdevelopmentshaveturnedtoopensourcesoftware.Delta3Disanall-purposesimulationengineforgamesandsimulationdevelopedbyUSnavy,whichintegratesmanydifferentkindsofopensourcesoftware,andhasagreatinfluenceonmilitarysimulation.ThemoduleswhicharecomposedofDelta3Dareintroduced.ThebasicframeworkofaDelta3Dapplication,andsomeadvicesondevelopmentarealsogiven.Keywords:Delta3D;simulationengine;opensourcesoftware;militarysimulation收稿日期:2013-10-31作者简介:陈喜春(1971-),男,河南新乡人,硕士,讲师,主要研究方向:仿真、嵌入式技术。··33ComputerEraNo.22014dtCore:包含通用基本功能。dtChar:包含动画融合(Animationblending),角色步长与场景协调(Avatarfeetcorrespondtoworldpositioning)等功能。dtABC:高级程序基本类模块,对于某些应用程序的开发很有用处。dtHLA:HLA网络模块的界面,实现坐标系统转换等功能。dtTerrain:提供执行地形载入,渲染,装饰的插件体系框架。dtDAL:动态角色层模块提供一个生成、访问、控制角色的底层支持。dtGUI:包含CrazyEddie'sGUI的简捷界面。dtGame:提供一个建立复杂的游戏,训练软件的体系。dtUtil:贯穿整个Delta3D的基本应用组件。dtBSP:将载入文件自动优化为BSP格式的组件。dtAudio:提供高级的音频处理函数库。dtNet:提供多用户网络操作的高级API函数库。除这些模块和函数类库外,Delta3D应用软件还提供了多种实用工具:仿真、训练、游戏编辑器:即STAGE,一个完整的可视化3D地图编辑器。可视化粒子效果编辑器:为粒子特效编辑提供一个使用与演示方便的操作界面。3D模型浏览器:是一个使用方便,独立运行的3D模型浏览工具。BSP编译器:是一个载入、编译和保存普通对象为BSP格式的工具。HLA阅读器:是一个对HLA网络所有实体对象进行3D描述的工具。2Delta3D应用程序的基本框架2.1Delta3D中的基本概念在Delta3D的开发中,有几个重要概念,如游戏管理器(GameManager),游戏角色(GameActor),游戏组件(GameComponent),以及游戏消息(GameMessage)。Delta3D提供仿真应用程序的基本要素,如场景管理,物理系统,立体音效,对象加载,动态角色库,环境特效,光照,地形支持,相机,以及角色动画。在应用程序中,游戏管理器负责管理整个应用程序虚拟世界中存在的所有要素以及角色或组件之间的交互,游戏管理器拥有所有的游戏角色,普通角色,组件以及消息。游戏管理器的主要任务是:管理消息;维护系统内部的所有的角色,包括游戏角色以及普通角色;提供游戏管理组件功能。普通角色或者称之为非游戏角色一般指那些游戏世界中静态的物体,比如:房子、不移动的灯光、树木、地形等,游戏角色指那些具有生命的角色。在Delta3D中,一个很重要的概念是角色代理。游戏管理器只识别游戏角色代理,不直接识别游戏角色。因此游戏角色只能够通过角色代理与游戏管理器发生关系。游戏消息是角色和组件之间互相通信的内容。消息通常用来发送数据(比如属性变化)或者行为(请求或命令)。图2展示了消息在游戏角色,游戏管理器以及组件之间的流向。图2游戏消息图示2.2基本程序框架[3-4]dtABC是应用基础类库,可以看做是一个应用层框架。一个最基本的应用程序可以从dtABC::Application来派生。基本程序代码如下:#includedtCore/camera.h#includedtCore/object.h#includedtCore/transform.h#includedtABC/application.hintmain(){std::stringdataPath=dtUtil::GetDeltaDataPathList();//创建dtABC::Application对象dtCore::RefPtrdtABC::Applicationapp=newdtABC::Application(config.xml);//加载地形dtCore::RefPtrdtCore::Objectterrain=newdtCore::Object(Terrain);terrain-LoadFile(models/terrain_simple.ive);app-AddDrawable(terrain.get());//加载对象图1Delta3D库的结构··34计算机时代2014年第2期dtCore::RefPtrdtCore::Objectbrdm=newdtCore::Object(BRDM);brdm-LoadFile(models/brdm.ive);app-AddDrawable(brdm.get());//设置对象位置osg::Vec3brdmPosition(0.0f,0.0f,3.5f);osg::Vec3brdmRotation(90.0f,0.0f,0.0f);dtCore::Transformtrans;trans.SetTranslation(brdmPosition);trans.SetRotation(brdmRotation);brdm-SetTransform(trans);//调整摄像机位置dtCore::TransformcamPos;osg::Vec3camXYZ(0.f,-30.f,15.f);osg::Vec3lookAtXYZ(brdmPosition);osg::Vec3upVec(0.f,0.f,1.f);camPos.Set(camXYZ,lookAtXYZ,upVec);app-GetCamera()-SetTransform(camPos);//进入程序循环app-Config();app-Run();return0;}程序的逻辑顺序依次是:创建新的dtABC::Application对象,加载实体对象,向场景中添加实体对象,设置实体对象在三维场景中的位置,设置摄象机,最后进入仿真循环。较复杂的仿真程序主要是在仿真推进中需要将对象的属性进行更新,所以需要管理的对象数量、复杂程度会大大增加。3与相关仿真软件的配合使用Delta3D是一套复杂的软件,它不仅仅实现了仿真程序框架,而且将其他一些开源项目进行了集成,从而可以实现更复杂的功能。3.1网络模块如今分布式仿真大行其道,仿真程序的网络功能是不可或缺的。HLA是如今仿真开发的标准架构,Delta3D也对HLA提供了支持。Delta3D提供了HLA组件作为一个消息翻译器(GameTranslator),游戏管理器(GameManager)对消息的处理首先要经过消息翻译器的处理,然后按照HLA架构的要求由rti软件进行收发。HLA组件对rti函数进行了封装,使用起来比直接调用rti函数要大大简化。rti软件同样有开源版本,与Delta3D配合使用时,推荐使用CERTI。除HLA外,Delta3D还可以使用另外的网络通信机制,如使用开源的GNE库(GameNetworkingEngine,游戏网络引擎)。GNE库是一个可移植的多线程网