陳 寧, 聶壘鑫, 劉 煒, 龔 嫚, 王之民
(江蘇科技大學(xué) 能源與動力工程學(xué)院, 江蘇 鎮(zhèn)江 212003)
虛擬仿真實際上是一種可創(chuàng)建和體驗虛擬世界的計算機(jī)系統(tǒng).此種虛擬世界由計算機(jī)生成,可以是現(xiàn)實世界的再現(xiàn),亦可以是構(gòu)想中的世界,用戶可借助視覺、聽覺及觸覺等多種傳感通道與虛擬世界進(jìn)行自然的交互.它是以仿真的方式給用戶創(chuàng)造一個實時反映實體對象變化與相互作用的三維虛擬世界,通過三維眼鏡、數(shù)據(jù)手套等輔助傳感設(shè)備,提供用戶一個觀測虛擬世界并與之交互的三維界面。用戶可直接參與探索仿真對象在所處環(huán)境中的作用與變化,并產(chǎn)生沉浸感.目前常用的視景仿真軟件有Vega,QUSET 3D,Creator等,但是OSG相比它們來講,仿真效率更高,渲染效果更加優(yōu)秀.
OSG是一個開源的場景圖形管理開發(fā)庫,主要為圖形圖像應(yīng)用程序的開發(fā)提供場景管理和圖形渲染優(yōu)化功能.它使用可移植的ANSI C++編寫,并使用已成為工業(yè)標(biāo)準(zhǔn)的OpenGL底層渲染API.因此,OSG具備跨平臺性,可以運(yùn)行在Windows,Max OS X和大多數(shù)類型的UNIX和Linux系統(tǒng)上.OSG是公開源代碼的,它的用戶許可方式為修改過的GUN寬通用公共許可證.
本系統(tǒng)是利用MFC結(jié)合OSG實現(xiàn)海洋場景.利用OSG2.8.2和VC2008平臺,編譯OsgOcean1.0.1,并與MFC框架結(jié)合,開發(fā)了海洋漫游系統(tǒng).系統(tǒng)框架如圖1.
圖1 系統(tǒng)框架Fig.1 System framework
OsgOcean是歐盟VENUS計劃中的一部分開源代碼,利用CMake軟件編譯OsgOcean1.0.1,把生成的OsgOcean.dll文件導(dǎo)入OpenSceneGraph-2.8.2的bin目錄下,通過VC2008平臺就能把OsgOcean移植到MFC中實現(xiàn)人機(jī)交互[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);∥參數(shù)含義(網(wǎng)格大小,分辨率,網(wǎng)格個數(shù),風(fēng)向,風(fēng)速,海面深度,放射衰減,浪的大小,是否波動,波動幅度,循環(huán)時間,幀數(shù))
oceanScene=new osgOcean::OceanScene(oceanSurface);
添加對應(yīng)的事件操作器:
viewer->addEventHandler(oceanSurface->getEventHandler());
viewer->addEventHandler(oceanScene->getEventHandler());
添加相機(jī)操作器,并設(shè)置觀察者的位置、視點和方向,最后把場景添加到viewer,即顯示窗口.
添加天空盒、水花及反射,嵌入MFC結(jié)構(gòu)中,生成OsgOcean場景,點擊生成海洋.運(yùn)行VC2008,效果如圖2.
圖2 osgOcean效果Fig.2 OsgOcean scene
圖3 OsgOcean場景組織Fig.3 Design of OsgOcean scene
在虛擬仿真動畫中,船舶的運(yùn)動是由矩陣操作的,需要實時對船舶的位置和姿態(tài)進(jìn)行回調(diào),以便實現(xiàn)船舶在海洋場景的運(yùn)動.在OSG中,設(shè)置有osg::Node,osg::Drawable,osg::Camera等的回調(diào).通常osg::Node可以在OSG執(zhí)行更新和揀選遍歷時進(jìn)行回調(diào);而osg::Drawable可以在揀選和繪制遍歷時進(jìn)行回調(diào);osg::Camera可以在更新遍歷時進(jìn)行回調(diào).在osg::NodeCallback類中,操作operator()非常關(guān)鍵,回調(diào)的操作代碼都在其中.virtual void operator()(osg::Node* node, osg::NodeVisitor* nv){traverser(node,nv);},第1個參數(shù)是關(guān)聯(lián)的節(jié)點地址,第2個參數(shù)是節(jié)點訪問器[2].
創(chuàng)建回調(diào)方案如下:
1) 編寫繼承自osg::NodeCallback類的新類class BoatPositionCallback.定義回調(diào)函數(shù):class BoatPositionCallback: public osg::NodeCallback;
2) 重載operator()方法,實現(xiàn)場景的動態(tài)更新.定義船舶運(yùn)動矩陣osg::Matrix mat,賦值mat=osg::computeLocalToWorld(nv->getNodePath()),得到回調(diào)節(jié)點的絕對坐標(biāo).定義float類型的變量height和osg::vec3f類型的normal,賦值height=oceanScene->getOceanSurfaceHeightAt(pos.x(), pos.y(), &normal),實時傳遞海面的高度,并把mat賦值給船舶模型節(jié)點mModel,就能實現(xiàn)船舶隨海面高度變化而變化的效果.
3) 初始化一個回調(diào)實例,關(guān)聯(lián)到對象.在MFC框架中定義cOSG類,這個類是實現(xiàn)OSG渲染的功能函數(shù),在cOSG類中定義函數(shù)void cOSG::AddContainership(),在其中設(shè)置回調(diào)實例,setUpdateCallback(new BoatPositionCallback);據(jù)類似原理,本系統(tǒng)加載了游輪、集裝箱船和拖船3種船型,運(yùn)行效果如圖4.
a) 游輪
b) 集裝箱船
c) 拖船
本系統(tǒng)可以實現(xiàn)3種天氣的轉(zhuǎn)換,實現(xiàn)原理是對3種天氣的天空體進(jìn)行貼圖,并設(shè)置有海面,浪花,霧,陽光顏色及陽光發(fā)散效果.3種天氣效果如圖5.
a) 陰霾
b) 黃昏
c) 晴朗
雨雪效果利用OSG粒子系統(tǒng)進(jìn)行模擬實現(xiàn),osgParticle能夠高效模擬粒子系統(tǒng),生成非常真實的效果.在OSG預(yù)定義的粒子系統(tǒng)中,大部分采用的是布告板與色彩融合技術(shù)生成粒子.本系統(tǒng)定義了一個class RainAndSnow類管理天氣,利用osgParticle::PrecipitationEffect定義兩種天氣peRain和peSnow,并把濃度設(shè)置為0.5.代碼為peRain->rain(0.5f),peSnow->snow(0.5f),把它們添加到場景管理節(jié)點中,實現(xiàn)動態(tài)的控制天氣.實現(xiàn)效果如圖6.
a) 雨景
b) 雪景
在天氣控制函數(shù)中添加m-fdensity變量,并添加鍵盤事件響應(yīng),每次按下“+”按鍵,對應(yīng)的m-fdensit變量會自增,m-fdensity+=0.1,再利用peRain->rain(m-fdensity),peSnow->snow(m-fdensity)以實現(xiàn)雨雪的動態(tài)控制.效果如圖7.
a) 雨景
b) 雪景
視點跟隨原理是將船舶運(yùn)動矩陣和相機(jī)(視口)矩陣關(guān)聯(lián)起來,使船舶運(yùn)動和視角觀察矩陣同步,根據(jù)這個原理本系統(tǒng)定義了一個視點跟隨矩陣class Follow繼承自osgGA::MatrixManipulator類,把船舶運(yùn)動矩陣mat傳遞給相機(jī)矩陣[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個虛函數(shù)是實現(xiàn)跟隨的關(guān)鍵.在getMatrix()函數(shù)中mat=osg::Matrixd::rotate(osg::PI-2, osg::Vec3(1, 0, 0)) * osg::Matrix::translate(m-vPosition) * cameraMatrix,先旋轉(zhuǎn)世界坐標(biāo)系,平移到船舶上適合的位置,按照船舶的運(yùn)動矩陣運(yùn)動.
船舶位置的更新需要重載osgGA::MatrixManipulator中的handle()函數(shù),即每幀更新矩陣位置,case(osgGA::GUIEventAdapter::FRAME):updateCametaMatrix(),每幀更新相機(jī)位置.如圖8.
圖8 視點跟隨Fig.8 Viewpoint attachment
視景渲染工作結(jié)束以后,通過預(yù)留的外部接口,將Matlab中Simulink模塊的實船運(yùn)動數(shù)學(xué)模型計算結(jié)果從數(shù)據(jù)庫中讀取出來并賦值給船舶運(yùn)動矩陣,相應(yīng)的車鐘信號和油門信號通過研華采集卡采集并轉(zhuǎn)為數(shù)字信號傳遞給數(shù)據(jù)庫,再從數(shù)據(jù)庫傳遞給Simulink模型的輸入端,實時仿真船舶運(yùn)動,如圖9.
圖9 三維立體船舶駕駛模擬器運(yùn)行效果Fig.9 Rendering of three-dimensional ship driving simulator
目前,OSG可以在多種平臺及操作系統(tǒng)上運(yùn)行,作為一門近幾年才發(fā)展起來的新興仿真工具,已經(jīng)得到了國內(nèi)外多公司和研究機(jī)構(gòu)的關(guān)注.OSG已經(jīng)應(yīng)用于高端制造,虛擬裝配,虛擬展示,教育學(xué)習(xí),數(shù)字城市等方面[7,10].OSG結(jié)合了計算機(jī)圖形學(xué),空間矩陣原理和計算機(jī)編程技術(shù),通過本系統(tǒng)的開發(fā)得出以下結(jié)論:
1)利用OsgOcean和MFC的結(jié)合,實現(xiàn)了可以人機(jī)交互的海洋場景漫游;
2)通過搭建海洋場景的視景仿真,實現(xiàn)了鍵盤和數(shù)據(jù)庫控制船舶運(yùn)動,包括航向、速度,實現(xiàn)了風(fēng)雪氣候轉(zhuǎn)換、視角切換,以及船舶模型動態(tài)更換.
[1] Tessendorf J.Simulating ocean water[C]∥ProceedingofACMSIGGRAPH.New York: ACM Press,2001:348-367.
[2] 肖鵬,劉更代,徐明亮. OpenSceneGraph三維渲染引擎編程指南[M]. 北京:清華大學(xué)出版社,2010:227-228.
[3] 陳寧,呂慶倫,孫玉科. 基于OSG的視點跟隨技術(shù)在船舶駕駛仿真系統(tǒng)中的應(yīng)用[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的船舶駕駛系統(tǒng)視覺仿真研究[D].江蘇鎮(zhèn)江:江蘇科技大學(xué),2010: 35-39.
[5] 陳興峰, 顧行發(fā), 程天海,等. 真實海洋表面的太陽耀光偏振輻射特性仿真與分析[J]. 光譜學(xué)與光譜分析, 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虛擬海洋環(huán)境與生命仿真平臺的設(shè)計與實現(xiàn)[J]. 中國海洋大學(xué)學(xué)報,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] 楊松林, 李慧蕾, 李坤, 等. 虛擬海浪海洋環(huán)境模擬方法及應(yīng)用[J]. 江蘇科技大學(xué)學(xué)報:自然科學(xué)版, 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] 谷家揚(yáng), 繆振華. 隨機(jī)海浪中船舶安全概率的數(shù)值模擬[J]. 江蘇科技大學(xué)學(xué)報:自然科學(xué)版, 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] 劉煒, 陳寧. 基于碰撞檢測的坦克運(yùn)動與地形匹配性研究[J]. 江蘇科技大學(xué)學(xué)報:自然科學(xué)版,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)