沈浩生, 張均東, 曾 鴻
(1. 大連海事大學(xué)輪機工程學(xué)院,遼寧 大連 116026)
船舶集控室虛擬仿真系統(tǒng)的設(shè)計與實現(xiàn)
沈浩生, 張均東, 曾 鴻
(1. 大連海事大學(xué)輪機工程學(xué)院,遼寧 大連 116026)
在分析現(xiàn)有虛擬現(xiàn)實技術(shù)與船舶集控室的基礎(chǔ)上,采用3D-MAX與XNA分別實現(xiàn)了三維模型的建立與虛擬場景的漫游和交互,應(yīng)用 C#語言編寫了集控室的二維模擬軟件,通過UDP協(xié)議實現(xiàn)了三維虛擬場景與二維模擬軟件之間的通訊。根據(jù)光照效果的數(shù)學(xué)模型,采用高級著色語言(HLSL)開發(fā)了一種基于GPU的著色器,降低了GPU與CPU之間的傳輸負(fù)荷,增強了虛擬場景真實感。
虛擬現(xiàn)實;虛擬集控室;XNA;高級著色語言
隨著虛擬現(xiàn)實技術(shù)的迅猛發(fā)展,該項技術(shù)被越來越多的應(yīng)用在船舶行業(yè)。文獻(xiàn)[1]采用Creator軟件與視景驅(qū)動引擎 Vega實現(xiàn)了對船用多級離心泵的虛擬拆裝。文獻(xiàn)[2]采用Multigen Creator、GL Studio和Vega Prime開發(fā)了一種船舶機艙虛擬仿真系統(tǒng)。文獻(xiàn)[3]基于Catia和Virtools開發(fā)了某艇機艙的虛擬漫游系統(tǒng)。上述文獻(xiàn)中存在著在模型渲染階段著色效果不佳的問題,影響了場景的真實感,使用戶在體驗時的沉浸感減弱。
本文采用三維建模軟件 3D-MAX與三維引擎XNA建立了某船集控室的虛擬仿真系統(tǒng),可實現(xiàn)漫游與交互功能;采用 C#語言建立了與三維場景相對應(yīng)的二維模擬軟件;基于 UDP通訊協(xié)議實現(xiàn)了三維場景與二維模擬軟件互操作的功能。針對上述文獻(xiàn)中場景真實感不強的問題,采用Microsoft推出的高級著色語言(High Level Shader Language, HLSL)開發(fā)了基于GPU的著色器,使場景的真實感增強。
目前虛擬現(xiàn)實系統(tǒng)主要被分成4大類:桌面虛擬現(xiàn)實系統(tǒng)(Desktop VR)、沉浸式虛擬現(xiàn)實系統(tǒng)(Immersive VR)、增強虛擬現(xiàn)實系統(tǒng)(Aggrandize VR)、分布式虛擬現(xiàn)實系統(tǒng)(Distributed VR)[4]。這些虛擬現(xiàn)實系統(tǒng)提供給用戶的沉浸感、交互性、構(gòu)想性不盡相同,且成本也有所差距??紤]到本文中所設(shè)計的集控室虛擬仿真系統(tǒng)所面向的用戶為廣大船舶院校的學(xué)員,為了使學(xué)員都能夠參與到學(xué)習(xí)中來且親自動手操作,本文中所設(shè)計的虛擬集控室采用桌面虛擬現(xiàn)實系統(tǒng)(Desktop VR),雖然桌面虛擬現(xiàn)實系統(tǒng)相對于其它幾種虛擬現(xiàn)實系統(tǒng)其沉浸感有所減弱,但它的成本相對較低且已經(jīng)滿足了虛擬現(xiàn)實技術(shù)的基本要求。
本文中所開發(fā)的集控室虛擬仿真系統(tǒng)由二維模擬軟件與三維虛擬場景兩部分構(gòu)成。首先,利用3D-MAX提供的文件輸出接口,三維模型經(jīng)過處理后可以導(dǎo)出XNA所識別的.X格式的文件,然后將該文件加載到XNA程序中進(jìn)行實時渲染。在XNA中通過視圖變換、投影變換與碰撞檢測以此來實現(xiàn)用戶的漫游功能,通過三維拾取來實現(xiàn)用戶與虛擬場景的交互功能。然后利用C#編程語言編寫與三維場景相對應(yīng)的二維模擬軟件,完成整個系統(tǒng)的邏輯功能。通過UDP協(xié)議實現(xiàn)這兩個應(yīng)用程序之間的通訊,能夠?qū)崿F(xiàn)它們之間的互操作功能。該系統(tǒng)的框架圖,如圖1所示。
圖1 虛擬集控室系統(tǒng)框圖
1.2.1 三維場景模型建立
本文中所設(shè)計的虛擬集控室以大連海事大學(xué)開發(fā)的DMS-2011C型輪機全任務(wù)模擬器為建模依據(jù),整個集控室的配電板共有 22屏,集控臺7臺,其中配電板11屏為低壓配電板,另外11屏為中壓配電板,其中集控臺包含主機遙控操作臺、機艙參數(shù)顯示臺、監(jiān)測報警控制臺、輔助設(shè)備操作臺、閥門遙控控制臺[5]。為了使建模更加有條理性,給出整個三維場景的層次結(jié)構(gòu),如圖2所示。
圖2 集控室場景結(jié)構(gòu)圖
三維模型文件的大小對于整個程序的加載速度與實時性具有重要的影響,如果將三維模型的每個部分都做的非常細(xì)致,雖然模型較為美觀,但是這樣會顯著增加模型的面片數(shù),使模型文件過大,影響了程序的實時性。但是,如果三維模型做的不細(xì)致,雖然會使程序運行較為流暢,但是會影響整個場景的真實感,使用戶的沉浸感減弱。因此,怎樣把握二者之間的關(guān)系會影響整個三維場景的實時渲染效率。下面給出本文在建模過程中的解決上述問題的具體方法:
1) 通過刪除模型之間的重疊面、模型底部看不見的面和物體之間相交的面可以減少模型的面片數(shù)。還可以利用 3D-MAX里面自帶的模型簡化命令“MultiRes”,通過調(diào)節(jié)保留百分比,可以自動縮減面片數(shù),但是不要縮減的過多,否則會影響模型效果[6]。
2) 在建模過程中盡量減少使用布爾運算,布爾運算會大大增加模型的面片數(shù),可以使用Alpha貼圖代替布爾運算,這需要制作一張紋理,也就是alpha貼圖,這個紋理是一張灰度圖,其中黑色表示完全透明,灰色表示介于透明和不透明之間,而白色表示完全不透明,通過這張貼圖可以實現(xiàn)場景中物體部分透明的效果,本文的三維場景中集控臺與配電板的散熱孔就是根據(jù)此方法制作的。
3) 需要重點表現(xiàn)的物體應(yīng)做的盡量細(xì)致,如車鐘、萬轉(zhuǎn)開關(guān)和同步表等,其它如配電板柜體和集控室地面等可以適當(dāng)?shù)臏p少它們的面片數(shù)。
4) 當(dāng)對三維場景中的物體進(jìn)行貼圖的時候,應(yīng)使貼圖的像素值與多邊形的像素值相適應(yīng),否則如果紋理像素值過大,會導(dǎo)致“像素抖動”,看上去使人暈眩,如果紋理像素值過小,會導(dǎo)致“鋸齒”。
為了方便對三維場景的編程,需要在3D-MAX中對其中的原件進(jìn)行統(tǒng)一命名,整個場景的物體大體上可以分成兩部分,一部分是不可交互的物體如地面、墻壁、配電板柜體等,另一部分是可交互的原器件,它又分為兩類,一類是指示燈、組合燈等,另一類是萬轉(zhuǎn)開關(guān)、按鈕、組合開關(guān)、旋鈕等。圖3為在3D-MAX中虛擬集控室的渲染效果圖。
圖3 3D-MAX中渲染效果圖
1.2.2 在XNA中漫游與交互的實現(xiàn)
將在3D-MAX中制作的模型導(dǎo)出成XNA所識別的.X格式的文件后將該文件導(dǎo)入到XNA程序中,然后在XNA中提供攝像機以使用戶能夠?qū)鼍斑M(jìn)行觀察與漫游,本文中提供了兩種攝像機,分別是第一人稱攝像機與第三人稱攝像機,通過添加三維拾取功能來使用戶與虛擬場景進(jìn)行交互,再通過添加碰撞檢測使整個虛擬場景的漫游效果更加真實。圖4為文本中所設(shè)計的三維場景的流程圖[7]。
圖4中Initialize方法用于初始化變量以及與Game1對象相關(guān)的其他對象。圖形設(shè)備對象將在這里實例化,并可以在Initialize方法中利用該對象初始化依賴于其設(shè)置的其他對象。碰撞檢測、三維拾取和攝像機的實時控制都是在 Update方法中執(zhí)行,三維模型的實時渲染在Draw方法中執(zhí)行。
1.2.3 二維模擬軟件與通訊協(xié)議的實現(xiàn)
圖4 3D程序流程圖
本文采用C#編程語言在.NET框架平臺下完成了對二維模擬軟件的開發(fā),整個虛擬集控室的數(shù)學(xué)模型與邏輯控制都是在這里實現(xiàn)的,它能夠能實現(xiàn)發(fā)電機組的手動啟/停和自動啟/停、手動調(diào)頻調(diào)載、自動調(diào)頻調(diào)載、自動分級卸載和主配電板上動態(tài)顯示電壓、頻率和電流數(shù)據(jù)等功能。圖5為本文中所設(shè)計的二維模擬軟件的組合起動屏界面。
圖5 二維模擬軟件界面
并車操作是船舶輪機人員必須熟練掌握得船舶操縱技術(shù)之一,所謂并車操作是:船舶主電站通常設(shè)有3臺發(fā)電機組,根據(jù)船舶不同運行工況所需電量,可以單機運行,也可以兩臺或3臺發(fā)電機并聯(lián)運行,待并發(fā)電機投入電網(wǎng)參加并聯(lián)運行的操作稱為并車操作。在船舶上普遍采用的為準(zhǔn)同步并車,即要求帶并機組和運行機組兩者的電壓、頻率和相位都調(diào)整到十分接近的時候,才允許合上待并發(fā)電機主開關(guān)。手動準(zhǔn)同步并車是并車操作的一種,它的操作流程圖,如圖6所示[11]。
圖6 并車操作流程圖
具體操作步驟如下:
1) 手動模式需首先將同步屏“電站管理模式”開關(guān)轉(zhuǎn)到“手動”位置,然后在發(fā)電機及旁控制箱(本地)或配電板上柴發(fā)控制屏(遙控)起動帶并發(fā)電機。
2) 將同步屏“同步選擇(SYN SELECT)開關(guān)轉(zhuǎn)到待并機位置,作頻差、相位檢測。此時在同步屏上觀察同步表、頻率指示表和電壓指示表,發(fā)電機并電條件要求在待并發(fā)電機與電網(wǎng)電壓一致,待并機頻率最大超前(同步表FAST方向)0.1HZ,待并機相位角最大允許提前 100°。如果不滿足以上要求,則需要同步屏上通過相應(yīng)發(fā)電機調(diào)速手柄調(diào)整待并機原動機轉(zhuǎn)速從而調(diào)整發(fā)電機頻率,直到滿足并車條件,即可進(jìn)行并車操作。本文所設(shè)計二維模擬軟件的并車屏如圖7所示。
圖7 并車屏界面
從圖7可以看出,兩臺發(fā)電機的電壓都穩(wěn)定在400V,頻率穩(wěn)定在50.18Hz,滿足并車操作的條件,可以執(zhí)行并車操作。
本文用于二維模擬軟件與三維虛擬場景之間的傳輸層協(xié)議采用的是用戶數(shù)據(jù)報協(xié)議(UDP協(xié)議),UDP協(xié)議提供的是一種無連接的數(shù)據(jù)傳輸服務(wù),無連接就是在使用 UDP協(xié)議傳輸數(shù)據(jù)時不需要建立和釋放連接,從而省去了TCP協(xié)議中的3步“握手”過程,從而減少了數(shù)據(jù)傳輸?shù)拈_銷和時延,提高了數(shù)據(jù)傳輸?shù)膶崟r性[8],這樣正好滿足了本文對二維模擬軟件與三維虛擬場景之間數(shù)據(jù)傳輸?shù)膶崟r性要求。本文利用 C#來實現(xiàn)基于UDP協(xié)議的通訊功能的具體步驟如下:
1) 實例化UdpClient類的一個對象,用這個對象來表示默認(rèn)遠(yuǎn)程主機。UdpClient類實際上是對套接字Socket類的一種封裝,這種封裝使用戶在編寫協(xié)議時候效率更高。在創(chuàng)建UdpClient實例的時候,選用帶有遠(yuǎn)程主機名與端口號作為參數(shù)的構(gòu)造方法。
2) 在發(fā)送數(shù)據(jù)報時,需要調(diào)用 UdpClient對象的Send()方法,由于在上一步已經(jīng)知道了遠(yuǎn)程主機的 IP地址與端口號,因此,選用帶有 3個參數(shù)的 Send()方法,該方法為 UdpClient.Send(byte[] dgram, int bytes, IpEndPoint endpoint),其中第1個參數(shù)為所要發(fā)送的數(shù)據(jù),第 2個參數(shù)為數(shù)據(jù)的長度,第 3個參數(shù)為一個IpEndPoint對象,其中包含遠(yuǎn)程主機的IP地址與端口號。
3) 在接受數(shù)據(jù)時,需要在本地應(yīng)用程序中創(chuàng)建一個新的線程進(jìn)行偵聽,當(dāng)有數(shù)據(jù)傳輸?shù)奖镜貢r就需要調(diào)用 UdpClient對象的 Receive()方法,該方法用于在本地的指定的端口上接受來自遠(yuǎn)程主機的數(shù)據(jù)[9]。
在DirectX 8之前,GPU采用固定的方式來實現(xiàn)3D圖形的渲染,即所謂的“固定功能流水線(Fixed Pipeline)”,應(yīng)用固定功能流水線時程序首先設(shè)定世界變換、視圖變換、投影變換矩陣以及光源和材質(zhì)。設(shè)備使用預(yù)先設(shè)定好的參數(shù),采用內(nèi)置的固定的算法對每一個頂點進(jìn)行處理,在整個處理過程中設(shè)置的參數(shù)不變,因此,它的像素處理能力很差,表現(xiàn)效果有限,在 DirectX 8發(fā)布后提出了可編程流水線(Programmable Pipeline),它使得用戶能夠通過編寫自定義的著色器來訪問復(fù)雜的圖形硬件功能,能夠?qū)崿F(xiàn)許多固定功能流水線所不能實現(xiàn)的功能,使3D圖像的渲染效果更加優(yōu)秀。用戶需要為著色器中的頂點著色器與像素著色器編寫代碼,以實現(xiàn)所需要得渲染效果。XNA中處理著色器的過程如圖 8所示[10],圖中的頂點著色器為視野中的每個頂點運行世界變換、視圖變換、投影變換等功能,像素著色器為每個可見物體中的每個可見像素運行一次。
圖8 著色器渲染流程圖
基于上述可編程流水線的優(yōu)點,本文采用微軟公司推出的高級著色語言(HLSL)開發(fā)了基于GPU的著色器,實現(xiàn)了 XNA自定義的效果BasicEffect類中無法實現(xiàn)的局部光照效果,該BasicEffect類實際上是用來模擬固定功能流水線的類。下面以本文中實現(xiàn)的鏡面高光發(fā)射光照來說明基于GPU的著色器的開發(fā)過程。
這個公式一共被分成4個部分,第1個部分表示環(huán)境光照,第2個部分表示漫反射光照,第3個部分表示鏡面高光反射。其中Ai表示環(huán)境光強度,Ac表示環(huán)境光顏色,Di表示漫反射顏色,Dc表示漫反射顏色,Si表示高光反射強度,Sc表示高光反射顏色,N表示頂點的法線向量,L表示光線的方向向量,R表示入射光線的反射向量,V表示觀察點位置。如圖9所示,圖9為該光照模型的向量表示圖。
其中R的計算方法如公式2所示:
公式1中的n表示物體表面的光澤度,n越大說明物體表面越光滑,反光越強。如圖 10所示,圖10說明n對光澤效果的影響。
圖9 光照模型向量表示圖
圖10 n對光澤效果影響對比圖
下面根據(jù)上述的數(shù)學(xué)模型,應(yīng)用HLSL語言來編寫著色器文件,關(guān)鍵代碼如下所示:
上述代碼中,VS為自定義的頂點著色器(VertexShader),PS為自定義的像素著色器(PixelShader)。在頂點著色器中matrixWorldViewProj為世界變換矩陣、視圖變換矩陣、投影變換矩陣的連乘積,通過將模型的頂點位置坐標(biāo) Pos與matrixWorldViewProj相乘可以將頂點位置轉(zhuǎn)換到正確的位置上。matrixWorld為世界變換矩陣,N為模型頂點的法線向量,通過將N與matrixWorld相乘可以將頂點的法向向量轉(zhuǎn)換到世界坐標(biāo)系中。入射光線L與視點位置vectorEye由主程序給出具體值。在像素著色器中,首先,對頂點的法線向量N、入射光線向量L和視線向量V進(jìn)行歸一化,使之成為單位向量,dot(x,y)函數(shù)用于計算法線向量與入射光線的點積,saturate(x)函數(shù)用于將函數(shù)內(nèi)的值限制在[0,1]區(qū)間之內(nèi),這是為了保證由dot(x,y)函數(shù)計算出來的值大于0,pow(x,y)會函數(shù)返回xy的值,按照公式(2)可以計算出反射向量 Reflect,最后,按照公式(1)計算會返回一個 float4類型具有COLOR語義的值,作為視圖中可見物體的每個頂點的像素值。同時,本文中所實現(xiàn)的著色器是按照逐像素光照模型定義的,即在像素著色器中計算頂點的顏色,它相對于逐頂點光照模型來說,它對模型的渲染效果要好,但是它的計算量相對比較大,因此,選擇逐頂點光照模型還是逐像素光照模型就要根據(jù)虛擬場景中的具體模型數(shù)量,渲染效果要求而定。圖 11為本文中根據(jù)上述光照模型進(jìn)行渲染的局部效果圖。
圖11 最終渲染效果圖
本文構(gòu)建了虛擬集控室,并在XNA中實現(xiàn)了虛擬集控室的交互與漫游,利用 C#編程語言編寫了二維模擬軟件,通過編寫 UDP協(xié)議實現(xiàn)了二者之間的即時通訊,本文中所設(shè)計的虛擬集控室能夠模擬并車、自動調(diào)頻調(diào)載等功能,適用于船舶有關(guān)院校對船員的培訓(xùn)工作。以鏡面高光反射為例子展示了一種基于 GPU的著色器開發(fā)方法,通過自定義著色器增強了整個場景的真實性,給用戶更好的視覺體驗。
[1]陳 波, 程向新, 劉新建, 等. 虛擬現(xiàn)實技術(shù)在輪機拆裝培訓(xùn)中的應(yīng)用[R]. 2010 Third International Conference on Education Technology and Training(ETT 2010). 2011:11-27.
[2]童大鵬, 秦福星, 田 野, 等. 船舶機艙虛擬仿真系統(tǒng)的設(shè)計與實現(xiàn)[J]. 船電技術(shù), 2011, (1):41-44.
[3]曾魯山, 曾凡明, 劉金林. 基于CATIA和VIRTOOLS技術(shù)的虛擬機艙漫游研究[J]. 中國艦船研究, 2008,3(5):62-64, 80.
[4]李 敏, 韓 豐. 虛擬現(xiàn)實技術(shù)綜述[J]. 軟件導(dǎo)刊,2010, 9(6):142-144.
[5]Smierzchalski R. Simulation system for marine engine control room [R]. 11th Biennial Baltic Electronics Conference, 2008:281-284.
[6]孫 倩. 基于3DS MAX的三維建模機器在Virtools環(huán)境中的應(yīng)用[J]. 中國科技信息, 2008, (12):94-95.
[7]Aaron Reed. learning XNA 4.0 [M]. USA:O’Reilly Media, 2011:20.
[8]趙 飛, 葉 震. UDP協(xié)議與TCP協(xié)議的對比分析與可靠性改進(jìn)[J]. 計算機技術(shù)與發(fā)展, 2006, (09):219-221.
[9]劉 鵬, 劉 艷. UDP協(xié)議使用與分析[J]. 電腦知識與技術(shù), 2010, 6(13):3319-3320, 3380.
[10]Qin Haining, Xu Dong. The real-time dynamic shadow realization of shadow volume based on The HLSL [R]. Advances in Intelligent and Soft Computing, 2011:655-671.
[11]吳志良. 船舶電站及其自動化系統(tǒng)[M]. 大連:大連海事大學(xué)出版社, 2010:73-75.
Design and Realization of a Virtual Simulation System for a Ship Engine Control Room
Shen Haosheng, Zhang Jundong, Zeng Hong
( Marine Engineering College, Dalian Maritime University, Dalian Liaoning 116026, China )
On the basis of analyzing the present virtual reality technology and the ship engine control room, the paper implements the establishment of the three-dimension model by using 3D-MAX and the roam and interaction in virtual scene by using XNA, compiles the two-dimension simulation software by adopting C#, implements the communication between three-dimension virtual scene and two-dimension based on UDP protocol. According to the mathematical model of lighting effect, the paper implements one kind of shader based on GPU by using High level Shader Language (HLSL) which lowers the transmission burden between GPU and CPU and enhances the sense of reality of virtual scene.
virtual reality; virtual engine control room; XNA; high level shader language
TP 391.9
A
2095-302X (2013)04-0126-06
2012-10-18;定稿日期:2012-12-26
大連海事大學(xué)青年科學(xué)基金項目(51209025)
沈浩生(1989-),男,黑龍江省海林人,碩士研究生,主要研究方向為虛擬現(xiàn)實與建模仿真等。E-mail:shen7231591@126.com