彭 晶,陸 曉,李 暉
武漢工程大學(xué)計算機(jī)科學(xué)與工程學(xué)院,湖北 武漢 430205
隨著計算機(jī)圖形學(xué)與虛擬現(xiàn)實(shí)技術(shù)的飛速發(fā)展,三維海面波浪場景模擬技術(shù)越來越多地應(yīng)用到各種領(lǐng)域,例如游戲開發(fā)、影視業(yè)等,研究具有真實(shí)感的海洋波浪模型已迫在眉睫。不少國內(nèi)外學(xué)者對此進(jìn)行了研究。海面建模方面,Johanson[1]首次提出投影網(wǎng)格的算法,投影網(wǎng)格算法是一種依賴于觀察者的視覺習(xí)慣的算法,離觀察者遠(yuǎn)的網(wǎng)格比較稀疏;反之,則比較細(xì)密。王強(qiáng)[2]在三維海面可視化仿真技術(shù)研究與實(shí)現(xiàn)中采用多級細(xì)節(jié)層次(Levels of Detail,LOD)網(wǎng)格實(shí)現(xiàn)無窮大的海面,利用快速傅里葉變換的周期性得到了海浪高度場。王艷芬等[3]在一種優(yōu)化的投影網(wǎng)格海面實(shí)時繪制方法中提出了屏幕空間的網(wǎng)格自適應(yīng)方法,模擬了精細(xì)化的海面。顧大權(quán)等[4]在基于網(wǎng)格投影的Phillips譜真實(shí)感海浪仿真模擬一文中構(gòu)建了一種基于投影網(wǎng)格上的Phillips譜海浪??偟膩碚f,LOD網(wǎng)格算法可以減少海面三角面片的數(shù)量,達(dá)到感官上的良好效果,是現(xiàn)在研究的熱門話題。海面高度場建模方面,各研究人員關(guān)注的重點(diǎn)各異,有的追求真實(shí)感,有的追求時效性,其關(guān)注的重點(diǎn)不同所以采用的算法也都各有千秋。Fournier 和 Reeves[5]使用 Gerstner 模型簡單的來描繪水波表面,但是這種方法的計算效率低而且模擬的水面不夠逼真。Tessendorf[6]采用快速傅里葉變換(fast Fourier transform,F(xiàn)FT)反演海浪譜,快速生成海面高度場,提升了模擬效果的真實(shí)感。熊艷飛等[7]在基于海浪譜模型和FFT的海面建模一文中針對海面波浪的隨機(jī)性和復(fù)雜性等仿真難點(diǎn)問題,從海洋學(xué)的觀測和研究成果出發(fā),使用風(fēng)浪、涌浪和震蕩波(choppy波)共同構(gòu)成海浪譜,提出一種逼真度高且計算量小的基于海浪譜模型和FFT的海面建模方法。Kass等[8]通過求解簡化Navier-Stokes的方程的解來模擬水波。Peachey[9]采用Sin函數(shù)和Cos函數(shù)進(jìn)行疊加的方法來模擬海面的波浪輪廓。陳麗寧等[10]在使用波數(shù)譜繪制海浪波幅畸變的矯正中提出了運(yùn)用快速傅里葉逆變換形式Gerstner波解決繪制海浪中出現(xiàn)的波幅畸變問題。莊建東等[11]在三維海浪造型研究中,選擇了Pierson-Moskowite模型為基礎(chǔ),采用了波的波長和波速建立了海浪高度場。陳祥望等[12]在基于圖像的水波動動畫建模和實(shí)時模擬中運(yùn)用海浪譜統(tǒng)計學(xué)模型的水波生成法和FFT技術(shù)實(shí)時生成了海浪高度場。溫東陽[13]在隨機(jī)粗糙海面的模擬與仿真中針對海浪運(yùn)動的隨機(jī)性采用了分形和蒙特卡羅的方法對隨機(jī)海面進(jìn)行模擬。此外,也有學(xué)者傾向于更加大型更具有交互性的海洋模擬研究[14-15],其對計算機(jī)性能要求更高。
隨著計算機(jī)三維圖像技術(shù)的日漸成熟,國內(nèi)外學(xué)者都深深體會到真實(shí)感三維自然景物模擬的重要性。國內(nèi)外學(xué)者及機(jī)構(gòu)對于三維仿真領(lǐng)域在海面建模和海面高度場建模等方面已有了深入的研究,但是仍存在一些問題,例如注重渲染卻忽略時效性,注重實(shí)時性而忽略了視覺上的感官需求,所以本文就實(shí)時性與渲染方面做出改進(jìn),達(dá)到二者的兼顧。
研究了投影網(wǎng)格算法基本原理,并在此基礎(chǔ)上進(jìn)行了改進(jìn),優(yōu)化了算法效率。此外,將紋理動畫與Normal Mapping技術(shù)相結(jié)合,提高了三維海洋模擬的真實(shí)感。海面波浪模擬系統(tǒng)模塊劃分如圖1所示。
圖1 海面波浪模擬系統(tǒng)Fig.1 Simulation system of sea surface waves
在進(jìn)行大規(guī)模海洋波浪模擬時需要記錄大量的數(shù)據(jù),所以在進(jìn)行海面模擬時常常采用網(wǎng)格的方法。在采用網(wǎng)格來進(jìn)行海面的建模時,需要考慮海洋的廣闊性和其實(shí)時動態(tài)性。主要影響海浪繪制的實(shí)時性與真實(shí)感的因素的有網(wǎng)格建模的網(wǎng)格模型和網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。若網(wǎng)格與網(wǎng)格之間的間距過于致密,會增加計算機(jī)的計算量,影響實(shí)時性,而若網(wǎng)格與網(wǎng)格的距離過于稀疏,就會影響模擬場景的真實(shí)感。據(jù)此,對原始的投影網(wǎng)格做出了一些調(diào)整,使得在視點(diǎn)離水面近的時候?qū)ν队熬W(wǎng)格進(jìn)行簡化,減少采樣點(diǎn)的數(shù)量,以此來避免由于采樣點(diǎn)過于密集而導(dǎo)致的走樣,從而使渲染出來的海面網(wǎng)格更加平滑,與此同時還減少了計算量,在效率上得到了提升。
由于用投影網(wǎng)格的算法生成一個無窮大的海洋平面對于計算機(jī)資源的耗費(fèi)十分龐大,所以,需要把完整的海洋平面分割成若干個有限面積的高度場,再利用快速傅里葉變化的周期性實(shí)現(xiàn)拼接,從而得到一個無窮大的海洋平面。根據(jù)FFT算法可以快速疊加的特性,使用FFT建模。
1.1.1 FFT海面高度場的生成 根據(jù)FFT的海浪理論可知,快速傅里葉變化生成的海浪模型是由大量的不同的矢量波疊加而成,決定了波的傳播是角頻率和振幅。本文采用周期為64×64的二維FFT計算,代表世界坐標(biāo)系下實(shí)際長寬都為64 m的海洋模型的高度場。具體流程如圖2所示。
圖2 計算FFT海面高度場的流程圖Fig.2 Flowchart of calculating FFT sea surface height field
1.1.2 限制采樣頻率的投影網(wǎng)格改進(jìn) 利用投影網(wǎng)格來生成海面的一大特點(diǎn)就是不需要調(diào)整網(wǎng)格的數(shù)量,因為它是固定不變的。這對于處理大范圍的視野時較好,但是一旦觀察者的視野集中在一小塊區(qū)域時,由于網(wǎng)格數(shù)量不變并且區(qū)域面積變小,會導(dǎo)致采樣過于密集,從而出現(xiàn)網(wǎng)格畸變問題。
總的來說,海洋表面的高度場產(chǎn)生算法只能產(chǎn)生固定頻率的高度場數(shù)據(jù),當(dāng)視野過于狹小時,會導(dǎo)致走樣。針對這種情況,對原有的算法進(jìn)行改進(jìn),當(dāng)采樣頻率達(dá)到一定閾值時,對采樣點(diǎn)數(shù)量進(jìn)行限制,從而避免走樣。換句話說,就是視點(diǎn)離水面較遠(yuǎn)時可以把采樣保持在比較高的頻率,而當(dāng)視點(diǎn)離水面過近的時候就需要簡化投影網(wǎng)格,使其采樣的頻率變小。這種改進(jìn)方法不僅能解決走樣問題,同時還能降低計算量,提高計算效率。改進(jìn)算法步驟如下:
1)設(shè)定投影網(wǎng)格的最高采樣頻率作為閾值。根據(jù)FFT的理論,二維FFT的周期為M,N,網(wǎng)格長寬分別為 Lx,Lz,其采樣點(diǎn)的頻率為Fwidth=M/Lx,F(xiàn)length=M/Lz。
2)利用 Mprojector矩陣將視平面的四個頂點(diǎn)投影出來。
3)計算得到采樣的實(shí)際頻率。采用采樣點(diǎn)的數(shù)量M、N除以其網(wǎng)格在世界坐標(biāo)系下的實(shí)際的長度 SAB,SAD,如式(1)。
4)對投影網(wǎng)格進(jìn)行調(diào)整需要將投影網(wǎng)格的實(shí)際采樣頻率和最高采樣頻率相比較,使實(shí)際采樣頻率不超過最高采樣頻率。如果實(shí)際采樣頻率fwidth小于最高采樣頻率Fwidth,那么原來的投影網(wǎng)格就不需要改變,保持原樣即可。反之,如果實(shí)際采樣頻率 fwidth大于最高采樣頻率Fwidth,需要修改網(wǎng)格的橫向的采樣點(diǎn)數(shù)量,使 M=Fwidth×SAB,減少采樣點(diǎn),從而改變投影網(wǎng)格的頻率。對投影網(wǎng)格的采樣頻率限制之后,當(dāng)視野向水面移動時,采樣點(diǎn)數(shù)量減少,網(wǎng)格精度降低,直到 fwidth<Fwidth,采集到不高于最高采樣點(diǎn)的值,投影網(wǎng)格保持不變。
同理,對于投影網(wǎng)格的縱向采樣頻率 flength也采用相同步驟。改進(jìn)后的算法通過減少采樣點(diǎn)實(shí)現(xiàn)限制采樣頻率,可以得到更好的渲染效率。
在大規(guī)模三維場景仿真中,目前的技術(shù)還不能直接模擬海面上每一個水粒子的運(yùn)動,所以,紋理映射技術(shù)被引入到三維場景中,給三維場景添加真實(shí)感。紋理貼圖技術(shù)直接關(guān)系到三維海面波浪場景的視覺效果,是繪制真實(shí)感場景的重要步驟。
紋理貼圖[16]可以分為一維紋理、二維紋理、三維紋理。其中二維紋理貼圖是最常用的,其原理是將二維紋理映射到三維物體的表面,以此獲得具有紋理貼圖之后的三維場景,增加模擬的真實(shí)感。將二維紋理函數(shù)定義在(u,v)平面上,表現(xiàn)形式如下:
此處使用球面的紋理映射,其參數(shù)方程如下:
對于球面上的任意一點(diǎn)(x,y,z),求解參數(shù)(u,v),表達(dá)式如下:
1.2.1 Normal Mapping 直接通過FFT算法得到的海面過于光滑,與現(xiàn)實(shí)生活中的海面有一些差距,顯得不夠真實(shí)。真實(shí)的水面一般都會有一些波紋和跳動的細(xì)節(jié),但是由于計算機(jī)資源是有限的,對于網(wǎng)格的精度是有限制的,所以只能模擬一些波長較長的波,在水面模擬中比較常用Normal Mapping仿真水紋的方式以增強(qiáng)細(xì)節(jié)。本文運(yùn)用此技術(shù)繪制海面,增加海面模擬的真實(shí)感。
Normal Mapping技術(shù)[17]主要是通過運(yùn)用紋理去改變物體的法向,其主要目的是體現(xiàn)出物體表面粗糙的紋理細(xì)節(jié),而物體表面的幾何紋理是不變的,因此只需改變光照模型計算中的法向即可。為了計算物體表面上的每一個點(diǎn)的法向量,那么就需要一些額外的信息去表示物體表面的粗糙程度,采用高度圖算法就可實(shí)現(xiàn)儲存物體表面的凹凸信息,物體表面上的每一個點(diǎn)的法向量由該點(diǎn)的兩個切向量得到。
Normal Mapping需將計算得到每個點(diǎn)的法向量存儲為一張紋理貼圖。向量(0,0,1)被轉(zhuǎn)化為RGB 顏色(127,127,255),因此藍(lán)色是Normal Map的主色調(diào)。
Normal Map在仿真水紋時是利用紋理格式的RGB三通道得到一個三維的擾動值。可以將物體表面的每一個點(diǎn)轉(zhuǎn)化為一個單位長度向量,其中的每一個變量都可以傳化成RGB值。
1.2.2 基于紋理動畫的NormalMapping算法改進(jìn) 用Normal Mapping算法可以增添海洋模型的紋理細(xì)節(jié),但其模擬的紋理是相對固定的。紋理動畫是基于靜態(tài)網(wǎng)格的紋理采樣坐標(biāo)運(yùn)動,按照設(shè)定好的時間間隔連續(xù)切換紋理,從而帶給觀察者一種運(yùn)動的感覺。將紋理動畫與Normal Mapping算法相結(jié)合,使得紋理在水面上的位置不斷變化,給人感覺就像是水面上的高頻波紋在不停地運(yùn)動。采取三次采樣的方法,避免出現(xiàn)重復(fù)采樣帶來的重復(fù)感覺。這種方法的思想主要是使水面的紋理隨著時間的變化而變化,即用變化的紋理坐標(biāo)對Normal Map進(jìn)行采樣,來提高水面的真實(shí)感。主要思想的偽代碼如下:
在上述偽代碼中,在進(jìn)行頂點(diǎn)渲染時選擇了3個采樣點(diǎn),選取采樣點(diǎn)的標(biāo)準(zhǔn)是3個不同的時間和參數(shù);此外在進(jìn)行紋理貼圖渲染時也進(jìn)行3次采樣,并混合3個法向量,用其進(jìn)行光照計算,這樣會在視覺感官上更加真實(shí)。
圖3中展示的是模擬場景中的海面波浪。場景中的海面波浪主要是由限制采樣頻率的投影網(wǎng)格和FFT算法相結(jié)合產(chǎn)生的效果。下面分別介紹限制采樣頻率的投影網(wǎng)格和基于紋理動畫的Normal Mapping改進(jìn)結(jié)果。
圖3 三維海面場景圖Fig.3 3D image of sea surface scene
海洋表面的高度場生成算法只能是產(chǎn)生有限精度的高度場數(shù)據(jù),如果視野過于狹小,就會產(chǎn)生網(wǎng)格采樣密度過高而導(dǎo)致走樣,如圖4(a)所示。所以本文做了相關(guān)改進(jìn),通過限制采樣頻率的方式,在當(dāng)視點(diǎn)離水面較近時,采用簡化版的海面網(wǎng)格,避免了海面網(wǎng)格走樣,如圖4(b)所示。
真實(shí)的水面一般都會有一些波紋和跳動的細(xì)節(jié),直接通過FFT算法得到的海面缺少這些細(xì)節(jié),會顯得不夠真實(shí)。Normal Mapping在仿真水紋時是利用紋理格式的RGB三通道得到一個三維的擾動值,可以將物體表面的每一個點(diǎn)轉(zhuǎn)化為一個單位長度向量,其中的每一個變量都可以傳化成RGB值。
將其應(yīng)用到海面波浪模型上,可以更直觀的看到區(qū)別。圖5(a)是FFT直接生成的海面,整體比較平滑,缺少細(xì)節(jié)。引入Normal Mapping生成的海面可以看到豐富的波紋,更加接近真實(shí)的海面,如圖5(b)所示。
圖4 海面網(wǎng)格圖:(a)不限制采樣頻率,(b)限制采樣頻率Fig.4 Diagram of sea surface grid:(a)unlimited sampling frequency ,(b)limited sampling frequency
圖5 海面波浪模擬圖:(a)未引入Normal Mapping,(b)引入Normal MappingFig.5 Simulation diagram of sea surface waves:(a)without Normal Mapping,(b)with Normal Mapping
一般的Normal Mapping算法生成的水紋不會隨著時間的變化而變化,是靜止的。引入紋理動畫,用變化的紋理坐標(biāo)對Normal Mapping進(jìn)行采樣,并采取三次采樣來避免出現(xiàn)重復(fù)采樣的情況,從而實(shí)現(xiàn)了波動效果的海面,提高了水面的真實(shí)感。
引入紋理動畫之后,看平靜的海面也可以看到其海面紋理的變化,體現(xiàn)海水波動的視覺感受,不同時間點(diǎn),同一個區(qū)域的海面也會有其微小的變化,如圖6展示了1 s、2 s、3 s、4 s時的海面變化。
圖6 引入紋理動畫后的動態(tài)海面模擬圖:(a) 1 s,(b) 2 s,(c) 3 s,(d) 4 sFig.6 Simulation diagram of dynamic sea surface with texture animation:(a) 1 s,(b) 2 s,(c) 3 s,(d) 4 s
實(shí)驗結(jié)果考慮了在海面渲染過程中的幀率比較,主要考慮的是在限制采樣頻率的投影網(wǎng)格與沒有限制的網(wǎng)格之間的比較,還有在沒有限制網(wǎng)格投影通過FFT生成的高度場幀率與改進(jìn)后的比較。比較結(jié)果如表1所示。
表1 實(shí)驗結(jié)果幀率比較Tab.1 Frame rate comparison of experimental results Hz
從表1中可看出經(jīng)過限制采樣頻率的投影網(wǎng)格的頻率幀率遠(yuǎn)高于未經(jīng)限制的投影網(wǎng)格,改進(jìn)之后的計算效率更好,結(jié)合FFT算法之后海浪模擬的計算效率也使改進(jìn)網(wǎng)格的效率更高一些。綜上所述,改進(jìn)后的算法在計算速度上占有一定的優(yōu)勢。
以上對海面網(wǎng)格模型進(jìn)行了研究,在原有的基礎(chǔ)上提出了改進(jìn)的投影網(wǎng)格算法,對采樣頻率進(jìn)行了限制,避免了視野狹窄時采樣密度過高導(dǎo)致的走樣情況,也大量減少了三角面片數(shù)量,提高了計算速率,同時結(jié)合FFT算法,提高了模擬實(shí)時性。此外還對紋理貼圖進(jìn)行了改進(jìn),將紋理動畫與Normal Mapping算法相結(jié)合,不僅提高了海面細(xì)節(jié),還增加了海面的動態(tài)效果。筆者研究的海面波浪模型還有一些局限,在細(xì)節(jié)上海面泡沫、碎浪皆未能體現(xiàn),另外,在計算效率方面還可以做進(jìn)一步的改進(jìn),比如將一部分計算量分配給GPU,從而減少CPU的負(fù)擔(dān)等,可以進(jìn)一步的探索。