彭 晶,陸 曉,李 暉
武漢工程大學計算機科學與工程學院,湖北 武漢 430205
隨著計算機圖形學與虛擬現實技術的飛速發展,三維海面波浪場景模擬技術越來越多地應用到各種領域,例如游戲開發、影視業等,研究具有真實感的海洋波浪模型已迫在眉睫。不少國內外學者對此進行了研究。海面建模方面,Johanson[1]首次提出投影網格的算法,投影網格算法是一種依賴于觀察者的視覺習慣的算法,離觀察者遠的網格比較稀疏;反之,則比較細密。王強[2]在三維海面可視化仿真技術研究與實現中采用多級細節層次(Levels of Detail,LOD)網格實現無窮大的海面,利用快速傅里葉變換的周期性得到了海浪高度場。王艷芬等[3]在一種優化的投影網格海面實時繪制方法中提出了屏幕空間的網格自適應方法,模擬了精細化的海面。顧大權等[4]在基于網格投影的Phillips譜真實感海浪仿真模擬一文中構建了一種基于投影網格上的Phillips譜海浪。總的來說,LOD網格算法可以減少海面三角面片的數量,達到感官上的良好效果,是現在研究的熱門話題。海面高度場建模方面,各研究人員關注的重點各異,有的追求真實感,有的追求時效性,其關注的重點不同所以采用的算法也都各有千秋。Fournier 和 Reeves[5]使用 Gerstner 模型簡單的來描繪水波表面,但是這種方法的計算效率低而且模擬的水面不夠逼真。Tessendorf[6]采用快速傅里葉變換(fast Fourier transform,FFT)反演海浪譜,快速生成海面高度場,提升了模擬效果的真實感。熊艷飛等[7]在基于海浪譜模型和FFT的海面建模一文中針對海面波浪的隨機性和復雜性等仿真難點問題,從海洋學的觀測和研究成果出發,使用風浪、涌浪和震蕩波(choppy波)共同構成海浪譜,提出一種逼真度高且計算量小的基于海浪譜模型和FFT的海面建模方法。Kass等[8]通過求解簡化Navier-Stokes的方程的解來模擬水波。Peachey[9]采用Sin函數和Cos函數進行疊加的方法來模擬海面的波浪輪廓。陳麗寧等[10]在使用波數譜繪制海浪波幅畸變的矯正中提出了運用快速傅里葉逆變換形式Gerstner波解決繪制海浪中出現的波幅畸變問題。莊建東等[11]在三維海浪造型研究中,選擇了Pierson-Moskowite模型為基礎,采用了波的波長和波速建立了海浪高度場。陳祥望等[12]在基于圖像的水波動動畫建模和實時模擬中運用海浪譜統計學模型的水波生成法和FFT技術實時生成了海浪高度場。溫東陽[13]在隨機粗糙海面的模擬與仿真中針對海浪運動的隨機性采用了分形和蒙特卡羅的方法對隨機海面進行模擬。此外,也有學者傾向于更加大型更具有交互性的海洋模擬研究[14-15],其對計算機性能要求更高。
隨著計算機三維圖像技術的日漸成熟,國內外學者都深深體會到真實感三維自然景物模擬的重要性。國內外學者及機構對于三維仿真領域在海面建模和海面高度場建模等方面已有了深入的研究,但是仍存在一些問題,例如注重渲染卻忽略時效性,注重實時性而忽略了視覺上的感官需求,所以本文就實時性與渲染方面做出改進,達到二者的兼顧。
研究了投影網格算法基本原理,并在此基礎上進行了改進,優化了算法效率。此外,將紋理動畫與Normal Mapping技術相結合,提高了三維海洋模擬的真實感。海面波浪模擬系統模塊劃分如圖1所示。

圖1 海面波浪模擬系統Fig.1 Simulation system of sea surface waves
在進行大規模海洋波浪模擬時需要記錄大量的數據,所以在進行海面模擬時常常采用網格的方法。在采用網格來進行海面的建模時,需要考慮海洋的廣闊性和其實時動態性。主要影響海浪繪制的實時性與真實感的因素的有網格建模的網格模型和網絡拓撲結構。若網格與網格之間的間距過于致密,會增加計算機的計算量,影響實時性,而若網格與網格的距離過于稀疏,就會影響模擬場景的真實感。據此,對原始的投影網格做出了一些調整,使得在視點離水面近的時候對投影網格進行簡化,減少采樣點的數量,以此來避免由于采樣點過于密集而導致的走樣,從而使渲染出來的海面網格更加平滑,與此同時還減少了計算量,在效率上得到了提升。
由于用投影網格的算法生成一個無窮大的海洋平面對于計算機資源的耗費十分龐大,所以,需要把完整的海洋平面分割成若干個有限面積的高度場,再利用快速傅里葉變化的周期性實現拼接,從而得到一個無窮大的海洋平面。根據FFT算法可以快速疊加的特性,使用FFT建模。
1.1.1 FFT海面高度場的生成 根據FFT的海浪理論可知,快速傅里葉變化生成的海浪模型是由大量的不同的矢量波疊加而成,決定了波的傳播是角頻率和振幅。本文采用周期為64×64的二維FFT計算,代表世界坐標系下實際長寬都為64 m的海洋模型的高度場。具體流程如圖2所示。

圖2 計算FFT海面高度場的流程圖Fig.2 Flowchart of calculating FFT sea surface height field
1.1.2 限制采樣頻率的投影網格改進 利用投影網格來生成海面的一大特點就是不需要調整網格的數量,因為它是固定不變的。這對于處理大范圍的視野時較好,但是一旦觀察者的視野集中在一小塊區域時,由于網格數量不變并且區域面積變小,會導致采樣過于密集,從而出現網格畸變問題。
總的來說,海洋表面的高度場產生算法只能產生固定頻率的高度場數據,當視野過于狹小時,會導致走樣。針對這種情況,對原有的算法進行改進,當采樣頻率達到一定閾值時,對采樣點數量進行限制,從而避免走樣。換句話說,就是視點離水面較遠時可以把采樣保持在比較高的頻率,而當視點離水面過近的時候就需要簡化投影網格,使其采樣的頻率變小。這種改進方法不僅能解決走樣問題,同時還能降低計算量,提高計算效率。改進算法步驟如下:
1)設定投影網格的最高采樣頻率作為閾值。根據FFT的理論,二維FFT的周期為M,N,網格長寬分別為 Lx,Lz,其采樣點的頻率為Fwidth=M/Lx,Flength=M/Lz。
2)利用 Mprojector矩陣將視平面的四個頂點投影出來。
3)計算得到采樣的實際頻率。采用采樣點的數量M、N除以其網格在世界坐標系下的實際的長度 SAB,SAD,如式(1)。

4)對投影網格進行調整需要將投影網格的實際采樣頻率和最高采樣頻率相比較,使實際采樣頻率不超過最高采樣頻率。如果實際采樣頻率fwidth小于最高采樣頻率Fwidth,那么原來的投影網格就不需要改變,保持原樣即可。反之,如果實際采樣頻率 fwidth大于最高采樣頻率Fwidth,需要修改網格的橫向的采樣點數量,使 M=Fwidth×SAB,減少采樣點,從而改變投影網格的頻率。對投影網格的采樣頻率限制之后,當視野向水面移動時,采樣點數量減少,網格精度降低,直到 fwidth<Fwidth,采集到不高于最高采樣點的值,投影網格保持不變。
同理,對于投影網格的縱向采樣頻率 flength也采用相同步驟。改進后的算法通過減少采樣點實現限制采樣頻率,可以得到更好的渲染效率。
在大規模三維場景仿真中,目前的技術還不能直接模擬海面上每一個水粒子的運動,所以,紋理映射技術被引入到三維場景中,給三維場景添加真實感。紋理貼圖技術直接關系到三維海面波浪場景的視覺效果,是繪制真實感場景的重要步驟。
紋理貼圖[16]可以分為一維紋理、二維紋理、三維紋理。其中二維紋理貼圖是最常用的,其原理是將二維紋理映射到三維物體的表面,以此獲得具有紋理貼圖之后的三維場景,增加模擬的真實感。將二維紋理函數定義在(u,v)平面上,表現形式如下:

此處使用球面的紋理映射,其參數方程如下:

對于球面上的任意一點(x,y,z),求解參數(u,v),表達式如下:

1.2.1 Normal Mapping 直接通過FFT算法得到的海面過于光滑,與現實生活中的海面有一些差距,顯得不夠真實。真實的水面一般都會有一些波紋和跳動的細節,但是由于計算機資源是有限的,對于網格的精度是有限制的,所以只能模擬一些波長較長的波,在水面模擬中比較常用Normal Mapping仿真水紋的方式以增強細節。本文運用此技術繪制海面,增加海面模擬的真實感。
Normal Mapping技術[17]主要是通過運用紋理去改變物體的法向,其主要目的是體現出物體表面粗糙的紋理細節,而物體表面的幾何紋理是不變的,因此只需改變光照模型計算中的法向即可。為了計算物體表面上的每一個點的法向量,那么就需要一些額外的信息去表示物體表面的粗糙程度,采用高度圖算法就可實現儲存物體表面的凹凸信息,物體表面上的每一個點的法向量由該點的兩個切向量得到。
Normal Mapping需將計算得到每個點的法向量存儲為一張紋理貼圖。向量(0,0,1)被轉化為RGB 顏色(127,127,255),因此藍色是Normal Map的主色調。
Normal Map在仿真水紋時是利用紋理格式的RGB三通道得到一個三維的擾動值。可以將物體表面的每一個點轉化為一個單位長度向量,其中的每一個變量都可以傳化成RGB值。
1.2.2 基于紋理動畫的NormalMapping算法改進 用Normal Mapping算法可以增添海洋模型的紋理細節,但其模擬的紋理是相對固定的。紋理動畫是基于靜態網格的紋理采樣坐標運動,按照設定好的時間間隔連續切換紋理,從而帶給觀察者一種運動的感覺。將紋理動畫與Normal Mapping算法相結合,使得紋理在水面上的位置不斷變化,給人感覺就像是水面上的高頻波紋在不停地運動。采取三次采樣的方法,避免出現重復采樣帶來的重復感覺。這種方法的思想主要是使水面的紋理隨著時間的變化而變化,即用變化的紋理坐標對Normal Map進行采樣,來提高水面的真實感。主要思想的偽代碼如下:


在上述偽代碼中,在進行頂點渲染時選擇了3個采樣點,選取采樣點的標準是3個不同的時間和參數;此外在進行紋理貼圖渲染時也進行3次采樣,并混合3個法向量,用其進行光照計算,這樣會在視覺感官上更加真實。
圖3中展示的是模擬場景中的海面波浪。場景中的海面波浪主要是由限制采樣頻率的投影網格和FFT算法相結合產生的效果。下面分別介紹限制采樣頻率的投影網格和基于紋理動畫的Normal Mapping改進結果。

圖3 三維海面場景圖Fig.3 3D image of sea surface scene
海洋表面的高度場生成算法只能是產生有限精度的高度場數據,如果視野過于狹小,就會產生網格采樣密度過高而導致走樣,如圖4(a)所示。所以本文做了相關改進,通過限制采樣頻率的方式,在當視點離水面較近時,采用簡化版的海面網格,避免了海面網格走樣,如圖4(b)所示。
真實的水面一般都會有一些波紋和跳動的細節,直接通過FFT算法得到的海面缺少這些細節,會顯得不夠真實。Normal Mapping在仿真水紋時是利用紋理格式的RGB三通道得到一個三維的擾動值,可以將物體表面的每一個點轉化為一個單位長度向量,其中的每一個變量都可以傳化成RGB值。
將其應用到海面波浪模型上,可以更直觀的看到區別。圖5(a)是FFT直接生成的海面,整體比較平滑,缺少細節。引入Normal Mapping生成的海面可以看到豐富的波紋,更加接近真實的海面,如圖5(b)所示。

圖4 海面網格圖:(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算法生成的水紋不會隨著時間的變化而變化,是靜止的。引入紋理動畫,用變化的紋理坐標對Normal Mapping進行采樣,并采取三次采樣來避免出現重復采樣的情況,從而實現了波動效果的海面,提高了水面的真實感。
引入紋理動畫之后,看平靜的海面也可以看到其海面紋理的變化,體現海水波動的視覺感受,不同時間點,同一個區域的海面也會有其微小的變化,如圖6展示了1 s、2 s、3 s、4 s時的海面變化。

圖6 引入紋理動畫后的動態海面模擬圖:(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
實驗結果考慮了在海面渲染過程中的幀率比較,主要考慮的是在限制采樣頻率的投影網格與沒有限制的網格之間的比較,還有在沒有限制網格投影通過FFT生成的高度場幀率與改進后的比較。比較結果如表1所示。

表1 實驗結果幀率比較Tab.1 Frame rate comparison of experimental results Hz
從表1中可看出經過限制采樣頻率的投影網格的頻率幀率遠高于未經限制的投影網格,改進之后的計算效率更好,結合FFT算法之后海浪模擬的計算效率也使改進網格的效率更高一些。綜上所述,改進后的算法在計算速度上占有一定的優勢。
以上對海面網格模型進行了研究,在原有的基礎上提出了改進的投影網格算法,對采樣頻率進行了限制,避免了視野狹窄時采樣密度過高導致的走樣情況,也大量減少了三角面片數量,提高了計算速率,同時結合FFT算法,提高了模擬實時性。此外還對紋理貼圖進行了改進,將紋理動畫與Normal Mapping算法相結合,不僅提高了海面細節,還增加了海面的動態效果。筆者研究的海面波浪模型還有一些局限,在細節上海面泡沫、碎浪皆未能體現,另外,在計算效率方面還可以做進一步的改進,比如將一部分計算量分配給GPU,從而減少CPU的負擔等,可以進一步的探索。