沈 軍,李 瑋,王仁杰
(陸軍軍事交通學(xué)院鎮(zhèn)江校區(qū),江蘇 鎮(zhèn)江 212003)
目前,國內(nèi)外柴油機的教學(xué)培訓(xùn)主要為常規(guī)課堂培訓(xùn)以及實裝培訓(xùn),受時空限制難以達到良好的培訓(xùn)效果。利用虛擬仿真技術(shù)建立三維仿真環(huán)境,能夠讓學(xué)員全方位更直觀的了解柴油機構(gòu)造和組成,還可以通過交互界面訓(xùn)練柴油機的啟動、停止、維修等科目。在柴油機的操作培訓(xùn)中,如果操作不當,就有可能造成學(xué)員受傷或者零部件損壞等嚴重后果,而利用虛擬培訓(xùn)不僅能夠給學(xué)員提供真實的培訓(xùn)場景,使學(xué)員快速掌握柴油機的操作規(guī)范和流程,還能夠避免設(shè)備損壞和人員受傷。
目前的虛擬仿真平臺也很多,例如Virtools,EON Studio,Quest3D,Unreal4等,都可以實現(xiàn)場景的編輯、交互控制、仿真等功能。本文采用Unity3d作為仿真平臺[1],該軟件是一款免費的開源軟件,跨平臺支持性好,支持多種語言腳本做功能設(shè)計和二次開發(fā)。此外,Unity3d還有豐富的擴展插件可供使用,能夠大幅提高Unity開發(fā)的效率。
Unity3d是一款專業(yè)游戲引擎,但只提供基礎(chǔ)的三維模型,如球體、立方體、膠囊、平面等,要想實現(xiàn)柴油機這種復(fù)雜模型的建模,顯然難以實現(xiàn)。本文采用使用最為廣泛的建模軟件3ds Max完成柴油機三維模型的建立。
本文所開發(fā)的柴油機虛擬仿真訓(xùn)練系統(tǒng),基于Unity3D進行開發(fā)。在3ds Max中繪制完成柴油機的三維模型后,將其導(dǎo)出成Unity3D支持的.fbx格式的文件,然后將.fbx文件導(dǎo)入到Unity3D中。在導(dǎo)入的過程中,由于Unity3D和3ds Max中的坐標系和單位有所區(qū)別,所以必須調(diào)整好各部件的位置關(guān)系和單位的轉(zhuǎn)換比例。然后在Unity3D中添加攝像機和燈光,調(diào)整燈光的亮度和位置,使場景中模型的顯示達到逼真的效果[2,3]。
完成模型的導(dǎo)入后,就可以對系統(tǒng)進行開發(fā)了。Unity3D支持的腳本語言包括JavaScript、C#、Boo等,本文采用C#腳本進行開發(fā),在柴油機虛擬拆裝的功能設(shè)計中還用到了PlayMaker插件,PlayMaker是由第三方軟件開發(fā)商Hotong Games開發(fā)完成的插件,該插件具有很多動作行為,只需要通過簡單狀態(tài)機就能夠?qū)崿F(xiàn),根本不需要寫一句代碼,可以方便簡潔的利用圖表管理每個狀態(tài)機。在驅(qū)動柴油機儀表、指示燈等部件的動作時,還用到了DoTween插件,利用DoTween插件,能夠很方便的控制物體的運動[4,5]。
本文所開發(fā)的訓(xùn)練仿真系統(tǒng)其系統(tǒng)結(jié)構(gòu)如圖1所示,包括四個模塊:結(jié)構(gòu)組成、拆裝訓(xùn)練、操作訓(xùn)練及數(shù)據(jù)管理。在結(jié)構(gòu)組成模塊,學(xué)員可以在場景中對柴油機主要零部件的結(jié)構(gòu)、尺寸以及各部件之間的位置關(guān)系進行更直觀的了解和認識,并且可以通過鼠標來控制主要零部件的隱藏、透明度設(shè)置等,從而更有利于學(xué)員掌握柴油機的結(jié)構(gòu)組成。在拆裝訓(xùn)練模塊,可以根據(jù)實際的拆裝順序進行拆裝訓(xùn)練,必須按照正確的拆裝順序來進行拆裝,否則會給出錯誤提示,通過這樣的培訓(xùn)練習(xí),能夠讓學(xué)員熟練掌握拆裝順序和方法。在操作訓(xùn)練模塊,建立了柴油機運行的數(shù)學(xué)仿真模型,這樣在虛擬場景中操作虛擬面板上的按鈕、
開關(guān)時,數(shù)學(xué)仿真模型就會進行相應(yīng)的計算[6,7],場景中的柴油機就會做出相應(yīng)的動作反饋,模擬真實的柴油機運行,當操作錯誤時,還會出現(xiàn)相應(yīng)的故障報警,通過這種方式,能夠?qū)崿F(xiàn)柴油機的模擬操作訓(xùn)練。該系統(tǒng)還利用SQL Server2008建立了數(shù)據(jù)庫,記錄學(xué)員的操作訓(xùn)練信息,這樣可以針對學(xué)員容易出現(xiàn)的錯誤進行有針對性的訓(xùn)練。
圖1 柴油機虛擬仿真訓(xùn)練系統(tǒng)結(jié)構(gòu)圖
在進行系統(tǒng)開發(fā)的過程中,各個模塊的的功能實現(xiàn)都是在Unity3D中完成,在Unity3D中導(dǎo)入柴油機三維模型,完成模型的燈光、材質(zhì)等這些設(shè)置后,就可以進行各個模塊的具體開發(fā)。
結(jié)構(gòu)組成模塊主要功能是利用已經(jīng)完成的柴油機三維模型,多角度的展示組成零部件的結(jié)構(gòu)組成,讓學(xué)員能夠更直觀的了解柴油機的結(jié)構(gòu)組成和狀態(tài)。在建模的過程中就應(yīng)該將柴油機相關(guān)零部件的三維模型根據(jù)柴油機的實際情況進行科學(xué)分組,規(guī)范命名,這樣有利于在編程時能夠?qū)δP瓦M行方便的調(diào)用。
該模塊的開發(fā)過程中,將柴油機的零部件分成六個部分,分別是固定機件、運動機件、配氣機構(gòu)、燃油系統(tǒng)、滑油系統(tǒng)、冷卻系統(tǒng)。要對系統(tǒng)進行分類,就必然要用到菜單實現(xiàn)對各個模塊的導(dǎo)航,在該模塊開發(fā)過程中,利用了Unity3D自帶的UI組件,能夠輕松實現(xiàn)菜單功能。Unity3D中所有的UI組件都必須放在Canvas層級下,Canvas是所有UI組件的容器,以做一個系統(tǒng)不同模塊的導(dǎo)航菜單為例[8]。
首先在層級視圖中創(chuàng)建一個Canvas,然后右鍵單擊創(chuàng)建一個Panel組件,每個Panel組件里,都連接著一個Image組件,這個組件的初始設(shè)置是白色和透明的,可以為Image組件添加一個背景圖片。然后在Canvas組件中添加六個Text組件,分別對應(yīng)柴油機的六大系統(tǒng),設(shè)置Text的參數(shù),包括顏色、字體、大小等,在每個Text組件中點擊最下面的Add Component,添加一個Button組件。最后,在層級視圖中,創(chuàng)建一個C#腳本,該腳本中包含有六個具有場景切換功能的函數(shù),在Button組件的OnClick()項中,選擇與之對應(yīng)的功能函數(shù),這樣就可以實現(xiàn)對不同模塊的導(dǎo)航菜單的制作。
要實現(xiàn)可以從不同角度來觀看柴油機的零部件,可以為Camera添加一個攝像機控制腳本,在該腳本中,當鼠標右鍵點擊時實現(xiàn)相機的旋轉(zhuǎn),該功能實現(xiàn)的具體代碼如下:
if(Input.GetMouseButton(1))
{
m_deltX+=Input.GetAxis("Mouse X")*m_mSpeed;
m_deltY-=Input.GetAxis("Mouse Y")*m_mSpeed;
m_deltX=ClampAngle(m_deltX,-360,360);
m_deltY=ClampAngle(m_deltY,-70,70);
target.DORotate(new Vector3(m_deltY,m_deltX,0f),0.2f);
}
另外,還可以實現(xiàn)利用鼠標中鍵實現(xiàn)場景的縮放,具體代碼如下:
if(Input.GetAxis("Mouse ScrollWheel")!=0)
{
m_distance=Input.GetAxis("Mouse Scroll-Wheel")*2f;
target.DOLocalMove(target.position+target.forward*m_distance,0.2f);
}
通過如上設(shè)置,就可以實現(xiàn)從多角度、全方位的觀察柴油機零部件,讓學(xué)員更直觀、更深入的了解柴油機的構(gòu)造和組成。
拆裝訓(xùn)練的實現(xiàn)主要利用的是PlayMaker插件[9],通過PlayMaker狀態(tài)機的設(shè)置,不需要寫一句代碼,就可以方便的實現(xiàn)拆裝順序的設(shè)置。
如圖2所示,首先待拆裝的物體判斷之前需要拆裝的上一物體是否拆卸完畢,這里在狀態(tài)Is-LastFinished下添加了一個名為BoolTest的行為,來判斷上一物體是否拆已經(jīng)卸完畢,如果上一物體已經(jīng)拆卸完畢,則進入到Disassemble(可拆卸)狀態(tài),在該狀態(tài)下,如果檢測到系統(tǒng)事件Mouse Down,就可以進入Action(執(zhí)行)狀態(tài),觸發(fā)拆卸動作,完成拆卸,當該物體拆卸完成后,會將對應(yīng)的布爾值(必須是全局變量,標識物體是否拆卸完成)設(shè)置為True,表示該物體拆卸完成。倘若通過BoolTest檢測到上一物體并沒有拆卸完畢,則進入到Hints(提示)狀態(tài),這時點擊物體則不會觸發(fā)拆卸行為,而是會彈出消息提示,并且將對應(yīng)的布爾值(標識物體是否拆卸完成)設(shè)置為False,表示該物體沒有完成拆卸。對需要拆卸的物體按實際的拆裝順序做如下的設(shè)置,就可以實現(xiàn)物體的模擬拆卸訓(xùn)練。
圖2 拆裝順序PlayMaker狀態(tài)機設(shè)置圖
操作訓(xùn)練可以在虛擬場景中對柴油機三維模型進行虛擬操作,通過鼠標點擊、拖動等方式來觸發(fā)相應(yīng)的操作。操作訓(xùn)練最重要的是柴油機數(shù)學(xué)仿真模型的建立。在該系統(tǒng)中,如圖3所示,還利用C#語言建立了一個柴油機運行的數(shù)學(xué)模型。操作訓(xùn)練模塊的實現(xiàn)方式見圖3所示。
圖3 操作訓(xùn)練實現(xiàn)流程圖
例如,當準備工作完畢后,點擊儀表盤上的啟動按鈕時(視景如圖4所示),由于在啟動按鈕上利用PlayMaker添加了FSM,當檢測到Mouse Down事件后,則執(zhí)行SetBoolValue,改變對應(yīng)的函數(shù)值,如果是拖拽油門操作,則執(zhí)行SetFloatValue,改變其對應(yīng)的變量值。在Unity程序中,與柴油機數(shù)學(xué)仿真模型運行的后臺程序之間通過Sokcet通信,定時將數(shù)學(xué)模型運行所需要的輸入變量打包傳送到后臺程序中進行數(shù)學(xué)仿真計算,計算產(chǎn)生的數(shù)據(jù)結(jié)果(輸出變量)又通過Socket不斷傳送到Uinty程序中,Unity中檢測到值的變化時,就會執(zhí)行相應(yīng)的動作。例如,當轉(zhuǎn)速發(fā)生變化時,則可以利用DoTween插件中自帶的DOLocalRotate()函數(shù)控制轉(zhuǎn)速表中指針的運動。
圖4 柴油機操作視景圖
本文提供了一種基于Unity3D的柴油機虛擬仿真訓(xùn)練系統(tǒng),利用3DMax建立了柴油機的仿真模型,采用Unity3D支持的C#語言對交互界面進行設(shè)計,對三維場景交互操作進行了研究,并且利用C#語言建立了柴油機運行的數(shù)學(xué)仿真模型。該訓(xùn)練系統(tǒng)不僅能夠?qū)崿F(xiàn)對該型號柴油機的虛擬拆裝,讓受訓(xùn)學(xué)員更加直觀地了解柴油機的結(jié)構(gòu)和工作原理,還可以在虛擬場景中對柴油機進行虛擬操作訓(xùn)練,讓學(xué)員掌握柴油機啟動、停止、維護等基本的柴油機操作。通過該系統(tǒng),可以在降低訓(xùn)練成本的同時提高訓(xùn)練的效率。實踐表明,該系統(tǒng)在教學(xué)過程中尤其是模擬教學(xué)中起到了較好的作用。