仿真引擎

2025-01-10

仿真引擎(精选3篇)

仿真引擎 篇1

0 引言

传统的作战仿真模型大多是数学模型, 由于缺少基本作战规则库和实战经验数据的支持, 导致模拟出来的结果可信度不高[1]。随着计算机技术和虚拟现实技术的发展, 在战术甚至战役行动中描述单车、单兵的行动成为可能, 把过去得到的经验和公式推算结果变为直接最小作战单位的技术标准, 用于敌我对抗仿真结果可信度更高。目前, 我国开发出了模拟驾驶、战术训练、指挥模拟等系统, 将计算机作战仿真应用于部队的训练和作战, 但由于缺乏统一的仿真引擎, 各个系统只能从底层开始开发, 导致开发工作量大、通用模块无法复用以及各仿真系统无法集成运行等诸多困难, 研究一种通用的作战仿真引擎极具现实意义。

1 总体分析

1.1 架构设计

基于开源库的插件式军用仿真引擎提供了一个作战仿真框架, 将所需要的图形图像、声音、物理等开源库以插件的形式进行总体封装。图1是军用仿真引擎的整体架构。底层API是引擎的基础库, 包含了一些操作系统的API、内存、进程管理等基本功能。中间层包括了渲染系统、物理系统、输入输出等插件模块, 分工合作提供相应功能性接口, 并且降低各模块间的耦合。仿真引擎框架组合各模块, 协调各功能模块有序运行。

1.2 插件

插件的本质是在不修改程序主体的情况下对软件功能进行加强[5]。不同功能的模块是互相独立的系统, 模块内部可以使用任何架构方式, 只需要提供相应的接口即可。引擎以模块管理器为核心, 支持插件形式的组件增加方式。这种架构方式极其灵活, 且模块效率较高。具体实现包括: (1) 主体程序的插件处理机制。用来初始化每个插件, 并且管理好每个插件接口; (2) 插件的接口函数。对所有插件接口函数进行封装。仿真引擎框架作为主程序, 通过解析Plugins.cfg插件配置文件, 加载引擎所需要的各类插件。

1.3 开源与安全性

目前国外已开发了VR-Force、ARMA2、Vtree以及UnrealEngine、ID Quake、Unity 3D、Cryengine等诸多用于作战仿真和严肃军事类游戏的3D引擎。我国作战仿真只能采用国外的仿真引擎, 或者是从底层构建整个仿真系统。但是国外的仿真引擎随时可以停止开发授权, 或者直接在后台运行间谍进程, 因而安全性得不到保证。开源库则由于源代码是开放的, 即使有后门或者Bug也很容易被发现并进行修改和完善。基于开源库构建的仿真引擎在军用方面有其得天独厚的优势。

2 各功能组件

2.1 主框架

仿真引擎主框架采用状态 (State) 和单例 (Singleton) 设计模式, 以便仿真程序能在初始化菜单、仿真画面、配置窗口几种状态下自由切换。由每个State独立负责程序的初始化、更新以及关闭所有的子系统。子系统包括:图形图像、物理、输入输出、声音等, VRStateManager则负责管理所有VRState。图2是仿真引擎框架的UML状态类图。

2.2 渲染系统OGRE

OGRE (Object-Oriented Graphics Rendering Engine) 是用C++开发的面向对象且使用灵活的3D引擎, 它的目的是让开发者能更方便和直接地开发基于3D硬件设备的应用程序或游戏。引擎中的类库对更底层系统库 (如:Direct3D和OpenGL) 的全部细节进行了抽象, 并提供了基于现实对象的接口和其它类[2]。

3 仿真引擎几个关键类

3.1 VRStateManager类 (仿真状态管理类)

仿真程序需要在多种状态中进行切换。如不想让一个状态知道另一个状态的存在, 就要有一个类统一管理这些状态, 在这些状态之间解耦。状态管理类VRStateManager实现了状态监听接口。它用一个栈来存储所有状态, 从当前状态切换到另一个状态时, 就把栈顶的状态取出, 并调用Exit () 函数Pop () , 然后再初始化新的状态, 并调用新状态的Enter () 函数。

3.2 InputManager类 (输入系统管理类)

InputManager类用来捕获和处理键盘及鼠标消息, 由于仿真程序通常只有一套输入系统, 因而采用单例模式实现。

3.3 VRState类 (仿真状态基类)

VRState类是一个虚基类, 定义了进入状态、退出状态、暂停状态、更新状态, 以及处理键盘鼠标消息的各个接口, 是各个仿真状态的公共基类。

3.4 PlayState类 (运行状态类)

PlayState是仿真程序运行时的状态类, 是仿真程序开发者实现仿真功能的主体类。它继承VRState类, 实现了enter、exit、pause、update的具体功能。

4 案例

使用原苏联“飞毛腿B”导弹模型, 采用本文构建的仿真引擎实现该型导弹行驶、起竖、发射的动态三维仿真。仿真程序在Win7系统下采用VS2008C++语言开发, 使用该仿真引擎可以方便地加载场景, 添加天空、地形、雨雪等要素。开发人员不需要花费大量精力于底层, 只需关注仿真过程本身, 代码量大大减少。

5 结语

现有作战仿真模型大多是数学模型, 这类模型在描述战场复杂态势变化时存在局限性。建立三维作战仿真系统能显著增强仿真的时效性和真实感。使用军用仿真引擎开发三维仿真系统能大大提高开发效率。本文归纳和研究了一个功能比较完整的军用三维仿真引擎所需要的主要技术, 对各个开源库进行了模块化整合和封装, 提供了一个基于状态模式的轻量级统一开发框架。三维仿真引擎是一套大型软件系统, 基于开源库要将各个功能模块整合并协调运行仍需做大量工作, 后续还需要对引擎性能进行优化, 采用更合理的设计模式进行架构设计, 并提供可视化场景编辑器。

参考文献

[1]杨南征.虚拟演兵——兵棋、作战模拟与仿真[M].北京:解放军出版社, 2007.

[2]邸锐.OGRE 3D游戏开发框架指南[M].北京:电子工业出版社, 2010.

[3]陈爽.基于Ogre的角色扮演游戏引擎的开发与研究[D].广州:广东工业大学, 2010.

[4]MAT BUCKLAND.游戏人工智能编程案例精粹[M].北京:人民邮电出版社, 2013.

[5]胡宇慧.3D游戏引擎中若干关键技术及算法的研究与分析[D].上海:上海师范大学, 2006.

[6]迟妍, 谭跃进.基于多智能体的作战模拟仿真模型框架研究[J].2004, 4 (21) :13-15.

[7]樊翠, 王丽芳.基于3D的三维游戏引擎的设计与实现[J].科学技术与工程, 2006 (6) :8-10.

[8]段化鹏, 杨卫平, 孙农亮.基于OGRE和ODE的碰撞检测在巷道漫游系统中的研究[J].电脑知识与技术, 2009, 5 (19) :5219-5221.

仿真引擎 篇2

关键词:高架库虚拟仿真,Vega,引擎技术,类

0 引 言

高架库是一种适合大规模储存货物的高效自动仓库, 由高层货架、货箱、巷道堆垛起重机 (即有轨堆垛机) 、出入库输送机系统、自动化控制系统、计算机仓库管理系统及辅助设备组成, 对集装单元货物实现了自动化保管和计算机管理。但是高架库造价昂贵, 所用的自动化设备费用很高, 为了减少因为训练学习所带来的损耗, 有必要开发一套高架库虚拟仿真系统, 即利用虚拟现实技术[1]和视景仿真技术[2]实现仓库的业务流程、设备工作过程、信息管理等的模拟仿真效果。

虚拟仿真系统其实是一种特殊的程序类型, 仍然只是一个以某种程序语言编写的程序, 所以可以像其他任何Windows程序那样开发该类系统。该系统采用的是Windows环境下的C++编程语言[3], 因此需要一个能够使用Win32 API创建Windows应用程序的编译器, 即Visual C++ [4,5,6]。仿真软件采用Vega[7], 它使用一套特有的C++函数库驱动虚拟场景或者三维模型进行模拟仿真[8,9]。

在高架库的虚拟仿真系统中, 必须执行各种不同的任务, 如设定所取货物位置、取货柜、送货柜、记录所做操作等, 这是系统的特有任务。在开发过程中, 系统特有任务的代码与常规的Windows应用程序的繁杂代码混在一起, 使程序代码的编写和维护变得很困难, 因此有必要将系统特有任务与Windows应用程序的开发工作分离开来;而分离的最好措施就是创建一个引擎, 它允许隐藏针对Windows应用程序而与系统任务无关的代码, 即创建了引擎后只需要专注于系统各任务的实现, 这才是整个系统最重要的工作。

1 引擎的设计

引擎的设计思想是一次性开发某些核心系统任务程序, 然后将这些任务程序调入引擎中, 只有在必要时才再次处理它们。具体来说, 设计一个系统引擎, 首先, 要分析该系统可分解为哪些事件;然后, 再为各事件创建相应的事件处理函数;其次, 创建一个引擎类并把这些事件处理函数设置为引擎类的成员函数, 也就是系统的任务接口;最后是设计引擎的执行程序, 使系统运行时按需调用引擎类的成员函数。

引擎程序设计完毕后, 剩下的工作就是编写引擎类的事件处理函数, 这样就把与系统特有任务无关的Windows程序代码分离出来, 从而将程序开发工作的重心集中在系统特有任务的开发上。

1.1 事件分析

该系统中的事件包括Windows事件和系统特有事件。Windows事件主要是程序初始化事件, 系统特有事件要根据系统的特有任务来确定。

特有任务实际上就是虚拟场景中三维模型的仿真运动。该系统中的模型包括运动模型和静止模型两种。运动模型主要包括观察者 (用于在虚拟场景中漫游) 、堆垛机 (用于取送货) 、输送机 (用于传送货箱) 。静止模型主要包括地面、仓库、货架、控制台等。该系统需要完成的特有任务有:控制观察者漫游;观察者和其他模型需要进行碰撞检测;控制台的控制屏幕需要进行货位坐标设置, 并将其发送给堆垛机;取货箱与送货箱;录制系统运行过程并能够回放。所以, 漫游、设置货位坐标、碰撞、取货箱、送货箱、录制、回放等都是系统的特有事件。

1.2 事件处理函数设计

在程序运行过程中发生一个事件时, 就会调用相应的事件处理程序, 即事件处理函数。该系统主要事件的事件处理函数设计如下:

(1) 程序初始化事件函数为SystemInitialize ( ) , 用来创建一个引擎类对象, 并将其指定给一个全局变量, 这样就可以在外部通过访问器 (Accessor) 方法访问该引擎;

(2) Vega程序的初始化函数为VegaInitialize ( ) , 用来加载三维场景、初始化Vega窗口、配置Vega程序;

(3) 漫游事件函数为Wander ( ) , 用来控制观察者在虚拟场景中的坐标位置, 使其进行自动漫游或者手动漫游;

(4) 设置货位坐标事件函数为SetPositionData ( ) , 用来设置需要取或送的货箱的货位坐标;

(5) 碰撞事件函数为Collision ( ) , 用来对观察者与虚拟场景中的其他对象进行碰撞检测;

(6) 取货箱事件函数为GetBox ( ) , 用来根据要取的货箱的货位坐标去取货箱;

(7) 送货箱事件函数为SendBox ( ) , 用来根据要送的货箱的货位坐标去送货箱;

(8) 录制事件函数为Record ( ) , 用来把虚拟场景中的操作情况和设备的工作过程录制并保存下来;

(9) 回放事件函数为Replay ( ) , 用来重播录制好的虚拟场景的片断。

1.3 引擎类设计

高架库引擎类设计的关键就是按照面向对象 (OOP) 的设计原则, 把上述事件处理函数都放在引擎类中, 具体设计如下:

其中:

(1) SystemEngine ( ) 是构造函数, 用来初始化引擎成员变量;析构函数保持为空, 以备将来需要时使用。

(2) Initialize ( ) 方法用来处理通常在标准Windows函数WinMain ( ) 中执行的任务, 即创建主窗口类、注册窗口类、设置窗口大小和位置、创建窗口、显示和更新窗口。另外, Initialize ( ) 方法还有两个非常重要的任务, 即为Vega程序处理函数vgLoop ( ) 的执行创建一个独立的线程以及把Vega窗口嵌入到Windows窗口中。

(3) HandleEvent () 方法用来处理引擎内的标准Windows事件, 即将Windows消息传递给引擎成员函数, 如程序初始化、漫游、取货、送货、碰撞等事件函数, 由它们来响应对应的Windows消息。

与Initialize ( ) 方法把WinMain ( ) 函数中的程序代码隔离一样, HandleEvent ( ) 方法也把通常在标准Windows函数WndProc ( ) 中执行的代码隔离, 其目的是更好地隐藏常规Windows代码。

(4) 访问器方法用于访问成员变量。

(5) 事件函数, 即该系统的事件处理函数, 它包括Windows事件和系统特有事件的事件处理函数。

1.4 引擎程序设计

该系统引擎程序主要包括WinMain ( ) , vgLoop ( ) , WndProc ( ) 三个函数, 设计如下:

(1) 函数WinMain ( ) 是Windows程序的入口函数, 主要执行的任务包括:一是系统程序的初始化, 由引擎类的事件函数SystemInitialize ( ) 完成;二是Windows窗口和Vega线程的创建、Vega窗口嵌入Windows窗口, 由引擎类的常规方法Initialize ( ) 完成。

(2) 函数vgLoop ( ) 是在函数WinMain ( ) 中创建的Vega线程中执行, 主要执行的任务包括:一是Vega窗口的创建和Vega程序的初始化, 由引擎类的事件函数VegaInitialize ( ) 完成;二是系统特有事件的处理, 由引擎类的事件函数VegaInitialize ( ) 、Wander ( ) 等来完成。另外, 因为系统特有事件都是实时事件, 所以在vgLoop ( ) 函数中需要创建一个虚拟场景的渲染主循环, 在该循环内由Vega函数完成虚拟场景的实时渲染和更新。

(3) 函数WndProc ( ) 是与用户交互的一个接口, 它使用户能够在Vega窗口中通过调用引擎类的常规方法HandleEvent ( ) 来处理Windows消息。

2 结 语

引擎技术可以把系统的开发重心转换为任务接口函数的编写, 使系统的开发效率和可维护性都大大提高。同时, 它对其他虚拟仿真系统或者各种二维和三维游戏的开发具有很大的借鉴意义和实用价值[10]。

但是, 该系统的引擎不能直接应用到其他系统的开发, 主要原因是通用性不足, 建议把核心Windows事件从引擎类中分离出来即因为核心Windows事件虽然与引擎联系紧密, 但二者实际上是独立的——虽然这样做会破坏OOP原则, 但就结构而言, 把引擎单独放在自己的类中是更好的选择。

参考文献

[1]曾芬芳.虚拟现实技术[M].上海:上海交通大学出版社, 2005.

[2]王冬海.三维视景仿真技术在地铁列车运行控制系统仿真中的应用[D].北京:北京交通大学, 2004.

[3]揣锦华.C++程序设计语言[M].西安:西安电子科技大学出版社, 2006.

[4]怀红旗, 王爱民.基于MFC和Vega的导航仿真系统[J].现代电子技术, 2009, 32 (2) :167-170.

[5]侯俊杰.深入浅出MFC[M].武汉:华中科技大学出版社, 2006.

[6]黄维通.边学边用Visual C++编程[M].北京:清华大学出版社, 2006.

[7]王乘.Vega实时三维视景仿真技术[M].武汉:华中科技大学出版社, 2005.

[8]谭淑婷, 沈晓峰.基于Vega的机载SAR场景仿真[J].现代电子技术, 2009, 32 (10) :58-60.

[9]龚卓蓉.Vega程序设计[M].北京:国防工业出版社, 2006.

仿真引擎 篇3

1 Unity3D引擎虚拟场景搭建

Unity3D引擎版本选择动画编辑能力和渲染能力完善的4.3版本, 为真实展现战场环境, 模型导入采用由中低精度建模的3ds Max集装箱货船模型。模型以FBX格式导入, 对其添加刚体属性, 保证其正确的物理逻辑。在全局灯光和局部灯光处理上, 对船体添加方向光 (Directional lights) 和投射光 (Spot lights) , 尾楼舱室添加点光源 (Point lights) , 并利用Light Probe动态光探头, 使动态人物在烘焙好的场景里面受到光的照射效果。

2 Mecanim动作融合

战术仿真的人物动作处理主要应用Mecanim动画系统来完成, 将Unity3D引擎官方“大兵”动作模型进行动画分割, 建立基本的“走”“跑”“蹲下”和“跳跃”动作片段, 分割其他动画模型动画, 选取左手持盾、双手持枪动画作为融合动画。动作融合采用增添Right和Left动画层来实现, Base Layer层作为基础层影响全身动作, Right和Left层分别为右手和左手动画层, 建立Right和Left两个Avatar Body Mask来分别指定分别左手、右手受动画影响的骨骼, 双手操作武器和开门动画比较复杂, 牵连身体躯干和头部, 将双手和躯干、头部骨骼一并指定;持盾动作, 只指定左手和左手臂骨骼。持枪动画选择覆盖Base层, 持盾动画做叠加Base层处理, Right和Left层权重设为0.5 (如图2) 。为实现连贯人物战术动作, 建立角色控制器, 添加多段动画混合树Blend Tree, 对于持枪动画idle2设置Blend=0.27来控制动画混合的影响权重, 各层动画连接, 主要用时间控制和布尔控制, 跑步和站立动画的切换的转换条件用Speed来控制, 用Fire来控制武器攻击动画, 用Shield来控制是否使用盾牌, 其中开门动画用盒状碰撞检测机制实现。

3 Navmesh群组控制

海警查缉战术仿真的群组路线主要应用Unity3D4.x版本新增的Navmesh寻路系统来实现。战术小组分为警戒组、支援组和突击组, 每组队员4人, 战术演示为搜捕推进队形, “T”型、“L”型路口协同战术, 入室搜捕等战术。为解决多组寻路路线冲突问题, 通过划分单一人物单层路线来解决, 设置Nav Mesh Layer为Red、Blue、Green、Yellow四层, 为角色添加Nav Mesh Agent组件, 将其Nav Mesh Walkable设置在不同层。在解决小组整体推进问题上, 在行进路线关键位置设置多个Box Collider碰撞检测器, 对人物行进速度、战术动作进行改变。为实现交替掩护动作, 在队员交替掩护路线上通过为不同人物设置多个拾取位移点empty Gameobject来实现人物“蛙跳式”交替掩护位移, 在尾楼侧楼梯路线上, 每层设一个拾取位移点, 通过生成Off Mesh Link指定Start和End位置。

交互控制上应用GUI按钮调用人物每一段动画过程, 通过标签获取游戏对象, 使用Find Game Object With Tag () 方法把将相应的标签名称作为参数传入。

4 NGUI系统

Unity3D的NGUI系统拥有强大的页面编辑能力, Unity GUI控制是利用一类被称为On GUI () 的函数, 只要在控制脚本激活的状态下, On GUI () 函数可以在每帧调用。使用NGUI Text和Buttom控件创建基本菜单, NGUI Texture动态加载贴图, 对于教学模块添加Scrollview控件, 实现文本纵向阅读, 在战术演示界面, 使用NGUI Content () 方法设置提示信息, 并使用NGUI Skin设置界面风格。

5 系统优化与测试

我们将Unity3D引擎工程发布到Windows环境下, 测试仿真平台运行效果, 整体画面相对流畅, 但场景载入运行较慢, 我们对系统做进一步优化。场景优化, 我们替换了舱室部分中精度模型, 改用低精度模型, 通过法线贴图来满足场景需要, 并对模型船体构架去除网格中的额外多边形。代码优化, 更改代码中检查游戏对象标签的方法, 如用“if (go.Compare Tag (“Soldier”) ”来代替“if (go.tag==“Soldier”) ”等;用简单的“for”循环代替“Foreach”循环, 使用“Get Component”获取元件引用需求。其他, 减少角色控制器移动命令的调用, 缓存每帧的移动请求, 并且仅运用一次;通过移除代码中的字符串连接减少GC垃圾生成;碰撞器选择Box Collider碰撞检测器, 并将调用人物动作程序赋给碰撞检测器。

6 结语

笔者介绍的方案是基于Unity3D引擎的海警查缉战术仿真, Unity3D引擎的Mecanim角色动画系统有很强大角色动作融合能力, Unity3Dstore提供了大量人物动作包, 通过动作融合能够创作自己需要的人物动作, 这样省去了大量用代码或者3ds Max设计人物动作的精力, 同时也满足了大部分使用者同时使用。Navmesh寻路系统, 可以满足单人和多组寻路需要, 通过多层选择解决了人物路线冲突。经过多次调整与测试, 整个平台运行效果良好, 角色动作仿真度高, 整个平台交互性良好, 能够达到教学与演示效用。在保证效果的前提下, 简单解决了虚拟场景优化和代码优化的问题。

摘要:随着虚拟现实技术的迅速发展, 其在军事虚拟仿真领域的应用也越为广泛, 尤其是在武器仿真, 构建军事训练虚拟仿真平台等方面前景广阔, 可研究性强。通过对海警查缉战术的研究, 在Unity3D引擎中对场景模型进行渲染, 通过其Mecanim动画系统和Navmesh寻路系统进行动画融合, 设定自主寻路, 采用了盒状碰撞检测机制, 最终实现NGUI战术页面教学, 海警查缉战术动作及群组战术仿真。

关键词:Unity3D引擎,虚拟仿真,Mecanim,Navmesh

参考文献

[1]路朝龙.Unity权威指南-Unity 3D与Unity 2D全实例讲解[M].北京:中国青年出版社, 2014.

[2]宣雨松.Unity 3D游戏开发[M].北京:人民邮电出版社, 2012.

【仿真引擎】推荐阅读:

引擎驱动06-20

引擎结构08-07

通信引擎08-17

科学引擎09-24

智能引擎10-05

教学引擎11-21

管理引擎12-15

引擎设计12-23

引擎优化12-25

3D游戏引擎05-27

上一篇:提升应用能力下一篇:意识分析