齊 敏,周加軍,李大健,崔赫琳
(1.西北工業(yè)大學(xué) 陜西 西安 710129;2.西北工業(yè)大學(xué)365研究所 陜西 西安 710129)
在虛擬現(xiàn)實(shí)和可視化仿真中,對自然景物的模擬是其研究的重點(diǎn)之一。動態(tài)水流經(jīng)常出現(xiàn)在虛擬環(huán)境當(dāng)中,它能夠在很大程度上增加虛擬環(huán)境的真實(shí)感。水流與煙霧、火焰一樣,其形狀和運(yùn)動的方式受其它景物的影響,沒有規(guī)律性,因此不能用傳統(tǒng)的幾何建模方法來創(chuàng)建它。
目前有多種形成水波的方法,在國外,Peachey[1]采用了正弦函數(shù)與二次函數(shù)線性組合的方法來模擬波浪外形。Fournier[2]等人則利用構(gòu)造參數(shù)曲面合成的方法來模擬比較復(fù)雜的海浪。Foster[3]等人使用有限差分近似求解Navier-Stokes方程,用得到流速場和壓力場產(chǎn)生水波高度場模擬出較真實(shí)的水面效果。Perlin[4]提出了一種噪聲圖像合成方法,利用噪聲函數(shù)生成連續(xù)的二維噪聲曲面,再疊加成分形曲面。Johanson[5]利用Perlin噪聲和投影網(wǎng)格來模擬海浪等。
在國內(nèi),楊懷平和孫家廣[6]從海洋學(xué)觀測的經(jīng)驗入手,利用海浪譜對深水波進(jìn)行了模擬。李廣鑫[7]等人引入Perlin噪聲作為水面高度場動態(tài)變化的激勵源,使用準(zhǔn)均勻B樣條曲面來構(gòu)造水面,來模擬水面連續(xù)動蕩變化的效果,而且用CubeMap紋理映射技術(shù)模擬了水面的反射效果等。宋利等人利用Fourier[8]合成技術(shù),對模型表面利用靜止水面的圖像數(shù)據(jù)進(jìn)行紋理映射,模擬雨滴下落的自然現(xiàn)象。
Perlin[4]噪聲是由Ken Perlin發(fā)明的自然噪聲生成算法??梢杂脕砟M自然界中的噪聲現(xiàn)象。用它可以得到連續(xù)變化的二維圖像,例如可以用它來模擬人體的隨機(jī)運(yùn)動,螞蟻行進(jìn)的線路,也可以通過計算分形和模擬云朵、火焰等非常復(fù)雜的紋理。Perlin噪聲對各個點(diǎn)的計算是相互獨(dú)立的,非常適合使用圖形處理器進(jìn)行計算。
創(chuàng)建Perlin噪聲函數(shù),需要有一個噪聲函數(shù)和一個插值函數(shù):
1)噪聲函數(shù)基本上是一個種子隨機(jī)發(fā)生器。它需要有一個整數(shù)作為參數(shù),然后根據(jù)這個參數(shù)得到一個隨機(jī)數(shù)。對于相同的兩個參數(shù),會得到相同的結(jié)果。
2)可以在兩值之間進(jìn)行平滑插值,來形成一個可以輸入非整參數(shù)的連續(xù)函數(shù),由此來填充兩個隨機(jī)點(diǎn)之間的非整數(shù)的空白部分,目前常用的插值函數(shù)有線性插值、余弦插值、立方插值以及多次方插值函數(shù)。本文中Perlin利用余弦插值進(jìn)行平滑,得到了很好的平滑效果。
在文中需要利用二維的Perlin噪聲函數(shù)對水面紋理進(jìn)行擾動。首先要構(gòu)造一個二維梯度場,如圖1,將二維噪聲面分割為個網(wǎng)格,每個網(wǎng)格點(diǎn)則為噪聲面的控制點(diǎn),每個控制點(diǎn)的梯度方向和長度都是隨機(jī)產(chǎn)生的,并且是一次性的,但是在求每個噪聲控制點(diǎn)的過程中,其梯度是不變的,這就使得Perlin噪聲對于相同的整數(shù)輸入,產(chǎn)生相同的輸出。
圖1 噪聲網(wǎng)格梯度圖Fig.1 Gradient map of noise grid
設(shè)噪聲函數(shù)為 PerlinNiose(x,y),I(x,y)為任意一點(diǎn)的噪聲值,如果I(x,y)的坐標(biāo)為整數(shù),則其數(shù)值等于原始的數(shù)值,如果I(x,y)的坐標(biāo)不為整數(shù)坐標(biāo),其數(shù)值則由包圍它的單位四邊形上的四個點(diǎn)來插值求得。其相鄰的四個控制點(diǎn)為N(i,y),N(i,j+1),N(i+1,j),N(i+1,j+1),其中 v(i,j)v(i,j+1),v(i+1,j),v(i+1,j+1)分別為這 4 個點(diǎn)的梯度,這 4 個控制點(diǎn)對待插點(diǎn)的的貢獻(xiàn)值為:
然后在 x,y 方向上利用 D1,D2,D3,D4對 I(x,y)進(jìn)行余弦插值,即可得到平滑的噪聲平面。其余弦插值函數(shù)為
可編程的圖形硬件是提高圖形程序設(shè)計靈活性和效率的一個重要手段,隨著圖形處理單元GPU的逐漸完善,OpenGL著色語言(GLSL)應(yīng)運(yùn)而生,它可以使得開發(fā)人員可以很好的控制圖形處理管線,實(shí)現(xiàn)各種完美的圖形渲染效果。
最新的GLSL主要包含頂點(diǎn)著色器(Vertex Shader),片元著色器(Fragment Shader),和幾何著色器(Geometry Shader)。
1)頂點(diǎn)著色器 在OpenGL著色語言中,頂點(diǎn)不僅是位置坐標(biāo)值,還包括法線坐標(biāo)、紋理坐標(biāo)、顏色坐標(biāo)、霧坐標(biāo)和自定義屬性坐標(biāo)。在頂點(diǎn)處理的過程中,數(shù)據(jù)通過attribute變量,uniform變量和紋理貼圖的方式傳遞給頂點(diǎn)著色器。經(jīng)過處理后的數(shù)據(jù)再通過varying變量和專用的頂點(diǎn)著色器輸出變量從頂點(diǎn)著色器輸出,并將頂點(diǎn)插值得到的結(jié)果傳入幾何著色器,或者片元著色器。
2)片元著色器 是一個可編程的處理面片數(shù)值及數(shù)據(jù)的單元。片元處理器可以完成對圖形的插值,紋理的訪問等相關(guān)處理,以及實(shí)現(xiàn)霧化效果和顏色求和。片元著色器可以處理光柵化生成的點(diǎn)、線、多邊形,像素集合及位圖等,但面片處理器不能完成多個面片的同時操作。
3)幾何著色器 幾何著色器的操作對象是圖元,包括一維的點(diǎn)圖元,二維的線圖元,三維的三角形圖元。幾何著色器利用內(nèi)置變量gl_VerticesIn獲取當(dāng)前的圖元的維數(shù),從而獲得圖元的每個元素的數(shù)值。并且?guī)缀沃饕笥脩糁鲃釉O(shè)置輸入和輸出圖元的性質(zhì)。
OpenGL著色器在渲染管線中的位置和作用如圖2所示。
圖2 OpenGL著色器渲染流程Fig.2 Flowing chart of OpenGL Shader
頂點(diǎn)著色器可以完成頂點(diǎn)替代、法線變換、生成和變換紋理坐標(biāo)、光照及材質(zhì)應(yīng)用的功能;片元著色器則可以實(shí)現(xiàn)替代紋理、霧化、像素匯總的功能;幾何著色器在圖元裝配的過程中生成新的圖元。
文中利用Perlin噪聲作為驅(qū)動源,擾動輸入的水面圖片,再通過OpenGL渲染語言進(jìn)行圖片中片元法線、顏色操作等,便可形成比較真實(shí)的水面。
首先創(chuàng)建一個幾何平面,然后把將要當(dāng)做水面紋理的純色圖片映射到幾何平面上,作為動態(tài)水面的初始高度場。采用此種方法,可以把三維立體波浪的求解過程變換為對二維平面擾動來求解波浪面。從而較求解傳統(tǒng)波動方程,可以大大簡化計算過程和減少工作量。
在文中,高度場是由Perlin噪聲擾動紋理數(shù)據(jù)來形成的,紋理上的相應(yīng)點(diǎn)的高度值是隨著噪聲控制點(diǎn)的變化趨勢而變化的。其波動方程可表示為:
其中x,y為水面相應(yīng)點(diǎn)的橫坐標(biāo)與縱坐標(biāo),t代表當(dāng)前時刻,則 Z(t)表示在噪聲的擾動下,坐標(biāo)(x,y)處點(diǎn)的高度值。當(dāng)Z(t)=0 時,表示該點(diǎn)處于水平面狀態(tài),當(dāng) Z(t)不等于 0 時,則表示該點(diǎn)處于已形成的水波面上。對于該水面,以一定的間距把水面分割為有點(diǎn)的網(wǎng)格面,本文中以1為單位,使得相鄰的網(wǎng)格點(diǎn)組成單位矩形面,在網(wǎng)格點(diǎn)上,根據(jù)公式1即可求得其對應(yīng)坐標(biāo)的數(shù)值,不在網(wǎng)格點(diǎn)上的點(diǎn)數(shù)值則由相鄰的點(diǎn)插值得到。其插值過程如下。
對于任意一點(diǎn)的I(x,y),由包圍它的四個點(diǎn)進(jìn)行插值,這四個點(diǎn)分別為 N([x],[y]),N([x]+1,[y]),N([x],[y]+1),N([x]+1,[y]+1),為了得到平滑的效果,在插值之前,先對這四個點(diǎn)進(jìn)行平滑。平滑按照Perlin噪聲的平滑公式進(jìn)行平滑,以N([x],[y])點(diǎn)為例,得到的結(jié)果為:
用同樣的方法可以求得其他 3 個點(diǎn) N([x]+1,[y]),N([x],[y]+1),N([x]+1,[y]+1)的數(shù)值,然后利用得到的平滑后的點(diǎn),分別在X,Y方向上進(jìn)行余弦插值。
余弦插值公式為:
其中a,b代表根據(jù)公式2求得的各個網(wǎng)格點(diǎn)的平滑結(jié)果,x代表網(wǎng)格點(diǎn)與相應(yīng)點(diǎn)在X方向的距離,即可看做在插值中,各網(wǎng)格點(diǎn)對待插值點(diǎn)的貢獻(xiàn)值。
設(shè)在 X 方向的插值結(jié)果分別為 F1(x,y),F(xiàn)2(x,y)。
利用這兩個結(jié)果再在Y方向上進(jìn)行插值,即得到I(x,y)處的數(shù)值。
其中y代表待插點(diǎn)與相應(yīng)點(diǎn)在Y方向的距離。經(jīng)過此項插值可獲得平滑的水面高度場,此時可得到平滑動蕩的水面,此時的水面還沒有具備水面的特性,既沒有反射、映射等效果。接下來通過水面法線等計算來實(shí)現(xiàn)以上效果。
文中法線的計算是以網(wǎng)格中單位矩形為單位面片的。
所以該單元面的法線為:
隨著水面的波動,各個單元面的法向量也隨著變化,由于各個單元面的法向量不同,所以就出現(xiàn)了明暗不同的效果。再通過OpenGL渲染語言對生成的水面進(jìn)行渲染,對法線進(jìn)行實(shí)時更新,實(shí)時計算各個面的法線,同時根據(jù)網(wǎng)格中每個點(diǎn)的高度來調(diào)節(jié)點(diǎn)的顏色值,使得不同高度的點(diǎn)呈現(xiàn)出不同的顏色值,從而實(shí)現(xiàn)接近真實(shí)水面的色調(diào)。
本文中的反射效果根據(jù)OSG中的模板緩存[9]來實(shí)現(xiàn)的。根據(jù)鏡面反射[10]原理,在繪制虛擬環(huán)境實(shí)體時,還要對它施加矩陣變換來實(shí)現(xiàn)關(guān)于鏡面的對稱影像。然后將鏡面影像寫入模版緩存,以防止超出鏡面范圍的鏡像被顯示。然后根據(jù)反射原理求得觀察景物倒影視線與水面的范圍,將景物倒影進(jìn)行投影變換,映射到水面的可視范圍,從而對影像與水面混合繪制。隨著視點(diǎn)位置的變化,對倒影的可視區(qū)域位置也會發(fā)生變化,在此重新對倒影進(jìn)行投影變換,從而獲得真實(shí)水面影像。
圖3 反射原理Fig.3 Principle of reflection
圖4 動態(tài)水面效果圖Fig.4 Flowing warter surface
對動態(tài)水面的模擬始終是虛擬現(xiàn)實(shí)領(lǐng)域研究的重點(diǎn)之一,本文利用Perlin噪聲擾動水面紋理形成水面高度場,同時在 OSG基礎(chǔ)上利用OpenGL Shader渲染語言進(jìn)行水面渲染,并且實(shí)現(xiàn)實(shí)時的水面映射效果的方法,具有原理簡單,計算量小的特點(diǎn)。克服了利用傳統(tǒng)高分辨率網(wǎng)格創(chuàng)建水面方法計算量大的缺點(diǎn)。本方法形成的動態(tài)水面可以與三維地形等模型一起渲染,可以得到很好的整體效果。
[1]Peachey D.Modeling waves and surf[J].Computer Graphics,1986,20(4):65-74.
[2]Fournier A,Reeves W T.A simple model of ocean waves[J].Computer Graphics,1986,20(4): 75-84.
[3]Foster N,Metaxas D.Realistic animation of liquids[J].Graphical Models and Image Processing,1996,58(5):471-483.
[4]Perlin K.An image synthesizer[J].Computer Graphics,1985,19(3):287-296.
[5]Johanson C.Real-time water rendering-Introducing the projected grid concept[M].Sweden:Department of Computer Science,Lund University,Master dissertation,2004.
[6]楊懷平,孫家廣.基于海浪譜的波浪模擬[J].系統(tǒng)仿真學(xué)報,2002,14(9):1175-1178.
YANG Huai-ping,SUN Jia-guang.Waves simulation based on the wave spectrum of ocean.Journal of System Simulation,2002,14(9):1175-1178.
[7]李廣鑫,丁振國,詹海生,等.一種面向虛擬環(huán)境的真實(shí)感水波面建模算法 [J].計算機(jī)研究與發(fā)展,2004,41(9):1580-1585.
LI Guang-xin,DING Zhen-guo,ZHAN Hai-sheng,et al.A modeling algorithm for realistic water surface simulation in virtual environment[J].Journal of Computer Research and Development,2004,41(9):1580-1585.
[8]宋利,周源華,周軍.基于Fourier合成技術(shù)的水波動畫[J].計算機(jī)工程與應(yīng)用,2002,(6):10-11.
SONG Li,ZHOU Yuan-hua,ZHOU Jun.Waves animation based on fourier synthesis[J].Computer Engineering and Applications,2002,(6):10-11.
[9]曹莉,李紹彬,申閆春.基于OSG的鏡面反射特效的實(shí)現(xiàn)[J].計算機(jī)仿真,2009,26(8):208-211.
CAO Li,LI Shao-bin,SHEN Yan-chun.Implementation of mirror reflection effect based on OSG[J].Computer Emulation,2009,26(8):208-211.
[10]馬駿,朱衡君,龔建華.基于Cg和 OpenGL的實(shí)時水面環(huán)境模擬[J].系統(tǒng)仿真學(xué)報,2006,18(2):395-340.
MA Jun,ZHU Heng-jun,GONG Jian-hua.Simulation of realtime water surface based on Cg and OpenGL[J].Journal of System Simulation,2006,18(2):395-340.