陳 寧, 聶壘鑫, 劉 煒, 龔 嫚, 王之民
(江蘇科技大學 能源與動力工程學院, 江蘇 鎮江 212003)
虛擬仿真實際上是一種可創建和體驗虛擬世界的計算機系統.此種虛擬世界由計算機生成,可以是現實世界的再現,亦可以是構想中的世界,用戶可借助視覺、聽覺及觸覺等多種傳感通道與虛擬世界進行自然的交互.它是以仿真的方式給用戶創造一個實時反映實體對象變化與相互作用的三維虛擬世界,通過三維眼鏡、數據手套等輔助傳感設備,提供用戶一個觀測虛擬世界并與之交互的三維界面。用戶可直接參與探索仿真對象在所處環境中的作用與變化,并產生沉浸感.目前常用的視景仿真軟件有Vega,QUSET 3D,Creator等,但是OSG相比它們來講,仿真效率更高,渲染效果更加優秀.
OSG是一個開源的場景圖形管理開發庫,主要為圖形圖像應用程序的開發提供場景管理和圖形渲染優化功能.它使用可移植的ANSI C++編寫,并使用已成為工業標準的OpenGL底層渲染API.因此,OSG具備跨平臺性,可以運行在Windows,Max OS X和大多數類型的UNIX和Linux系統上.OSG是公開源代碼的,它的用戶許可方式為修改過的GUN寬通用公共許可證.
本系統是利用MFC結合OSG實現海洋場景.利用OSG2.8.2和VC2008平臺,編譯OsgOcean1.0.1,并與MFC框架結合,開發了海洋漫游系統.系統框架如圖1.

圖1 系統框架Fig.1 System framework
OsgOcean是歐盟VENUS計劃中的一部分開源代碼,利用CMake軟件編譯OsgOcean1.0.1,把生成的OsgOcean.dll文件導入OpenSceneGraph-2.8.2的bin目錄下,通過VC2008平臺就能把OsgOcean移植到MFC中實現人機交互[1,5-6,8-9].
利用OSG中的智能指針osg::ref-ptr定義兩個變量oceanSurface和oceanScene,并分別賦值:
oceanSurface=new osgOcean::FFTOceanSurface(64, 256, 17, osg::Vec2f(1.1f, 1.1f),12.0f,1000.0f, 0.8, 1e-8, true, 2.5, 10.0f, 256);∥參數含義(網格大小,分辨率,網格個數,風向,風速,海面深度,放射衰減,浪的大小,是否波動,波動幅度,循環時間,幀數)
oceanScene=new osgOcean::OceanScene(oceanSurface);
添加對應的事件操作器:
viewer->addEventHandler(oceanSurface->getEventHandler());
viewer->addEventHandler(oceanScene->getEventHandler());
添加相機操作器,并設置觀察者的位置、視點和方向,最后把場景添加到viewer,即顯示窗口.
添加天空盒、水花及反射,嵌入MFC結構中,生成OsgOcean場景,點擊生成海洋.運行VC2008,效果如圖2.

圖2 osgOcean效果Fig.2 OsgOcean scene

圖3 OsgOcean場景組織Fig.3 Design of OsgOcean scene
在虛擬仿真動畫中,船舶的運動是由矩陣操作的,需要實時對船舶的位置和姿態進行回調,以便實現船舶在海洋場景的運動.在OSG中,設置有osg::Node,osg::Drawable,osg::Camera等的回調.通常osg::Node可以在OSG執行更新和揀選遍歷時進行回調;而osg::Drawable可以在揀選和繪制遍歷時進行回調;osg::Camera可以在更新遍歷時進行回調.在osg::NodeCallback類中,操作operator()非常關鍵,回調的操作代碼都在其中.virtual void operator()(osg::Node* node, osg::NodeVisitor* nv){traverser(node,nv);},第1個參數是關聯的節點地址,第2個參數是節點訪問器[2].
創建回調方案如下:
1) 編寫繼承自osg::NodeCallback類的新類class BoatPositionCallback.定義回調函數:class BoatPositionCallback: public osg::NodeCallback;
2) 重載operator()方法,實現場景的動態更新.定義船舶運動矩陣osg::Matrix mat,賦值mat=osg::computeLocalToWorld(nv->getNodePath()),得到回調節點的絕對坐標.定義float類型的變量height和osg::vec3f類型的normal,賦值height=oceanScene->getOceanSurfaceHeightAt(pos.x(), pos.y(), &normal),實時傳遞海面的高度,并把mat賦值給船舶模型節點mModel,就能實現船舶隨海面高度變化而變化的效果.
3) 初始化一個回調實例,關聯到對象.在MFC框架中定義cOSG類,這個類是實現OSG渲染的功能函數,在cOSG類中定義函數void cOSG::AddContainership(),在其中設置回調實例,setUpdateCallback(new BoatPositionCallback);據類似原理,本系統加載了游輪、集裝箱船和拖船3種船型,運行效果如圖4.

a) 游輪

b) 集裝箱船

c) 拖船
本系統可以實現3種天氣的轉換,實現原理是對3種天氣的天空體進行貼圖,并設置有海面,浪花,霧,陽光顏色及陽光發散效果.3種天氣效果如圖5.

a) 陰霾

b) 黃昏

c) 晴朗
雨雪效果利用OSG粒子系統進行模擬實現,osgParticle能夠高效模擬粒子系統,生成非常真實的效果.在OSG預定義的粒子系統中,大部分采用的是布告板與色彩融合技術生成粒子.本系統定義了一個class RainAndSnow類管理天氣,利用osgParticle::PrecipitationEffect定義兩種天氣peRain和peSnow,并把濃度設置為0.5.代碼為peRain->rain(0.5f),peSnow->snow(0.5f),把它們添加到場景管理節點中,實現動態的控制天氣.實現效果如圖6.

a) 雨景

b) 雪景
在天氣控制函數中添加m-fdensity變量,并添加鍵盤事件響應,每次按下“+”按鍵,對應的m-fdensit變量會自增,m-fdensity+=0.1,再利用peRain->rain(m-fdensity),peSnow->snow(m-fdensity)以實現雨雪的動態控制.效果如圖7.

a) 雨景

b) 雪景
視點跟隨原理是將船舶運動矩陣和相機(視口)矩陣關聯起來,使船舶運動和視角觀察矩陣同步,根據這個原理本系統定義了一個視點跟隨矩陣class Follow繼承自osgGA::MatrixManipulator類,把船舶運動矩陣mat傳遞給相機矩陣[3-4].其中virtual void setByMatrix (const osg::Matrixd &matrix),virtual void setByInverseMatrix (const osg::Matrixd &matrix),virtual osg::Matrixd getMatrix(),virtual osg::Matrixd getInverseMatrix () 4個虛函數是實現跟隨的關鍵.在getMatrix()函數中mat=osg::Matrixd::rotate(osg::PI-2, osg::Vec3(1, 0, 0)) * osg::Matrix::translate(m-vPosition) * cameraMatrix,先旋轉世界坐標系,平移到船舶上適合的位置,按照船舶的運動矩陣運動.
船舶位置的更新需要重載osgGA::MatrixManipulator中的handle()函數,即每幀更新矩陣位置,case(osgGA::GUIEventAdapter::FRAME):updateCametaMatrix(),每幀更新相機位置.如圖8.

圖8 視點跟隨Fig.8 Viewpoint attachment
視景渲染工作結束以后,通過預留的外部接口,將Matlab中Simulink模塊的實船運動數學模型計算結果從數據庫中讀取出來并賦值給船舶運動矩陣,相應的車鐘信號和油門信號通過研華采集卡采集并轉為數字信號傳遞給數據庫,再從數據庫傳遞給Simulink模型的輸入端,實時仿真船舶運動,如圖9.

圖9 三維立體船舶駕駛模擬器運行效果Fig.9 Rendering of three-dimensional ship driving simulator
目前,OSG可以在多種平臺及操作系統上運行,作為一門近幾年才發展起來的新興仿真工具,已經得到了國內外多公司和研究機構的關注.OSG已經應用于高端制造,虛擬裝配,虛擬展示,教育學習,數字城市等方面[7,10].OSG結合了計算機圖形學,空間矩陣原理和計算機編程技術,通過本系統的開發得出以下結論:
1)利用OsgOcean和MFC的結合,實現了可以人機交互的海洋場景漫游;
2)通過搭建海洋場景的視景仿真,實現了鍵盤和數據庫控制船舶運動,包括航向、速度,實現了風雪氣候轉換、視角切換,以及船舶模型動態更換.
[1] Tessendorf J.Simulating ocean water[C]∥ProceedingofACMSIGGRAPH.New York: ACM Press,2001:348-367.
[2] 肖鵬,劉更代,徐明亮. OpenSceneGraph三維渲染引擎編程指南[M]. 北京:清華大學出版社,2010:227-228.
[3] 陳寧,呂慶倫,孫玉科. 基于OSG的視點跟隨技術在船舶駕駛仿真系統中的應用[J]. 船舶工程, 2011,33(6): 53-57.
Chen Ning, Lü Qinglun, Sun Yuke. The application of viewpoint follow technology in ship driving simulation system based on OSG[J].ShipEngineering,2011,33(6): 53-57. (in Chinese)
[4] 呂慶倫. 基于OSG的船舶駕駛系統視覺仿真研究[D].江蘇鎮江:江蘇科技大學,2010: 35-39.
[5] 陳興峰, 顧行發, 程天海,等. 真實海洋表面的太陽耀光偏振輻射特性仿真與分析[J]. 光譜學與光譜分析, 2011,31(6):1648-1653.
Chen Xingfeng, Gu Xingfa, Cheng Tianhai, et al. Simulation and analysis of polarization characteristics for real sea surface sunlight[J].SpectroscopyandSpectralAnalysis,2011,31(6):1648-1653.
[6] 陳戈, 李文慶, 李小寧. 交互式VR-ocean虛擬海洋環境與生命仿真平臺的設計與實現[J]. 中國海洋大學學報,2009,39(5):1037-1041.
Chen Ge, Li Wenqing, Li Xiaoning. Design and implementation of an interactive VR-ocean platform for ocean environment and marine life simulation[J].PeriodicalofOceanUniversityofChina,2009,39(5):1037-1041. (in Chinese)
[7] Cha J H, Roh M I, Lee K Y. Integrated simulation framework for the process planning of ships and offshore structures[J].RoboticsandComputer-IntegratedManufacturing,2010,26(5): 430-453.
[8] 楊松林, 李慧蕾, 李坤, 等. 虛擬海浪海洋環境模擬方法及應用[J]. 江蘇科技大學學報:自然科學版, 2012,26(3):213-217.
Yang Songlin, Li Huilei, Li Kun, et al. Virtual wave and marine environment simulation method and its application[J].JournalofJiangsuUniversityofScienceandTechnology:NaturalScienceEdition,2012,26(3):213-217. (in Chinese)
[9] 谷家揚, 繆振華. 隨機海浪中船舶安全概率的數值模擬[J]. 江蘇科技大學學報:自然科學版, 2005,19(6):6-11.
Gu Jiayang, Miao Zhenhua. Numerical simulation of ship′s safe probability in stochastic waves[J].JournalofJiangsuUniversityofScienceandTechnology:NaturalScienceEdition,2005,19(6):6-11.(in Chinese)
[10] 劉煒, 陳寧. 基于碰撞檢測的坦克運動與地形匹配性研究[J]. 江蘇科技大學學報:自然科學版,2012,26(4): 357-360.
Liu Wei, Chen Ning. Matching degree between tank′s motion and terrain based on the technology of intersection detective[J].JournalofJiangsuUniversityofScienceandTechnology:NaturalScienceEdition,2012,26(4): 357-360.(in Chinese)