江 波, 程健慶, 朱 偉
(江蘇自動化研究所, 江蘇 連云港 222061)
戰(zhàn)場三維態(tài)勢可視化是一個利用計算機(jī)圖形、圖像處理技術(shù)表現(xiàn)戰(zhàn)場環(huán)境,并在此基礎(chǔ)上將當(dāng)前態(tài)勢作戰(zhàn)計劃、作戰(zhàn)雙方兵力對比、作戰(zhàn)雙方交戰(zhàn)狀態(tài)、態(tài)勢演變過程以可視化的方式顯示出來的動態(tài)仿真技術(shù)[1]。指揮員能夠在貼近實(shí)戰(zhàn)的訓(xùn)練環(huán)境中,實(shí)時獲取軍事情況信息,以可視化的方法進(jìn)行戰(zhàn)場規(guī)劃、指揮決策和指揮控制[2]。美國海軍開發(fā)的海戰(zhàn)場可視化系統(tǒng)“the Dragon”,以三維顯示的方式來展現(xiàn)地理環(huán)境、各作戰(zhàn)單元、戰(zhàn)況和戰(zhàn)果等信息,向指揮員和作戰(zhàn)人員提供一致的戰(zhàn)役戰(zhàn)術(shù)面,其戰(zhàn)場態(tài)勢顯示技術(shù)已經(jīng)達(dá)到了較高水平[1]。我軍態(tài)勢推演研究起步較晚,系統(tǒng)功能有限。如李林橙等采用OpenGL仿真艘艦艇不同編隊(duì)排列行進(jìn)的過程,具有一定的跨平臺特性,但無法提供圖形界面或用戶輸入函數(shù),依賴項(xiàng)過多,開發(fā)難度大;年福純、周錦標(biāo)等利用STK開發(fā)了一個航天領(lǐng)域三維顯示系統(tǒng),雖然其技術(shù)成熟,效率高,但利用此類針對特殊領(lǐng)域的三維仿真引擎開發(fā)海戰(zhàn)場三維態(tài)勢顯示系統(tǒng),不能發(fā)揮其優(yōu)良特性,且成本高昂;陳彬,鞠儒生等利用Vega Prime仿真平臺開發(fā)了基于Web 的作戰(zhàn)模擬態(tài)勢顯示系統(tǒng),但是Vega Prime對大范圍地形的支持度不高,易產(chǎn)生延時,實(shí)時性難以保證。
Unity3D是由Unity Technologies開發(fā)的一個多平臺綜合三維游戲開發(fā)引擎,該引擎具有便捷的可視化開發(fā)環(huán)境,支持腳本語言包括C#、JavaScript等[3]。與OpenGL相比,Unity3D兼容各種操作系統(tǒng),具有良好的跨平臺性;與STK相比,Unity3D功能多樣,能夠滿足各種領(lǐng)域的三維仿真需求,且開發(fā)周期短、成本低;與Vega Prime相比,Unity3D作為一款優(yōu)秀的游戲開發(fā)引擎,支持大范圍地形的顯示,仿真實(shí)時性較好,且用戶參與度高。
因此,以Unity3D為仿真平臺搭建海戰(zhàn)場三維態(tài)勢顯示系統(tǒng)具有顯著的優(yōu)越性與可行性。本文針對系統(tǒng)搭建與仿真過程中遇到的問題提出具體可行的方案,對同類型的研究具有一定的參考價值。
1) 三維場景顯示功能需求
為顯示系統(tǒng)添加逼真的海戰(zhàn)場三維環(huán)境,建立并分類管理不同的戰(zhàn)場環(huán)境實(shí)體模型,使得顯示系統(tǒng)的顯示效果更加直觀真實(shí)。具體包括視景繪制與三維實(shí)例建模。
2) 態(tài)勢信息同步功能需求
實(shí)時同步由網(wǎng)絡(luò)傳輸?shù)膽?zhàn)場態(tài)勢信息,更新戰(zhàn)場環(huán)境實(shí)體姿態(tài)數(shù)據(jù)并保存。具體包括數(shù)據(jù)庫的設(shè)計與數(shù)據(jù)傳送機(jī)制的優(yōu)化。
3) 實(shí)體驅(qū)動功能需求
通過連接數(shù)據(jù)庫,利用讀取的數(shù)據(jù)庫態(tài)勢數(shù)據(jù),驅(qū)動各戰(zhàn)場環(huán)境實(shí)體運(yùn)行,達(dá)到視景仿真的目的。具體包括數(shù)據(jù)庫連接腳本設(shè)計與驅(qū)動腳本設(shè)計。
4) 交互功能需求
支持視角跟隨與全景切換,支持實(shí)體信息查詢,能進(jìn)行態(tài)勢編輯操作,支持手動添加、刪除和修改實(shí)體信息。
5) 態(tài)勢推演功能需求
支持利用自定義態(tài)勢數(shù)據(jù)信息繪制海戰(zhàn)場環(huán)境,驅(qū)動系統(tǒng)運(yùn)行并顯示,考察系統(tǒng)推演效果。
海戰(zhàn)場三維態(tài)勢顯示系統(tǒng)架構(gòu)如圖1所示,戰(zhàn)場可視化系統(tǒng)分為網(wǎng)絡(luò)及接口層、數(shù)據(jù)庫層、三維引擎層、應(yīng)用層,四層之間相互獨(dú)立,以保證系統(tǒng)的開放性。網(wǎng)絡(luò)及數(shù)據(jù)接口層接收戰(zhàn)場環(huán)境實(shí)體姿態(tài)信息、運(yùn)動狀態(tài)信息,以及水文氣象等信息等;數(shù)據(jù)庫層通過構(gòu)建態(tài)勢數(shù)據(jù)庫,實(shí)時同步網(wǎng)絡(luò)層傳送的態(tài)勢數(shù)據(jù),更新并存儲場景繪制所需的各種資源信息以供調(diào)用;三維引擎層采用Unity3D三維游戲開發(fā)平臺,借助相關(guān)三維建模軟件,制作并添加海戰(zhàn)場戰(zhàn)場環(huán)境實(shí)體等三維模型,通過腳本的設(shè)計與編譯,完成戰(zhàn)場環(huán)境實(shí)體的驅(qū)動與戰(zhàn)場場景繪制的工作;應(yīng)用層采用功能模塊式設(shè)計,完成海戰(zhàn)場態(tài)勢的三維顯示,并即時響應(yīng)用戶操作。
圖1 系統(tǒng)架構(gòu)示意圖
三維建模常用工具包Blender、Maya、ZBrush、3Ds Max、Cinema 4D等。相較于其他建模工具,3Ds Max在三維觀感、貼圖渲染、精細(xì)處理以及模型兼容性等方面優(yōu)勢突出。通過3Ds Max網(wǎng)格法建立三維模型如圖2所示,為實(shí)體添加UV修改器,添加紋理。為了符合Unity3D 引擎的應(yīng)用標(biāo)準(zhǔn),在高級選項(xiàng)中將單位設(shè)置為米,利用FBX 插件導(dǎo)出生成.FBX 文件[5]。將.FBX模型存放至Unity3D的Assets工程資源文件夾下。根據(jù)需要在場景中添加實(shí)體對象,設(shè)置光照、霧、天空盒等參數(shù),最后,運(yùn)行場景進(jìn)行瀏覽、調(diào)試[5]。
圖2 3DMax網(wǎng)格法建模示意圖
在對海戰(zhàn)場三維作戰(zhàn)態(tài)勢繪制中,為了快速準(zhǔn)確地顯示戰(zhàn)場環(huán)境實(shí)體包括艦船、潛艇、航母以及炮彈、魚類、雷達(dá)等運(yùn)行軌跡,將網(wǎng)絡(luò)實(shí)時同步的實(shí)體位置信息通過數(shù)據(jù)庫進(jìn)行有效存儲并分類管理。
Unity3D支持各主流數(shù)據(jù)庫系統(tǒng)的連接。以MySQL為例,添加System.Data.dll、System.Drawing.dll、MySql.Data.dll文件至Unity3D工程文件夾Assets下[6],利用動態(tài)鏈接庫,Unity3D通過腳本即可與數(shù)據(jù)庫實(shí)現(xiàn)交互。
Unity3D通過添加腳本驅(qū)動實(shí)體運(yùn)行,而MonoBehaviour是所有腳本的基類[4]。通過繼承MonoBehaviour基類,編寫各功能腳本以實(shí)現(xiàn)包括位移、旋轉(zhuǎn)等動態(tài)行為以及數(shù)據(jù)庫連接等功能。
另外,碰撞檢測是虛擬現(xiàn)實(shí)仿真中一個重要環(huán)節(jié),尤其在軍事打擊中,實(shí)體碰撞頻率更高,更需要完善碰撞的邏輯。而Unity3D 自帶四種碰撞檢測包圍盒,分別BoxCollider、SphereCollider、WheelCollider和MeshCollider。通過大量實(shí)驗(yàn)比較分析,球形碰撞SphereCollider對各個單一實(shí)體實(shí)例的作用與性能最優(yōu)。在系統(tǒng)仿真過程中的碰撞檢,利用SphereCollider包圍盒,使得戰(zhàn)場環(huán)境實(shí)體與實(shí)體之間,實(shí)體與環(huán)境之間及環(huán)境內(nèi)部間的碰撞效果更良好。
Unity3D具有強(qiáng)大的跨平臺能力,完成Demo可以發(fā)布為各種主流類型操作系統(tǒng)兼容的應(yīng)用程序[1]。在主菜單“File”選項(xiàng)中下拉框選擇“Build Settings”,根據(jù)所需選擇Platform列表操作系統(tǒng),打包生成對應(yīng)運(yùn)行程序如.exe、.apk、.ipa等,從而適配各類三維顯示設(shè)備[4]。
每一個戰(zhàn)場環(huán)境實(shí)體的運(yùn)行都需要通過連接數(shù)據(jù)庫,讀入當(dāng)前坐標(biāo)等運(yùn)行狀態(tài)數(shù)據(jù),進(jìn)而通過腳本驅(qū)動器運(yùn)行。海戰(zhàn)場戰(zhàn)場環(huán)境實(shí)體復(fù)雜多樣,每一個實(shí)體的運(yùn)行數(shù)據(jù)各自獨(dú)立,運(yùn)行更新時間不統(tǒng)一并且數(shù)據(jù)量巨大。為了同步仿真界面的運(yùn)行,若采取多實(shí)體頻繁連接數(shù)據(jù)庫的方法,勢必造成大量的資源消耗,甚至造成數(shù)據(jù)丟失、臟讀、誤讀,連接異常,嚴(yán)重危害顯示效果的真實(shí)性。因此,可通過添加空實(shí)例腳本的方法解決多實(shí)體數(shù)據(jù)同步的問題。
在Unity3D工程界面預(yù)制頁prefab中創(chuàng)建空實(shí)例名為Data-Con,屬性設(shè)為非剛體,以防碰撞產(chǎn)生錯誤。在整個海戰(zhàn)場場景顯示中,該實(shí)例顯示透明,即不解釋為任何一個需要顯示的實(shí)物。為Data-Con實(shí)例添加單個腳本,該腳本唯一功能是作為Unit3D連接外部MySQL數(shù)據(jù)庫的唯一接口,用來讀取數(shù)據(jù)庫并存放數(shù)據(jù)。各實(shí)體實(shí)例的驅(qū)動腳本只需調(diào)用Data-Con腳本即可獲得坐標(biāo)等數(shù)據(jù),不需要分別連接數(shù)據(jù)庫,通過內(nèi)部腳本間相互調(diào)用將極大地提高該過程的運(yùn)行效率。
該腳本同樣可添加到山、海水、天空盒、攝像頭等實(shí)例上,單獨(dú)設(shè)置空實(shí)例可更好地區(qū)別各自的功能,便于系統(tǒng)維護(hù)。
Unity3D具有實(shí)時更新的機(jī)制,也可以自定義刷新的頻率,若以該刷新頻率來驅(qū)動實(shí)體的運(yùn)行,則每一次刷新,都需要執(zhí)行一次數(shù)據(jù)讀入并驅(qū)動運(yùn)行的過程。而為了保證畫面的流暢,仿真畫面的刷新需要得到較高的頻率保證。因此,刷新的頻率極有可能遠(yuǎn)遠(yuǎn)超出數(shù)據(jù)同步的頻率,這將導(dǎo)致大量無用的重復(fù)數(shù)據(jù)調(diào)用運(yùn)算,影響仿真的效率。
Unity3D自帶協(xié)程運(yùn)行機(jī)制,如果MonoBehaviour處于激活狀態(tài),而且yield的條件滿足,即執(zhí)行后面的功能。以定時器InvokeRepeating()為例,Unity3D每一幀都對其進(jìn)行處理,判斷其是否滿足條件以執(zhí)行相應(yīng)功能指令。因此,利用協(xié)程定時處理功能,設(shè)定合適的時限(頻率),定時驅(qū)動實(shí)體運(yùn)行,既提高了系統(tǒng)運(yùn)行的效率,也緩解了數(shù)據(jù)庫和Data-Con腳本高頻讀取的壓力。系統(tǒng)實(shí)體定時驅(qū)動運(yùn)行基本流程如圖3。
1)如圖3所示,Data-Con腳本在Start() 中設(shè)定延時InvokeRepeating()協(xié)程,設(shè)定每秒定時調(diào)用模塊LaunchProjiectile,在LaunchProjiectile中定義MySql-Connect()數(shù)據(jù)庫連接函數(shù)。
2)在各實(shí)體驅(qū)動腳本中,通過star()寫入GameObject.Find("Data-Con")與Data-Con腳本完成連接,連接過程只在系統(tǒng)開啟時一次完成。利用讀取的數(shù)據(jù)實(shí)時驅(qū)動實(shí)體運(yùn)行。
3)通過UI設(shè)計中斷/停止鍵,切斷數(shù)據(jù)庫連接,釋放資源,結(jié)束仿真。
圖3 定時驅(qū)動基本流程圖
對于大部分戰(zhàn)場環(huán)境實(shí)體的運(yùn)行而言,其軌跡更多為連續(xù)曲線,對任意時刻的姿態(tài)變換都有一個轉(zhuǎn)變的過程,極少存在棱角分明的折線軌跡。驅(qū)動實(shí)體運(yùn)行主要通過在每一幀刷新中不斷修改物體的坐標(biāo)位置達(dá)到位移效果。在MonoBehaviour派生類中利用插值法如Vector3.Lerp()可使實(shí)體運(yùn)動軌跡趨于平滑。其實(shí)現(xiàn)依賴于位移函數(shù):functionLerp (from, to, t): Vector3。其中,初始位置為from,實(shí)體位置為to,兩個向量之間,按照數(shù)字t(0≤t≤1)從from到to依次插值。當(dāng)t=0時,返回from。當(dāng)t=1時,返回to。每一次更新坐標(biāo)數(shù)據(jù),利用插值法不斷插入細(xì)化坐標(biāo),運(yùn)動軌跡更趨于平穩(wěn)。
海戰(zhàn)場態(tài)勢仿真的戰(zhàn)場環(huán)境實(shí)體需要形象具體直觀,因而通過建模軟件得到的模型實(shí)體不應(yīng)該全是幾何規(guī)則模型。換言之,實(shí)體的運(yùn)行在調(diào)整航向時,其姿態(tài)不能永遠(yuǎn)保持不變。為呈現(xiàn)真實(shí)的戰(zhàn)場環(huán)境實(shí)體運(yùn)行時的航向修正,可以通過矢量運(yùn)算計算當(dāng)前偏轉(zhuǎn)角,驅(qū)動旋轉(zhuǎn)。
戰(zhàn)場環(huán)境實(shí)體的旋轉(zhuǎn)同樣通過繼承基類,利用實(shí)體當(dāng)前時刻乃至之前時刻位置坐標(biāo),擬合運(yùn)動曲線。如圖4所示,每次獲取坐標(biāo)數(shù)據(jù)后,計算當(dāng)前航向矢量,計算偏轉(zhuǎn)角并驅(qū)動旋轉(zhuǎn)。每次旋轉(zhuǎn)后,更新上一刻航向?yàn)楫?dāng)前航向,繼續(xù)下一輪循環(huán),依次類推,最終使得軌跡曲線更加平滑,航向始終與軌跡趨于一致。
圖4 戰(zhàn)場環(huán)境實(shí)體偏轉(zhuǎn)流程示意圖
為了測試系統(tǒng)的運(yùn)行效果,利用C語言自定義海戰(zhàn)場態(tài)勢信息源,運(yùn)行系統(tǒng)進(jìn)行模擬。該測試涉及的軟件工具版本分別為Visual Studio2010、Unity3D 5.3、MySQL 5.7。
利用Visual Studio開發(fā)平臺,自定義實(shí)體運(yùn)行軌跡,建立關(guān)于時間t的數(shù)學(xué)模型,通過C語言編寫軌跡函數(shù), 利用Sleep(time)函數(shù)產(chǎn)生延遲效果,每隔time數(shù)值的毫秒,在設(shè)定的軌跡函數(shù)中產(chǎn)生一個新的坐標(biāo),并實(shí)時存入數(shù)據(jù)庫。以某航母模型為例,運(yùn)行過程利用多重曝光技術(shù)合成顯示結(jié)果動態(tài)效果如圖5所示。
圖5 某航母模型運(yùn)行軌跡示意圖
通過測試可發(fā)現(xiàn):
1)基于Unity3D的海戰(zhàn)場三維態(tài)勢顯示系統(tǒng)能夠通過態(tài)勢數(shù)據(jù)驅(qū)動實(shí)體的移動,并能自動擬合軌跡,調(diào)整方向;
2)通過Unity3D的console控制臺可以發(fā)現(xiàn),所有數(shù)據(jù)都被有效檢測,實(shí)時性較好;
3)范圍有限,視景區(qū)域不能同時兼顧天空海洋,尤其是對水下實(shí)體的展現(xiàn)性能不足。
4)偶爾存在卡頓,后期開發(fā)仍需繼續(xù)完善對數(shù)據(jù)傳輸機(jī)制的優(yōu)化,提高數(shù)據(jù)庫以及數(shù)據(jù)庫與Unity3D連接的工作效率。
基于Unity3D仿真引擎,本文初步搭建完成一個海戰(zhàn)場三維態(tài)勢實(shí)時顯示系統(tǒng),實(shí)現(xiàn)了系統(tǒng)顯示的基本功能,并對系統(tǒng)實(shí)時性展開研究,獲得較好的效果。本文在三維建模、Unity3D與數(shù)據(jù)庫交互、腳本設(shè)計、實(shí)時性等方面的研究對同類型三維視景仿真研究具有一定的借鑒意義。
參考文獻(xiàn):
[1]彭誠.戰(zhàn)場三維可視化技術(shù)研究[D].杭州:浙江大學(xué),2006.
[2]明芳.海戰(zhàn)場三維態(tài)勢可視化技術(shù)研究[D]. 武漢:武漢數(shù)字工程研究所,2011.
[3]Goldstone W. Unity game development essential[M].Birminghan:Packt Publishing Ltd, 2009.
[4]Kenneth C.Finney 3D 游戲開發(fā)大[M].齊蘭博,肖奕,譯.北京: 清華大學(xué)出版社,2005.
[5]張玉軍,孟曉軍,王剛. 基于手勢交互的三維電子沙盤系統(tǒng)設(shè)計與實(shí)現(xiàn)[J].指揮控制與仿真,2016,38(2):110-114.
[6]張利利,李仁義,李曉京,馬進(jìn),惠鐸鐸.Unity3D 與數(shù)據(jù)庫通信方法的研究[J]. 計算機(jī)技術(shù)與發(fā)展,2014,24(2):229-303.