APP下载

基于Unity3D的海战场三维态势实时显示系统设计与实现

2018-04-12程健庆

指挥控制与仿真 2018年2期
关键词:脚本态势实例

江 波, 程健庆, 朱 伟

(江苏自动化研究所, 江苏 连云港 222061)

战场三维态势可视化是一个利用计算机图形、图像处理技术表现战场环境,并在此基础上将当前态势作战计划、作战双方兵力对比、作战双方交战状态、态势演变过程以可视化的方式显示出来的动态仿真技术[1]。指挥员能够在贴近实战的训练环境中,实时获取军事情况信息,以可视化的方法进行战场规划、指挥决策和指挥控制[2]。美国海军开发的海战场可视化系统“the Dragon”,以三维显示的方式来展现地理环境、各作战单元、战况和战果等信息,向指挥员和作战人员提供一致的战役战术面,其战场态势显示技术已经达到了较高水平[1]。我军态势推演研究起步较晚,系统功能有限。如李林橙等采用OpenGL仿真艘舰艇不同编队排列行进的过程,具有一定的跨平台特性,但无法提供图形界面或用户输入函数,依赖项过多,开发难度大;年福纯、周锦标等利用STK开发了一个航天领域三维显示系统,虽然其技术成熟,效率高,但利用此类针对特殊领域的三维仿真引擎开发海战场三维态势显示系统,不能发挥其优良特性,且成本高昂;陈彬,鞠儒生等利用Vega Prime仿真平台开发了基于Web 的作战模拟态势显示系统,但是Vega Prime对大范围地形的支持度不高,易产生延时,实时性难以保证。

Unity3D是由Unity Technologies开发的一个多平台综合三维游戏开发引擎,该引擎具有便捷的可视化开发环境,支持脚本语言包括C#、JavaScript等[3]。与OpenGL相比,Unity3D兼容各种操作系统,具有良好的跨平台性;与STK相比,Unity3D功能多样,能够满足各种领域的三维仿真需求,且开发周期短、成本低;与Vega Prime相比,Unity3D作为一款优秀的游戏开发引擎,支持大范围地形的显示,仿真实时性较好,且用户参与度高。

因此,以Unity3D为仿真平台搭建海战场三维态势显示系统具有显著的优越性与可行性。本文针对系统搭建与仿真过程中遇到的问题提出具体可行的方案,对同类型的研究具有一定的参考价值。

1 系统设计

1.1 系统功能需求

1) 三维场景显示功能需求

为显示系统添加逼真的海战场三维环境,建立并分类管理不同的战场环境实体模型,使得显示系统的显示效果更加直观真实。具体包括视景绘制与三维实例建模。

2) 态势信息同步功能需求

实时同步由网络传输的战场态势信息,更新战场环境实体姿态数据并保存。具体包括数据库的设计与数据传送机制的优化。

3) 实体驱动功能需求

通过连接数据库,利用读取的数据库态势数据,驱动各战场环境实体运行,达到视景仿真的目的。具体包括数据库连接脚本设计与驱动脚本设计。

4) 交互功能需求

支持视角跟随与全景切换,支持实体信息查询,能进行态势编辑操作,支持手动添加、删除和修改实体信息。

5) 态势推演功能需求

支持利用自定义态势数据信息绘制海战场环境,驱动系统运行并显示,考察系统推演效果。

1.2 系统架构设计

海战场三维态势显示系统架构如图1所示,战场可视化系统分为网络及接口层、数据库层、三维引擎层、应用层,四层之间相互独立,以保证系统的开放性。网络及数据接口层接收战场环境实体姿态信息、运动状态信息,以及水文气象等信息等;数据库层通过构建态势数据库,实时同步网络层传送的态势数据,更新并存储场景绘制所需的各种资源信息以供调用;三维引擎层采用Unity3D三维游戏开发平台,借助相关三维建模软件,制作并添加海战场战场环境实体等三维模型,通过脚本的设计与编译,完成战场环境实体的驱动与战场场景绘制的工作;应用层采用功能模块式设计,完成海战场态势的三维显示,并即时响应用户操作。

图1 系统架构示意图

2 系统开发技术方案

2.1 三维实例建模

三维建模常用工具包Blender、Maya、ZBrush、3Ds Max、Cinema 4D等。相较于其他建模工具,3Ds Max在三维观感、贴图渲染、精细处理以及模型兼容性等方面优势突出。通过3Ds Max网格法建立三维模型如图2所示,为实体添加UV修改器,添加纹理。为了符合Unity3D 引擎的应用标准,在高级选项中将单位设置为米,利用FBX 插件导出生成.FBX 文件[5]。将.FBX模型存放至Unity3D的Assets工程资源文件夹下。根据需要在场景中添加实体对象,设置光照、雾、天空盒等参数,最后,运行场景进行浏览、调试[5]。

图2 3DMax网格法建模示意图

2.2 数据库设计

在对海战场三维作战态势绘制中,为了快速准确地显示战场环境实体包括舰船、潜艇、航母以及炮弹、鱼类、雷达等运行轨迹,将网络实时同步的实体位置信息通过数据库进行有效存储并分类管理。

Unity3D支持各主流数据库系统的连接。以MySQL为例,添加System.Data.dll、System.Drawing.dll、MySql.Data.dll文件至Unity3D工程文件夹Assets下[6],利用动态链接库,Unity3D通过脚本即可与数据库实现交互。

2.3 视景仿真

Unity3D通过添加脚本驱动实体运行,而MonoBehaviour是所有脚本的基类[4]。通过继承MonoBehaviour基类,编写各功能脚本以实现包括位移、旋转等动态行为以及数据库连接等功能。

另外,碰撞检测是虚拟现实仿真中一个重要环节,尤其在军事打击中,实体碰撞频率更高,更需要完善碰撞的逻辑。而Unity3D 自带四种碰撞检测包围盒,分别BoxCollider、SphereCollider、WheelCollider和MeshCollider。通过大量实验比较分析,球形碰撞SphereCollider对各个单一实体实例的作用与性能最优。在系统仿真过程中的碰撞检,利用SphereCollider包围盒,使得战场环境实体与实体之间,实体与环境之间及环境内部间的碰撞效果更良好。

2.4 硬件适配

Unity3D具有强大的跨平台能力,完成Demo可以发布为各种主流类型操作系统兼容的应用程序[1]。在主菜单“File”选项中下拉框选择“Build Settings”,根据所需选择Platform列表操作系统,打包生成对应运行程序如.exe、.apk、.ipa等,从而适配各类三维显示设备[4]。

3 关键技术分析

3.1 数据库连接优化

每一个战场环境实体的运行都需要通过连接数据库,读入当前坐标等运行状态数据,进而通过脚本驱动器运行。海战场战场环境实体复杂多样,每一个实体的运行数据各自独立,运行更新时间不统一并且数据量巨大。为了同步仿真界面的运行,若采取多实体频繁连接数据库的方法,势必造成大量的资源消耗,甚至造成数据丢失、脏读、误读,连接异常,严重危害显示效果的真实性。因此,可通过添加空实例脚本的方法解决多实体数据同步的问题。

在Unity3D工程界面预制页prefab中创建空实例名为Data-Con,属性设为非刚体,以防碰撞产生错误。在整个海战场场景显示中,该实例显示透明,即不解释为任何一个需要显示的实物。为Data-Con实例添加单个脚本,该脚本唯一功能是作为Unit3D连接外部MySQL数据库的唯一接口,用来读取数据库并存放数据。各实体实例的驱动脚本只需调用Data-Con脚本即可获得坐标等数据,不需要分别连接数据库,通过内部脚本间相互调用将极大地提高该过程的运行效率。

该脚本同样可添加到山、海水、天空盒、摄像头等实例上,单独设置空实例可更好地区别各自的功能,便于系统维护。

3.2 定时驱动

Unity3D具有实时更新的机制,也可以自定义刷新的频率,若以该刷新频率来驱动实体的运行,则每一次刷新,都需要执行一次数据读入并驱动运行的过程。而为了保证画面的流畅,仿真画面的刷新需要得到较高的频率保证。因此,刷新的频率极有可能远远超出数据同步的频率,这将导致大量无用的重复数据调用运算,影响仿真的效率。

Unity3D自带协程运行机制,如果MonoBehaviour处于激活状态,而且yield的条件满足,即执行后面的功能。以定时器InvokeRepeating()为例,Unity3D每一帧都对其进行处理,判断其是否满足条件以执行相应功能指令。因此,利用协程定时处理功能,设定合适的时限(频率),定时驱动实体运行,既提高了系统运行的效率,也缓解了数据库和Data-Con脚本高频读取的压力。系统实体定时驱动运行基本流程如图3。

1)如图3所示,Data-Con脚本在Start() 中设定延时InvokeRepeating()协程,设定每秒定时调用模块LaunchProjiectile,在LaunchProjiectile中定义MySql-Connect()数据库连接函数。

2)在各实体驱动脚本中,通过star()写入GameObject.Find("Data-Con")与Data-Con脚本完成连接,连接过程只在系统开启时一次完成。利用读取的数据实时驱动实体运行。

3)通过UI设计中断/停止键,切断数据库连接,释放资源,结束仿真。

图3 定时驱动基本流程图

3.3 姿态调整

对于大部分战场环境实体的运行而言,其轨迹更多为连续曲线,对任意时刻的姿态变换都有一个转变的过程,极少存在棱角分明的折线轨迹。驱动实体运行主要通过在每一帧刷新中不断修改物体的坐标位置达到位移效果。在MonoBehaviour派生类中利用插值法如Vector3.Lerp()可使实体运动轨迹趋于平滑。其实现依赖于位移函数:functionLerp (from, to, t): Vector3。其中,初始位置为from,实体位置为to,两个向量之间,按照数字t(0≤t≤1)从from到to依次插值。当t=0时,返回from。当t=1时,返回to。每一次更新坐标数据,利用插值法不断插入细化坐标,运动轨迹更趋于平稳。

海战场态势仿真的战场环境实体需要形象具体直观,因而通过建模软件得到的模型实体不应该全是几何规则模型。换言之,实体的运行在调整航向时,其姿态不能永远保持不变。为呈现真实的战场环境实体运行时的航向修正,可以通过矢量运算计算当前偏转角,驱动旋转。

战场环境实体的旋转同样通过继承基类,利用实体当前时刻乃至之前时刻位置坐标,拟合运动曲线。如图4所示,每次获取坐标数据后,计算当前航向矢量,计算偏转角并驱动旋转。每次旋转后,更新上一刻航向为当前航向,继续下一轮循环,依次类推,最终使得轨迹曲线更加平滑,航向始终与轨迹趋于一致。

图4 战场环境实体偏转流程示意图

4 系统实现与测试

为了测试系统的运行效果,利用C语言自定义海战场态势信息源,运行系统进行模拟。该测试涉及的软件工具版本分别为Visual Studio2010、Unity3D 5.3、MySQL 5.7。

利用Visual Studio开发平台,自定义实体运行轨迹,建立关于时间t的数学模型,通过C语言编写轨迹函数, 利用Sleep(time)函数产生延迟效果,每隔time数值的毫秒,在设定的轨迹函数中产生一个新的坐标,并实时存入数据库。以某航母模型为例,运行过程利用多重曝光技术合成显示结果动态效果如图5所示。

图5 某航母模型运行轨迹示意图

通过测试可发现:

1)基于Unity3D的海战场三维态势显示系统能够通过态势数据驱动实体的移动,并能自动拟合轨迹,调整方向;

2)通过Unity3D的console控制台可以发现,所有数据都被有效检测,实时性较好;

3)范围有限,视景区域不能同时兼顾天空海洋,尤其是对水下实体的展现性能不足。

4)偶尔存在卡顿,后期开发仍需继续完善对数据传输机制的优化,提高数据库以及数据库与Unity3D连接的工作效率。

5 结束语

基于Unity3D仿真引擎,本文初步搭建完成一个海战场三维态势实时显示系统,实现了系统显示的基本功能,并对系统实时性展开研究,获得较好的效果。本文在三维建模、Unity3D与数据库交互、脚本设计、实时性等方面的研究对同类型三维视景仿真研究具有一定的借鉴意义。

参考文献:

[1]彭诚.战场三维可视化技术研究[D].杭州:浙江大学,2006.

[2]明芳.海战场三维态势可视化技术研究[D]. 武汉:武汉数字工程研究所,2011.

[3]Goldstone W. Unity game development essential[M].Birminghan:Packt Publishing Ltd, 2009.

[4]Kenneth C.Finney 3D 游戏开发大[M].齐兰博,肖奕,译.北京: 清华大学出版社,2005.

[5]张玉军,孟晓军,王刚. 基于手势交互的三维电子沙盘系统设计与实现[J].指挥控制与仿真,2016,38(2):110-114.

[6]张利利,李仁义,李晓京,马进,惠铎铎.Unity3D 与数据库通信方法的研究[J]. 计算机技术与发展,2014,24(2):229-303.

猜你喜欢

脚本态势实例
酒驾
历史虚无主义的新近演化态势与特征
2019年12月与11月相比汽车产销延续了增长态势
汇市延续小幅震荡态势
国际金价能否延续上涨态势
自动推送与网站匹配的脚本
完形填空Ⅱ
完形填空Ⅰ
愚公移山