劉淑婉, 鄭凱東
(西安石油大學 計算機學院, 西安710065)
動態(tài)自然景觀類場景的模擬一直是計算機圖形學的一個研究熱點,其中就包括關于流體的研究,目前研究模擬比較多的流體場景主要有:煙、云和水等。 地球表面約70%的區(qū)域被海洋所覆蓋,與其他自然場景模擬相比,海洋模擬在軍事、科研方面的應用顯得更為重要。 海洋場景作為水面場景之一,其運動極其復雜,海面的波動主要是由風與海面之間相互作用,波浪內(nèi)部渦動、破碎等形成,這使得動態(tài)海面成為高度隨機、無規(guī)則的自然現(xiàn)象,模擬起來較為困難。
對于動態(tài)海面的繪制,國內(nèi)外研究存在著各種各樣的建模方法。 Mihalef 將這些模擬方法歸結為兩大類:基于物理模型的方法和基于構造的方法[1]。 本次研究選取使用最為普遍的方法進行分析研究,主要包括:(1)基于凹凸紋理映射的建模方法;(2)基于Gerstner 模型的建模方法。
要表現(xiàn)出真實海水外觀,除了對場景進行建模,還需要對所建模型進行紋理貼圖。 而凹凸紋理映射是紋理貼圖的一種應用,實質是混合映射,通常用于一些表面粗糙復雜的模型。 相較于紋理映射,它并不是通過普通的顏色紋理貼圖,將高清外觀圖紋按照頂點匹配的映射方式粘貼到模型表面,而是改變或是擾動其法線的方向,光線模型中由于法線方向的改變,物體模型表面光照的明暗效果也會受到影響[2]。 實際凹凸紋理映射并沒有改變模型頂點位置,真正實現(xiàn)模型的動態(tài)模擬,而是在視覺效果上讓用戶認為是由于物理運動造成模型表面凹凸不平的。 凹凸紋理映射實現(xiàn)的方法主要有三種:法線貼圖映射(Normal Mapping)、視差貼圖映射(Parallax Mapping)、浮雕貼圖映射(Relief Mapping),本文主要利用法線貼圖映射技術。
大多數(shù)凹凸貼圖映射方法在實現(xiàn)過程中都是讓法線貼圖存儲在切線空間下的坐標系中。 對于模型上的任意一點,切線空間就是以這一點為原點構建一個自身坐標系,已知它的法線方向, 并讓這個法線作為坐標系中的Z 軸,再選擇兩條過該點的切線作為X、Y 軸,其中一條為切線(Tangent),另一條為副切線(Bit-Tangent)。 過點的切線有很多,要選取正確的切線和副切線為軸,可以通過模型三角網(wǎng)格上的紋理坐標(u,v)。 切線空間的切線向量實際上是模型空間坐標相對于u 的變化率,副切線向量則是相對于v 的變化率[3]。 假設現(xiàn)有一個三角形網(wǎng)格,表面法線向量為N →, 計算出三角形網(wǎng)格中的任意兩邊,記作,式(1)。



在法線貼圖映射方法中,需要提供兩張紋理,原始材質貼圖和法線紋理貼圖。 法線紋理貼圖作用就是保存要模擬的高度細節(jié)模型的法線信息,將這張法線紋理貼在低細節(jié)模型上,使低細節(jié)模型表現(xiàn)出高細節(jié)模型的表面特征,但實際內(nèi)部并沒有變化。通常法線紋理貼圖呈偏藍紫色,如圖1 所示。

圖1 原始材質貼圖與法線紋理貼圖Fig. 1 Original Texture And Normal Texture
法線貼圖映射的原理就是改變模型上的點在切線空間存儲的法線信息,通過用原始材質貼圖存儲的紋理及顏色信息和法線紋理貼圖存儲的法線信息來做光照的相關計算,進行渲染[4]。 實際編碼的過程中,最重要的一個環(huán)節(jié)就是將視線、法線、光線統(tǒng)一到同一個空間下,同一空間既可以是實際的模型空間又可以是切線空間。 大多數(shù)情況都采用將切線空間下的法線轉換成實際模型空間下的法線,在當下空間中直接進行光照計算。

法線貼圖技術模擬海面代碼最為簡單,渲染速度快,但仍存在一些不足之處。 假設,圖2 中紅線代表存儲海面上的凹凸信息,黑線代表模型上的三角網(wǎng)格平面。 如果采用法線貼圖映射方法,當人眼看向點B 時,法線貼圖技術是根據(jù)B 點的紋理坐標來對應法線信息,最終人眼看到的是由B 點對應到的C 點處的效果。 然而此時,人眼看到的應該是視線與凹凸表面交匯處A 點處的效果,而不是C 點的,這就產(chǎn)生了視覺差異。 當人眼與平面恰好垂直時,即C 點與A 點重合,此時使用法線貼圖會比較理想,不會產(chǎn)生視差。 對于其他角度的視線情況,法線貼圖生成的效果就不太符合真實的視覺感受,為了讓人眼看出A 點的效果,這種情況下就不能使用B點處紋理坐標對應的法線信息,而是應該使用D 點處的紋理坐標,才能獲取對應A 點的法線信息,此時可以通過對B 點處的紋理坐標(u,v) 偏移來形成視覺上的高低視差,給人以真實的感覺。

圖2 傾斜視角觀測凹凸表面視線原理圖Fig. 2 Line of sight of concave and convex surface observed from oblique angle
B 點到D 點的紋理坐標偏移應該是朝著視野在切線空間下的方向。 其偏移公式(5)為:

通常對于平靜海面的模擬,可以直接選擇正弦函數(shù)或者余弦函數(shù)進行模擬。 但對于具有明顯波峰的海面,這兩個函數(shù)就不是很合適了。 經(jīng)典的Gerstner 模型是國外應用于海水模擬最廣泛的一種幾何模型。 從動力學的角度來看,Gerstner 模型模擬的是海面上各個質點的運動,各個質點會隨著水波的運動產(chǎn)生周期性運動。 與余弦函數(shù)圖像相比,Gerstner 模型通過將點向波峰處擠壓,使頂點處變得比較尖銳,避免了生成的波峰很平滑的缺點,如圖3 所示。 其次Gerstner 模型還有一個特點,用它可以對基元波的Gerstner 波法向量進行較為簡單的求解,對仿真系統(tǒng)中光照模型的引入提供了便利[5]。

圖3 余弦波與Gerstner 波的波形比較Fig. 3 Comparison of Cosine wave and Gerstner wave
Gerstner 波函數(shù)為公式(6):

在Unity 中是三維坐標,針對于式(6) 的參數(shù)x,y 軸其實就相當于Unity 中的x,z 軸,把式(6)的y 替換成z,得到在Unity 實現(xiàn)時用到的函數(shù),公式(7)。

其中,A 表示振幅,D 表示波的方向,ω 控制波長的參數(shù),φ 波的初相, Qi用來控制波的陡度也就是波峰的尖銳程度,它的取值范圍必須要控制在[0,1]區(qū)間內(nèi)。 當其值為0 時,呈現(xiàn)的是普通正弦波疊加后的波形圖像;在(0,1)區(qū)間內(nèi),則會形成波峰不斷尖銳的波形效果;而Qi最大只能取到1,此時是波峰尖銳程度的臨界值,如果大于1 的,則在波峰處會形成環(huán)狀[6]。
模擬海水運動波形后,還需要有與周圍環(huán)境的一些交互,尤其是與光照的交互,這樣模擬產(chǎn)生的效果才會更加真實。 通過凹凸紋理映射中有關光照的一些計算可知,需要法線信息,這里也是一樣。 由于Gerstner 波是一個顯式函數(shù),可直接求得水面上任一質點的法線向量。 通過分別對x,y 的偏導即可求得副切線向量→B 以及切線向量→T,如公式(8)、(9)所示,再求二者差乘最終得到法向量→N,公式(10)。

根據(jù)以上的方法,在Unity5.0 平臺上使用C#以及OpenGL 進行繪制。 通過判斷視角的不同采用不同的凹凸紋理映射技術,圖4 是繪制成果。
從圖4 可以看出,使用法線貼圖映射技術,人眼可直觀感受到海面上是有所波動的,而且用該方法渲染速度也比較快,在一定程度上實現(xiàn)了視覺上的凹凸效果。 觀察遠處海平面,可以發(fā)現(xiàn)海面波動還是處于同一平面,實際海面本身還是靜止的,不會與其他物體交互產(chǎn)生碰撞,僅僅在視覺上讓人產(chǎn)生海面的動態(tài)效果,這種方法一般使用在普通游戲的大范圍裝飾性海水場景中。
使用Gerstner 波模型進行模擬操作,單個Gerstner 波所形成的海面具有動態(tài)性,但波形較為單一,具有重復性。 通過多個Gerstner 波疊加,使模擬出的海面更加具有隨機效果,但光影效果不是特別明顯,其渲染效果如圖5 所示。

圖4 基于法線貼圖映射技術生成的海面Fig. 4 Sea surface generated based on Normal mapping

圖5 基于Gerstner 波模型生成的海面Fig. 5 Sea surface generated based on Gerstner
不論使用凹凸紋理映射方法還是Gerstner 模型,都有各自的優(yōu)缺點。 現(xiàn)將這兩種方法結合在一起,既彌補了凹凸紋理映射不能實現(xiàn)真正的動態(tài)效果并產(chǎn)生交互行為,同時也能改善Gerstner 模型產(chǎn)生光影效果不明顯的問題。 兩者結合后的模擬效果如圖6 所示。

圖6 基于凹凸紋理映射與Gerstner 結合后生成的海面Fig. 6 Sea surface generated by combining Bump Mapping with GerstnerK
由圖6 可看出海平面真實地具有了動態(tài)效果,同時海面上海波的明暗效果也表現(xiàn)了出來。
本文針對兩種相對簡單的模擬海水方法進行了相應改進。 對于凹凸紋理映射,通過判斷視角,在不同視角下采用不同的映射技術。 當視線與海面垂直時,采取普通的法線貼圖映射;而當視線傾斜時,則采取改進后的法線凹凸映射。 利用Gerstner 波模型對海水動態(tài)模擬,通過疊加多個Gerstner 波實現(xiàn)波形復雜、凹凸不平的動態(tài)海面效果。 最后將這兩種基本方法組合在一起進行海水模擬,既實現(xiàn)了海水動態(tài)模擬交互,又通過凹凸紋理映射技術改善了光影渲染效果。
本文提出的研究方法僅是對于大面積海水進行的模擬,對于一個完整的海洋場景,研究工作還需要考慮到光照、浪花細節(jié)和物體交互的模擬。