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