吳 正
(上海船舶運輸科學研究所 艦船自動化分所, 上海 200135)
虛擬現實技術起源于20世紀60年代,是指借助計算機系統(tǒng)及傳感器技術生成三維環(huán)境,創(chuàng)造出一種嶄新的人機交互方式,通過調動用戶各種感官(視覺、聽覺、觸覺及嗅覺等)使用戶得到更加真實的體驗。隨著此技術的發(fā)展,不僅可作用于娛樂游戲等產業(yè),在應用教育及成果展示等許多領域均有應用。工信部在2016年4月發(fā)布了《虛擬現實產業(yè)發(fā)展白皮書5.0》,其中講述了當前中國虛擬現實產業(yè)的發(fā)展狀況,并提出了相關政策,從國家層面上充分肯定虛擬現實產業(yè)。這里將逐步說明并搭建一套完整的船用教學系統(tǒng),從真實的船舶數據著手,繪制高仿真度的船體模型,加以虛擬的海航場景和設備模型,提供一個上船工作的虛擬環(huán)境。該教學系統(tǒng)將對船員培訓及直觀展示船用設備,起到重要作用。
確定船型,得到相應的主尺度、尺度比和船型系數。以10萬噸貨油輪為例,分別計算船長L、型寬B、型深D及吃水d。
在船舶計算中通常要進行船體計算,計算內容包括橫剖面、水線面積及排水體積等面積與體積的幾何形心及面積的慣性矩,這類計算稱為船體計算,是船舶設計中的基礎工作。由于船體型線復雜,不能使用單一的解析式表達,計算一般根據型線圖,采用數值積分法進行。
圖1
圖2 船體模型效果圖
船上集中控制的作業(yè)地點主要分為駕駛室、貨控室和集控室。其中相關設備裝置種類繁多,但重在人機交互,無需設計材質和電路,故采用控制回路外循環(huán)作為基本要求,由船體得到最終模擬反饋。
此處僅以貨控室為例,主要由液位測量設備和壓載水操控臺組成,其它設備可根據教學需求逐一制作。
各惰氣壓力表、液位值及高位報警和壓載調水系統(tǒng)見圖3,當使用者觸及相應設備時,可對此進行操作。
a) 貨控室CCR俯瞰圖(遠景)
b) 貨控室俯瞰圖(近景)
譬如改變壓載調水系統(tǒng)的相關閥門,船體由于壓載水改變傾斜度,左、右吃水會發(fā)生變化,使用者的視角也會相應傾斜,和真實的船上體驗非常接近。
圖4 視覺表現參數設定
對于船用領域,環(huán)境背景一般為海洋,此處模型基于海浪頻譜和方向譜理論,但通過海風、海浪的各種變化,可模擬各種氣候現象,如潮汐、季風及颶風等極端氣象。
除去功能性參數,視覺表現參數設定見圖4。
Unity3D引擎是類似于Director,Blender engine,Virtools或Torque Game Builder等利用交互的圖型化開發(fā)環(huán)境為首要方式的軟件。其編輯器運行在Windows 和Mac OS X下,可發(fā)布游戲至Windows,Mac,Wii,iPhone,WebGL(需要HTML5),Windows phone 8和Android平臺,也可利用Unity web player插件發(fā)布網頁程序,支持Mac和Windows的網頁瀏覽。
借助Unity3D平臺,加載已完成制作的船體和海洋模型,使用FBX格式導入并調整位置,可簡單地搭建出一個虛擬航行場景,然后添加CS編譯器加上物理效果,最后進行渲染(見圖5)。
圖5 虛擬航行場景
若要表現出接近真實的狀態(tài),涉及到各種外界因素,其中影響力較大的是浮力,需對浮力進行精確計算。
船舶航行中,最直觀的即是四角吃水。但從測量角度一般由6個基準吃水點表示,艏吃水左(右)、舯吃水左(右)及艉吃水左(右)。為便于計算,以球體近似代替船體各部分產生的浮力,根據積分原則,當分割的球體越多,船體受力越趨向于真實(見圖6)。
圖6 船體吃水測量
估算作用力為浮力、風力、水阻和黏滯力的合力,由于風力與其他作用力不在同一坐標軸,需獨立計算。浮力等于水面下船體的重力,需通過程序計算水面下船體的體積與海水密度的乘積;水阻和船速成正比,黏滯力與水深和黏力系數成正比[2]。相關程序段如下。
86 public void UpdateForces(Rigidbody body)
87 {
88
89 if(Ocean, Instance ## null}
90 {
90 BuoyantForce=Vector3,zero;
92 DragForce=Vector3,zero;
93 Stickyness=Vector3,zero;
94 return;|
95 }
96
97 Vector3 pos=transform, position;
98
99 WaterHeight=Ocean, Instance, QueryWaves (pos.x, pos.z);
100
101 CalculateSubmersion (radius, pos.y);
102
103 float unitScale=GetUnitScale();
104
105 float Fb=DENSITY_WATER*unitScale*SubmergedVolume;
106
107 BuoyantForce=Physics.gravity*-Fb;
108
109 Vector3 velocity=body.velocity;
110
111 float vm=velocity, magnitude;
112 velocity=velocity.normalized*vm*vm*-1.0f;
113
114 DragForce=0.5f*dragCoefficient*DENSITY_WATER*unitScale*SubmergedVolume*velocity;
115
116 Stickyness=Vector3.up*(WaterHeight-pos.y)*Mass*stickyness;
117
118 }
用左、右眼分屏的獨立視角產生景深,造成立體感的視覺,再依靠重力感應的頭部追蹤技術感知頭部動作,當使用者在現實世界中移動,虛擬現實世界中的使用者也能同樣地移動。
當使用者向左看,頭部追蹤技術能識別該動作,這時硬件就會即時渲染出左邊的場景,即往左看能看到左邊的場景,往右看則能看到右邊的場景,不會發(fā)生場景跟著使用者移動的意外(見圖7)。
在畫面中添加2個攝像機,同水平線間距可設為可變化(用于瞳距校準),再將2個攝像頭按左、右分布在畫面中央。由于雙眼視野透過球體透鏡,需對畫面進行反畸變處理。
當畫面紋理產生畸變時,計算每一個變化的像素點是一個巨大的工作量,設計采用相對稀疏的網格的頂點做畸變處理,該方案可減少直接計算的資源,讓GPU做大量的插值運算。不采用對每一個像素做處理,對網格中的每個頂點做計算,極大的減少了計算量(減少了3個數量級),且提升了性能。在Shader和Camera都可滿足以上計算要求。經過畸變處理,可獲得以下視角(見圖8)。
2.3.1場景漫游
以使用者步行角度,需添加x軸向的前進、后退,y軸向的左轉、右轉相關程序段如下。
Vector3 Move = cam.transform.forward*input.y + cam.transform.right*input.x;
Move.x = Move.x*movementSettings.CurrentTargetSpeed;
Move.y = Move.y*movementSettings.CurrentTargetSpeed;
以使用者視野角度,需添加y軸向的坐看,右看,z軸向的抬頭、低頭,相關程序段如下。
Vector3 Move.y = Move.z*movementSettings.CurrentTargetSpeed;
Quaternion Rotation = Quaternion.AngleAxis(transform.eulerAngles.y - oldYRotation, Vector3.up);
圖7 數字視頻激電
a)前視圖
b)后視圖
2.3.2設備交互
當使用者進入到場景中的室內環(huán)境,視角中所有的儀表和按鈕都可設置為具有操作性,對應現實中的表現進行改變。
當程序默認從使用者雙目中心位置射出一根隱藏的射線,通過射線與設備相交產生觸發(fā)行為。
RaycastHit [] hits = Physics.RaycastAll ( transform.position, transform.forward )
根據要求可添加壓載水調平衡操作,通過對控制臺上壓載水控制系統(tǒng)的使用,模擬船體各壓載艙內的水位,同時影響到船體吃水位,產生傾斜角,使用者將得到真實的反饋表現。
同時,對控制臺上的液位測試系統(tǒng)也進行相應的互動。各艙的液位也可反饋在仿真儀表上,令使用者身臨其境,提高對設備使用的熟練度。
通過基于U3D的船用培訓軟件可提高上船工作者的環(huán)境認識度,在以后的船舶作業(yè)中,可快速掌握對相應設備的操作。用虛擬現實的設備可做到完全仿真的效果,對于一些具有危險性或價值巨大的設備,這種教學認知系統(tǒng)可提供安全可靠的學習環(huán)境。
參考文獻:
[1]劉紅. 船舶原理[M].上海:上海交通大學出版社,2009.
[2]朱珉虎. 阻力、功率和航速的估算(一)[J].中外船舶科技,2005(2):36-40.