徐 敏,陳先橋,王 宇
(武漢理工大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北武漢 430063)
內(nèi)河河道水深與季節(jié)密切相關(guān),枯水期船舶航行時通航壓力大、危險大,船舶容易發(fā)生擱淺事故,造成巨大的人員及經(jīng)濟(jì)損失。將河道地形三維可視化,不僅可幫助測量人員直觀地查看河床地形,同時還可幫助河道管理人員隨著季節(jié)變化發(fā)出水深通告,預(yù)防擱淺事故的發(fā)生,避免人員與經(jīng)濟(jì)損失。如何根據(jù)真實(shí)的數(shù)據(jù)快速有效地生成河床三維地形、河水平面及波浪的仿真成為內(nèi)河船舶航行三維仿真技術(shù)的關(guān)鍵。
在如何實(shí)現(xiàn)河床的三維可視化問題中,河海大學(xué)、天津航道局利用OpenGL基本函數(shù)編程技術(shù)開發(fā)了三維河床地形可視化系統(tǒng)。該系統(tǒng)利用離散數(shù)據(jù)風(fēng)格化算法、三維地形建模及真實(shí)感圖形繪制等過程實(shí)現(xiàn)了河床地形的可視化。但該研究過程繁瑣,無法快速實(shí)現(xiàn)利用現(xiàn)有數(shù)據(jù)生成三維可視化顯示[1]。在波浪仿真方面,PEACHEY、FOURNIER和童若峰等利用數(shù)學(xué)函數(shù)構(gòu)造出水波的外形,然后使波形隨著時間變化而變化[2];徐迎慶、陳前華和JIANG等基于物理方法利用波浪力學(xué)構(gòu)造出水波的模型。但上述方法應(yīng)用面狹窄且計(jì)算復(fù)雜,大多只用于滴水產(chǎn)生的漣漪效果仿真[3-5]。吳獻(xiàn)等提出的一種基于領(lǐng)域傳播的水波模擬方法雖然得到了狀態(tài)變量的演化規(guī)則,但沒有進(jìn)一步結(jié)合粘性流體力學(xué)將水質(zhì)的粘性因素考慮進(jìn)去且沒有進(jìn)一步提取出演化規(guī)則的各項(xiàng)比例權(quán)重[6-7]。
筆者采用高位圖與OGRE(object-oriented graphics rendering engine)快速實(shí)現(xiàn)了河床三維可視化,并利用GPU中的硬件頂點(diǎn)緩存來存放創(chuàng)建的水平面幾何體中所有的頂點(diǎn)數(shù)據(jù),通過綜合考慮粘性流體力學(xué)[8-10]與細(xì)胞自動機(jī)理論,推導(dǎo)出流體平面細(xì)胞自動機(jī)的演化規(guī)則,確定了演化規(guī)則中的各項(xiàng)比例權(quán)重。據(jù)此動態(tài)更新水平面幾何體中各點(diǎn)的高程值,從而實(shí)現(xiàn)隨船軌跡的水波效果。同時可以通過對水波各參數(shù)的動態(tài)修改,達(dá)到良好的交互性。
OGRE是一個成熟、穩(wěn)定、可靠、靈活、跨平臺,且具有豐富功能的實(shí)時3D圖形庫。它同時支持OpenGL與Direct3D,帶有多種管理器,其強(qiáng)大且成熟的材質(zhì)管理和腳本系統(tǒng),方便了材質(zhì)的維護(hù),支持對GPU的編程技術(shù),可自動渲染狀態(tài)和進(jìn)行空間剪裁。其中Terrain場景管理器支持對地形數(shù)據(jù)的渲染及空間剪裁。三維地形生成的流程如圖1所示。
圖1 三維地形生成流程圖
DXF文件是以ASCII方式儲存圖形的順序文本文件,包含了AutoCAD圖形文件的所有信息。DXF文件本質(zhì)上由代碼及關(guān)聯(lián)值對組成。代碼(通常稱為組碼)表明其后值的類型。使用這些組碼和值對,可以將DXF文件組織到由記錄組成的區(qū)域中,這些記錄由組碼和數(shù)據(jù)項(xiàng)目組成。實(shí)現(xiàn)具體的高程點(diǎn)信息的提取需要分為兩種情況具體考慮:
(1)地形圖中各圖元中點(diǎn)的高程值Z均為有效數(shù)據(jù),在這種情況下,直接讀取圖元各點(diǎn)的X,Y,Z坐標(biāo)并寫入文本文件即可。為了確保最終三維模型的準(zhǔn)確性,圖元的選取應(yīng)將常見的圖元點(diǎn)信息取全。CAD原文件中常用的圖元含LWPOLYLINE、CIRCLE、LINE、POINT 及 POLYLINE。
(2)地形圖中各點(diǎn)的高程值Z并不為有效數(shù)據(jù),或由于人為的疏忽大部分點(diǎn)的高程值為0。此時不需要讀取圖中各點(diǎn)的點(diǎn)信息,可換作讀取圖中所有標(biāo)注的文本信息的點(diǎn)坐標(biāo)X、Y,并將文本值作為其Z坐標(biāo)。雖然文本標(biāo)注的點(diǎn)遠(yuǎn)比圖中的圖元點(diǎn)數(shù)據(jù)要少,但圖中大部分的圖元都是通過這些文本標(biāo)注生成的等高線。
河水平面的構(gòu)建采用格網(wǎng)模型,構(gòu)建出一個complexity×complexity大小為 PLANESIZE的格網(wǎng)。格網(wǎng)平面由numFaces個三角面及numVertices個頂點(diǎn)組成。使用硬件頂點(diǎn)緩存存放所有頂點(diǎn)的三維位置坐標(biāo)、法向量及UV紋理坐標(biāo)。使用索引緩存存放格網(wǎng)面片的頂點(diǎn)索引。格網(wǎng)模型如圖2所示。
由平面模型可得:
格網(wǎng)上各頂點(diǎn)的值初始化如式(3)所示:vertex[i][j].x=i/complexity × PLANESIZE
圖2 河水平面格網(wǎng)模型
式中:vertex[i][j]為格網(wǎng)上第 i行第 j列處頂點(diǎn)。式(3)是對各頂點(diǎn)三維坐標(biāo)的初始化,其中當(dāng)水面平靜時,其高程值為0。
格網(wǎng)上每個小正方形點(diǎn)構(gòu)成的次序?yàn)轫槙r針型,index為索引矩陣,索引初始化偽代碼為:
要實(shí)現(xiàn)尾隨船舶的水波就是要確定上述所提出的水平面模型中各頂點(diǎn)的高程值(此處對應(yīng)為y值)的變化幅度。水平面格網(wǎng)模型中各頂點(diǎn)高程值變化取決于船舶航行時擠壓水平面的程度。為了實(shí)現(xiàn)隨船的波浪效果,方法一是根據(jù)筆者將要提出的擠壓水面算法更新格網(wǎng)中相應(yīng)頂點(diǎn)的高程值,二是每幀動態(tài)更新格網(wǎng)(即更新格網(wǎng)中頂點(diǎn)位置、法向量、UV坐標(biāo))。
2.2.1 船舶航行過程擠壓水面算法
筆者提出的算法基本思想是根據(jù)船舶航行點(diǎn),對本點(diǎn)及由本點(diǎn)及正方片鄰域各點(diǎn)進(jìn)行按權(quán)重更新鄰域各頂點(diǎn)的高程值。正方片模型如圖3所示。點(diǎn)(0,0)為船舶當(dāng)前航行點(diǎn)。實(shí)際生活中,將船舶航行時船頭點(diǎn)擠壓水面力最大權(quán)重設(shè)為1,周圍的點(diǎn)隨著離擠壓點(diǎn)距離的增大而擠壓力逐漸變小。因此構(gòu)建的權(quán)重為:
圖3 正方片模型
式中:x、y為船舶當(dāng)前航行點(diǎn)的坐標(biāo);addx、addy為距離增量。
對正方片中各點(diǎn)高程值進(jìn)行修改,正方片鄰域各點(diǎn)的高程值即為權(quán)重乘船舶吃水深度,有:
式中:depth為當(dāng)前船舶吃水深度。
2.2.2 動態(tài)更新水面格網(wǎng)的算法
在實(shí)際的水波現(xiàn)象中,隨船舶航行產(chǎn)生的水波與漣漪散開速度、漣漪波間距、水本身的黏滯性及水波周期有關(guān)。
當(dāng)不考慮流體的粘性,即視水波平面為理想流體時,線性化的二維淺水波方程給出了水波高度與波速、時間和水波平面之間的關(guān)系,如式(6)所示。
式中:c為波速;h為水波高度;t為時間;xoz平面為水波平面。
式(6)是無耗散的淺水方程,當(dāng)加入一定的耗散后得到式(7):
其中,k為耗散系數(shù)。水波中各點(diǎn)在任何時刻均需滿足式(7)。
細(xì)胞自動機(jī)是由一些特定規(guī)則的格子組成的,每個格子看作一個細(xì)胞,每個細(xì)胞在每一時刻均有一種狀態(tài)且格子上的細(xì)胞根據(jù)周圍細(xì)胞的狀態(tài)按照相同的法則改變自己的狀態(tài)。它具有并行性、局部性與一致性。這些特性決定了所有細(xì)胞受同樣規(guī)則支配,細(xì)胞狀態(tài)的變化只受鄰域細(xì)胞的影響且所有細(xì)胞保持同步更新。將水平面格網(wǎng)中每個節(jié)點(diǎn)均視為細(xì)胞,節(jié)點(diǎn)的高程視為細(xì)胞的狀態(tài)。設(shè)定鄰域細(xì)胞為四細(xì)胞環(huán)繞,如圖2中細(xì)胞 A、B、C、D 環(huán)繞細(xì)胞 E。
一階偏導(dǎo)與二階偏導(dǎo)定義為:
整理式(7)后得到式(9):
由于采取的是四細(xì)胞環(huán)繞模式,因此n=4;將式(9)展開整理得到式(10):
式(10)即為理想流體水波的自動演化規(guī)則,只要確定t-Δt與t時刻各細(xì)胞狀態(tài)的值,即可由此計(jì)算出接下來任意時刻的水面高度。
考慮到流體的粘性,由粘性流體力學(xué)中不可壓縮流體的Navier_Stokers方程可知,式(10)可進(jìn)一步推算出式(11),為:
為了簡化演化規(guī)則,進(jìn)一步分離出各項(xiàng)的比例因子,取Δt為水波的周期T,Δx為水波的波長D,水波的粘性系數(shù)U為耗散系數(shù)。由式(11)易從演化規(guī)則中分離出3個因子,即:
式中:C為漣漪速度;D為漣漪波長;U為流體黏滯性;T為水波的周期。
根據(jù)鄰域傳播思想,各頂點(diǎn)高程值的更新公式為:
筆者給出的所有算法均非常高效,由圖2所示的針對DXF文件的點(diǎn)提取算法只是對文件數(shù)據(jù)的分析及讀寫操作,筆者用到的實(shí)驗(yàn)數(shù)據(jù)是荊州太平口一段長24 km的河道數(shù)據(jù),提取時間僅用10 s。由式(8)更新格網(wǎng)所有頂點(diǎn)的高程值時,只需進(jìn)行complexity×complexity次運(yùn)算,時間復(fù)雜度為O(n2),完全可以滿足實(shí)時動畫的需要。與真實(shí)船舶航行過程中產(chǎn)生的水波相比,筆者的水波仿真較為符合實(shí)際,如圖4所示。同時可知當(dāng)水波參數(shù)不同時,產(chǎn)生的水波效果也不同,進(jìn)一步說明了該仿真具有良好的交互性。所提出的整套方案能快速解決內(nèi)河船舶航行三維可視化問題。
圖4 內(nèi)河船舶仿真渲染效果圖
筆者提出的內(nèi)河船舶航行仿真方案,給出了一種快速生成三維可視化河道的方法及實(shí)現(xiàn)水波動畫的一種新算法?;谠摲椒ㄅc該算法,在普通PC機(jī)或筆記本電腦上可達(dá)到180左右的幀率。完全能滿足一般實(shí)時渲染的要求,效果良好。
[1]辛海霞,呂秋靈,龐啟秀.三維河床地形可視化瀏覽系統(tǒng)研究與實(shí)現(xiàn)[J].計(jì)算機(jī)仿真,2006(12):179-182.
[2]童若鋒,汪國昭.用于動畫的水波造型[J].計(jì)算機(jī)學(xué)報,1996,19(8):594-599.
[3]徐迎慶,蘇成,李華,等.基于物理模型的流水及波浪模擬[J].計(jì)算機(jī)學(xué)報,1999,21(增刊):153-159.
[4]陳前華.滴水漣漪的計(jì)算機(jī)動畫模擬[J].計(jì)算機(jī)研究與發(fā)展,2001,38(5):524-528.
[5]JIANG Z D,MA L Z,SHI J Y.A physically-based approach to water modeling[C]//Proc the 6thInternational Conference on CAD & Computer Graphics.[S.l.]:[s.n.],1999:675-681.
[6]楊懷平,胡事民,孫家廣.一種實(shí)現(xiàn)水波動畫的新算法[J].計(jì)算機(jī)學(xué)報,2002,24(6):612-617.
[7]吳獻(xiàn),董蘭芳,盧德唐.一種基于鄰域傳播的水波模擬方法[J].中國科學(xué)技術(shù)大學(xué)學(xué)報,2010(3):278-282.
[8]夏震寰.現(xiàn)代水力學(xué)[M].北京:高等教育出版社,1992:65-98.
[9]ADAM L,ARNON P.Real-time shallow water simulation with opencl for CPUs[EB/OL].[2011-08-09].http://www.khronos.org/developers/library/2011_GDC_OpenGL/Intel-OpenGL-Water-Sim_GDC-Mar11.pdf.
[10]LO M H,JAMES S F.Improving parameter estimation and water table depth simulation in a land surface model using GRACE water storage and estimated base flow data[J].Water Resources Research,2010(5):15-17.