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