沈 軍,李 瑋,王仁杰
(陸軍軍事交通學院鎮江校區,江蘇 鎮江 212003)
目前,國內外柴油機的教學培訓主要為常規課堂培訓以及實裝培訓,受時空限制難以達到良好的培訓效果。利用虛擬仿真技術建立三維仿真環境,能夠讓學員全方位更直觀的了解柴油機構造和組成,還可以通過交互界面訓練柴油機的啟動、停止、維修等科目。在柴油機的操作培訓中,如果操作不當,就有可能造成學員受傷或者零部件損壞等嚴重后果,而利用虛擬培訓不僅能夠給學員提供真實的培訓場景,使學員快速掌握柴油機的操作規范和流程,還能夠避免設備損壞和人員受傷。
目前的虛擬仿真平臺也很多,例如Virtools,EON Studio,Quest3D,Unreal4等,都可以實現場景的編輯、交互控制、仿真等功能。本文采用Unity3d作為仿真平臺[1],該軟件是一款免費的開源軟件,跨平臺支持性好,支持多種語言腳本做功能設計和二次開發。此外,Unity3d還有豐富的擴展插件可供使用,能夠大幅提高Unity開發的效率。
Unity3d是一款專業游戲引擎,但只提供基礎的三維模型,如球體、立方體、膠囊、平面等,要想實現柴油機這種復雜模型的建模,顯然難以實現。本文采用使用最為廣泛的建模軟件3ds Max完成柴油機三維模型的建立。
本文所開發的柴油機虛擬仿真訓練系統,基于Unity3D進行開發。在3ds Max中繪制完成柴油機的三維模型后,將其導出成Unity3D支持的.fbx格式的文件,然后將.fbx文件導入到Unity3D中。在導入的過程中,由于Unity3D和3ds Max中的坐標系和單位有所區別,所以必須調整好各部件的位置關系和單位的轉換比例。然后在Unity3D中添加攝像機和燈光,調整燈光的亮度和位置,使場景中模型的顯示達到逼真的效果[2,3]。
完成模型的導入后,就可以對系統進行開發了。Unity3D支持的腳本語言包括JavaScript、C#、Boo等,本文采用C#腳本進行開發,在柴油機虛擬拆裝的功能設計中還用到了PlayMaker插件,PlayMaker是由第三方軟件開發商Hotong Games開發完成的插件,該插件具有很多動作行為,只需要通過簡單狀態機就能夠實現,根本不需要寫一句代碼,可以方便簡潔的利用圖表管理每個狀態機。在驅動柴油機儀表、指示燈等部件的動作時,還用到了DoTween插件,利用DoTween插件,能夠很方便的控制物體的運動[4,5]。
本文所開發的訓練仿真系統其系統結構如圖1所示,包括四個模塊:結構組成、拆裝訓練、操作訓練及數據管理。在結構組成模塊,學員可以在場景中對柴油機主要零部件的結構、尺寸以及各部件之間的位置關系進行更直觀的了解和認識,并且可以通過鼠標來控制主要零部件的隱藏、透明度設置等,從而更有利于學員掌握柴油機的結構組成。在拆裝訓練模塊,可以根據實際的拆裝順序進行拆裝訓練,必須按照正確的拆裝順序來進行拆裝,否則會給出錯誤提示,通過這樣的培訓練習,能夠讓學員熟練掌握拆裝順序和方法。在操作訓練模塊,建立了柴油機運行的數學仿真模型,這樣在虛擬場景中操作虛擬面板上的按鈕、
開關時,數學仿真模型就會進行相應的計算[6,7],場景中的柴油機就會做出相應的動作反饋,模擬真實的柴油機運行,當操作錯誤時,還會出現相應的故障報警,通過這種方式,能夠實現柴油機的模擬操作訓練。該系統還利用SQL Server2008建立了數據庫,記錄學員的操作訓練信息,這樣可以針對學員容易出現的錯誤進行有針對性的訓練。

圖1 柴油機虛擬仿真訓練系統結構圖
在進行系統開發的過程中,各個模塊的的功能實現都是在Unity3D中完成,在Unity3D中導入柴油機三維模型,完成模型的燈光、材質等這些設置后,就可以進行各個模塊的具體開發。
結構組成模塊主要功能是利用已經完成的柴油機三維模型,多角度的展示組成零部件的結構組成,讓學員能夠更直觀的了解柴油機的結構組成和狀態。在建模的過程中就應該將柴油機相關零部件的三維模型根據柴油機的實際情況進行科學分組,規范命名,這樣有利于在編程時能夠對模型進行方便的調用。
該模塊的開發過程中,將柴油機的零部件分成六個部分,分別是固定機件、運動機件、配氣機構、燃油系統、滑油系統、冷卻系統。要對系統進行分類,就必然要用到菜單實現對各個模塊的導航,在該模塊開發過程中,利用了Unity3D自帶的UI組件,能夠輕松實現菜單功能。Unity3D中所有的UI組件都必須放在Canvas層級下,Canvas是所有UI組件的容器,以做一個系統不同模塊的導航菜單為例[8]。
首先在層級視圖中創建一個Canvas,然后右鍵單擊創建一個Panel組件,每個Panel組件里,都連接著一個Image組件,這個組件的初始設置是白色和透明的,可以為Image組件添加一個背景圖片。然后在Canvas組件中添加六個Text組件,分別對應柴油機的六大系統,設置Text的參數,包括顏色、字體、大小等,在每個Text組件中點擊最下面的Add Component,添加一個Button組件。最后,在層級視圖中,創建一個C#腳本,該腳本中包含有六個具有場景切換功能的函數,在Button組件的OnClick()項中,選擇與之對應的功能函數,這樣就可以實現對不同模塊的導航菜單的制作。
要實現可以從不同角度來觀看柴油機的零部件,可以為Camera添加一個攝像機控制腳本,在該腳本中,當鼠標右鍵點擊時實現相機的旋轉,該功能實現的具體代碼如下:
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);
}
另外,還可以實現利用鼠標中鍵實現場景的縮放,具體代碼如下:
if(Input.GetAxis("Mouse ScrollWheel")!=0)
{
m_distance=Input.GetAxis("Mouse Scroll-Wheel")*2f;
target.DOLocalMove(target.position+target.forward*m_distance,0.2f);
}
通過如上設置,就可以實現從多角度、全方位的觀察柴油機零部件,讓學員更直觀、更深入的了解柴油機的構造和組成。
拆裝訓練的實現主要利用的是PlayMaker插件[9],通過PlayMaker狀態機的設置,不需要寫一句代碼,就可以方便的實現拆裝順序的設置。
如圖2所示,首先待拆裝的物體判斷之前需要拆裝的上一物體是否拆卸完畢,這里在狀態Is-LastFinished下添加了一個名為BoolTest的行為,來判斷上一物體是否拆已經卸完畢,如果上一物體已經拆卸完畢,則進入到Disassemble(可拆卸)狀態,在該狀態下,如果檢測到系統事件Mouse Down,就可以進入Action(執行)狀態,觸發拆卸動作,完成拆卸,當該物體拆卸完成后,會將對應的布爾值(必須是全局變量,標識物體是否拆卸完成)設置為True,表示該物體拆卸完成。倘若通過BoolTest檢測到上一物體并沒有拆卸完畢,則進入到Hints(提示)狀態,這時點擊物體則不會觸發拆卸行為,而是會彈出消息提示,并且將對應的布爾值(標識物體是否拆卸完成)設置為False,表示該物體沒有完成拆卸。對需要拆卸的物體按實際的拆裝順序做如下的設置,就可以實現物體的模擬拆卸訓練。

圖2 拆裝順序PlayMaker狀態機設置圖
操作訓練可以在虛擬場景中對柴油機三維模型進行虛擬操作,通過鼠標點擊、拖動等方式來觸發相應的操作。操作訓練最重要的是柴油機數學仿真模型的建立。在該系統中,如圖3所示,還利用C#語言建立了一個柴油機運行的數學模型。操作訓練模塊的實現方式見圖3所示。

圖3 操作訓練實現流程圖
例如,當準備工作完畢后,點擊儀表盤上的啟動按鈕時(視景如圖4所示),由于在啟動按鈕上利用PlayMaker添加了FSM,當檢測到Mouse Down事件后,則執行SetBoolValue,改變對應的函數值,如果是拖拽油門操作,則執行SetFloatValue,改變其對應的變量值。在Unity程序中,與柴油機數學仿真模型運行的后臺程序之間通過Sokcet通信,定時將數學模型運行所需要的輸入變量打包傳送到后臺程序中進行數學仿真計算,計算產生的數據結果(輸出變量)又通過Socket不斷傳送到Uinty程序中,Unity中檢測到值的變化時,就會執行相應的動作。例如,當轉速發生變化時,則可以利用DoTween插件中自帶的DOLocalRotate()函數控制轉速表中指針的運動。

圖4 柴油機操作視景圖
本文提供了一種基于Unity3D的柴油機虛擬仿真訓練系統,利用3DMax建立了柴油機的仿真模型,采用Unity3D支持的C#語言對交互界面進行設計,對三維場景交互操作進行了研究,并且利用C#語言建立了柴油機運行的數學仿真模型。該訓練系統不僅能夠實現對該型號柴油機的虛擬拆裝,讓受訓學員更加直觀地了解柴油機的結構和工作原理,還可以在虛擬場景中對柴油機進行虛擬操作訓練,讓學員掌握柴油機啟動、停止、維護等基本的柴油機操作。通過該系統,可以在降低訓練成本的同時提高訓練的效率。實踐表明,該系統在教學過程中尤其是模擬教學中起到了較好的作用。