唐 勇,吳國倩,郭慧玲,3,陶建新,4
1(燕山大學 信息科學與工程學院,河北 秦皇島 066004)2(河北省計算機虛擬技術(shù)與系統(tǒng)集成重點實驗室,河北 秦皇島 066004)3(河北環(huán)境工程學院 信息工程系,河北 秦皇島 066102)4(燕山大學 信息技術(shù)中心,河北 秦皇島 066004)
天空是自然景觀的重要組成部分,其中云又是不可或缺的.在虛擬環(huán)境中繪制逼真的云能夠提升視覺效果,增強用戶的沉浸感.由于云復雜的物理結(jié)構(gòu),導致其擁有復雜多變的熱力學特征以及豐富的光學特性,使得模擬云成為計算機圖形學的一大研究熱點與難點.
近些年來,國內(nèi)外許多研究人員致力于模擬真實且實時的云.在建模方面,2003年,M.J.Harris使用精準的物理模型并結(jié)合GPU很好地模擬了動態(tài)云[1],大量的計算使得其并不適用于大規(guī)模的云繪制,此外在云外形的控制上有所欠缺.2004年,Wang提出了一種可控的云建模方法[2],很好地解決了云模型難以控制的問題.2010年,Eric M.Upchurch采用三維細胞自動機為模擬空間,應用從真實圖像中捕獲的云紋理[3],由于這種方法在繪制時不會進行真正的照明技術(shù),因此真實感受到了很大的限制.2013年,唐勇[4]等人利用物理的建模方法生成了動態(tài)的云,但類型單一.2014年,北海道大學Y Dobashi提出一種通過照片控制生成云的形狀以及顏色的方法[5],由于照片中云形狀的單一性,決定了生成的云的單一性,并且由于輸入信息是二維的,所以用戶只能在特定的視點觀看.2015年,Prashant Goswami采用物理方法,通過云間的壓力、粘度等參數(shù)計算直觀地控制云的整個生命周期[6],大量的計算使得該方法不得不減少對云的細節(jié)繪制,降低了云的視覺效果.2016年,上海交通大學的Akila Elhaddad引入L-J勢能函數(shù)從微觀的角度來簡化云粒子運動的物理過程[7],通過調(diào)節(jié)云粒子的距離來實現(xiàn)云間的相互運動,但是粒子運動時距離過大或過小都會出現(xiàn)混亂的狀態(tài).在光照方面,2008年,Bouthors等人采用BRDF方法求解含有面片的云表面光照[8],但不能進行動態(tài)的模擬.
目前的云模擬算法中,主要集中于優(yōu)化單一繪制方法改進云的繪制效果,但對于不同高度的形態(tài)各異云的特征表現(xiàn)不夠理想.因此,本文提出一種劃分云層的策略,根據(jù)不同的海拔高度條件,調(diào)整模擬方法,繪制出不同類型的云的細節(jié)特征;另外,在不改變云整體運動趨勢的前提下,構(gòu)建一個與云的位置、視點距離等相關(guān)的速度函數(shù),加在原有的速度場上來增強云層的飄動效果,避免同步移動的現(xiàn)象,以達到更真實的模擬效果.
為了能夠模擬出不同海拔高度下,不同類型云之間的特征差異,本文通過云層劃分的方法,在縱向上按照云模型的需求劃分為不同層次、不同類型的云,極大地提高了云的真實感.
云是一種極具不規(guī)則性以及不確定性的物質(zhì),通過單一的數(shù)學模型很難對其復雜外部形狀進行建模.為了使整個云層能夠同時實現(xiàn)真實感的模擬,在實際繪制中,本文根據(jù)氣象學規(guī)律,以2500米為高度線,將云層劃分為低層云、中高層云,并且在不同的區(qū)域使用相適應的方法構(gòu)建云模型.
粒子系統(tǒng)自身多變的特性使得可以生成不同形態(tài)的云.本文在粒子系統(tǒng)的基礎上,引入Perlin噪聲,利用兩種方法分別在不同區(qū)域內(nèi)建立云模型.具體的建模過程如圖1所示.
圖1 構(gòu)建云模型的流程圖Fig.1 A flow chart for building a cloud model
1)根據(jù)海拔高度得到區(qū)域值X,確定云層所屬云層區(qū)
2)其次,根據(jù)云層區(qū)域的不同,選擇相適應的繪制方法:
a.一方面,設定云粒子的速度、質(zhì)量、顏色、生命值,并添加RGBA形式的紋理,隨機生成紋理的透明度;另一方面,對該區(qū)域施加一個新的速度場.
b.繪制3DPerlin噪聲云,插值平滑,擴展噪聲.
3)判斷繪制的云是否到達繪制邊界.如果達到邊界,則在邊界處對云進行消散處理;如果尚未達到邊界則循環(huán)執(zhí)行步驟1)、2)、3).
單純使用粒子系統(tǒng)生成的云團,在天空中顯得突兀,為了消除這種現(xiàn)象,引入Perlin噪聲構(gòu)造三維云,增加云的層次感,增強真實感.
Perlin噪聲也可以說是梯度噪聲[9],這意味著需要在空間中相鄰間隔點之間插值以達到平滑的效果.設定點P(x,y,z)為空間中要繪制的某一點,給定點P四周的網(wǎng)格點處的噪聲值,通過計算每個網(wǎng)格點的梯度向量和給定點到網(wǎng)格點向量的點積,并利用函數(shù)對它們進行三次插值后得到最終結(jié)果.具體的插值方法如下:
第一次插值:
nx00=n000(1-f(u))+n100f(u)
(1)
nx10=n010(1-f(u))+n110f(u)
(2)
nx01=n001(1-f(u))+n101f(u)
(3)
nx11=n011(1-f(u))+n111f(u)
(4)
第二次插值,將公式(1)(2)所得結(jié)果進行插值,得到公式(5);將公式(3)(4)所得結(jié)果進行插值,得到公式(6):
nxy0=nx00(1-f(v))+nx10f(v)
(5)
nxy1=nx01(1-f(v))+nx11f(v)
(6)
第三次插值,同理得到公式(7):
nxyz=nxy0(1-f(w))+nxy1f(w)
(7)
其中,u=x-i,v=y-j,w=z-k,分別為點P(x,y,z)在X、Y、Z軸方向距離正方體的距離,(i,j,k)為點P所在立方體的左下角頂點坐標,n010、n010、n001、n011、n100、n110、n101、n111分別是離P點八個最近的網(wǎng)格點處的偽隨機梯度向量和點P到網(wǎng)格點向量的點積,f()為f(t)=6t5-15t4+10t3,nxyz為最后結(jié)果.
通過劃分云層區(qū)域的方法可避免使用同一種方法難以準確表達不同類型云的特征的問題,很好的展現(xiàn)云的多態(tài)性.
天空中云彩飄動極大的增強了場景的真實感.目前對于云彩飄動的模擬研究多集中于飄動現(xiàn)象本身,而鮮有對云飄動過程中云的相對位置變化做出探究.為了能夠更真實地模擬云彩飄動的效果,改進云速度單一的問題,本文通過在原有速度場基礎上增加一個可變的速度場來消除這種現(xiàn)象.
(8)
通過對云的速度進行修改,能夠有效地解決低云層整體飄動的問題,實現(xiàn)云的異速飄動.
虛擬場景中云的真實感離不開光照.云是一種大氣效果,由于嚴格按照大氣散射方法來模擬,計算量極大,渲染效率比較低[10],因此本文采用簡化的光照模型,只考慮天空環(huán)境光和太陽的定向光對云的光照影響.
Camb=(AV*CV0+(1-AV)*CV1)*(AT*CT0+(1-AT)*CT1)
(9)
為了能夠?qū)崿F(xiàn)黎明和黃昏的轉(zhuǎn)變,模擬時令云團面對太陽的區(qū)域接受較多的定向光,而背離太陽的區(qū)域則接受較少的定向光.對于云團中的任意一點,首先,計算出太陽到云團中心的矢量和頂點到云團中心的矢量,再計算出這兩個向量的點積.同樣通過選取指定的顏色值,利用插值的方法決定當前時間的方向顏色值,具體計算公式為:
Cdir=mappingfunc(Vvc·Vcs)
*(AT*CT0+(1-AT)*CT1)
(10)
一方面,根據(jù)顏色混合原理可知,云團中每個粒子最終的顏色值都是由環(huán)境光和太陽光顏色值累加得到,另一方面為了模擬云的耗散效果,在原有光的基礎上增加了Alpha值來控制粒子的透明度.如此最終的效果如公式(11)所表現(xiàn)的.其中Ctexture為云紋理的顏色.
C=(Camb+Cdir)*Ctexture*Alpha
(11)
把光照分為天空環(huán)境光和太陽光兩種,利用插值的方法簡化運算,極大地減少了計算量,有效的保證了繪制大規(guī)模云的實時性.
實驗基于Windows操作系統(tǒng),使用Unity3d建立了云的模擬仿真平臺.硬件環(huán)境為:Intel(R)Core(TM)i7 CPU 4790 3.60GHz,8G RAM,顯卡為ATI AMD Radeon R7 200 Series.
圖2為使用單一方法同使用兩種方法繪制的云的對比,展示了黃昏時刻云的俯視圖.其中圖2(a)為僅有Perlin噪聲模擬的云,圖2(b)為僅有粒子系統(tǒng)模擬的云,圖2(c)同時使用粒子系統(tǒng)和Perlin噪聲繪制不同類型云的場景效果,可以看出同時使用兩種方法能更好的展示天空中云的多樣性.
圖2 使用單一方法同使用兩種方法的繪制的云的對比Fig.2 Use a single method to compare the cloud with two methods of drawing
由于空中任意兩朵云的空間位置都不同,會受到不同大小、方向的風力影響,在空中飄動時相對位置會發(fā)生變化.圖3為處于不同空間位置的云隨時間推移其空間位置變化的情況,實現(xiàn)了不同空間位置的云異速飄動的效果.
圖3 隨時間推移云的相對位置變化(仰視圖)Fig.3 Relative position change of the cloud over time(bottom view)
圖4中黑色箭頭表現(xiàn)出由于太陽位置的不同,定向光的方向也不同,導致了云明暗位置的不同,分別展現(xiàn)了云在早晨、中午、傍晚、子夜四個不同時刻的光照下,呈現(xiàn)出不同色彩的效果.
圖4 不同時刻繪制的云Fig.4 Clouds drawn at different times
圖5為本文方法同文獻[4]、文獻[5]、文獻[7]實現(xiàn)效果的對比.其中,圖5(a)為文獻[4]生成的云,該方法生成的云類型單一;圖5(b)為文獻[5]生成的積云,該方法只能在豎直方向上控制云的生成過程,不能展示出多種云的特性和細節(jié);圖5(c)為文獻[7]生成的云層,由于系統(tǒng)本身的缺陷,導致云層易出現(xiàn)混亂;圖5(d)為本文方法生成的云,不僅能夠?qū)崿F(xiàn)中低云層的真實繪制,而且較高云層也能擁有很好的視覺效果.
為驗證劃分區(qū)域繪制云方法的可行性、實時性和有效性,表1通過幾組實驗同文獻[4,7]進行對比,可見文獻[4]在網(wǎng)格分辨率為64*64*64,云團數(shù)為1時幀率僅有33-35幀/秒,文獻[7]在最佳性能時,幀率只有9幀/秒,而本文算法繪制云的幀率普遍達到60幀/秒以上,能夠很好的滿足實時性的要求.
圖5 文獻[4]、文獻[5]、文獻[7]及本文中生成的云Fig.5 Clouds generated in literature [4]、[5]、 [7]and this paper
表1 本文同文獻[4,7]的數(shù)據(jù)對比
Table 1 Comparison between ours and [4,7]
實驗圖模擬方法粒子總數(shù)網(wǎng)格分辨率模擬域幀率(fps)圖3 粒子、128.9K-77圖4 Perlin噪聲208.1K-較大65圖5c 聲52.9K-90圖5a([4]) 網(wǎng)格-64?64?64小33-35圖5c左([7])粒子48.8K-較大9
在虛擬環(huán)境下云模擬仿真過程中,針對同一場景下不同高度的云不能同時實現(xiàn)較好模擬效果的問題,提出了一種劃分云層區(qū)域的實時仿真方法,在不同的云層區(qū)域采用不同的模擬方法;通過在云層區(qū)域增加一個可控的新速度場,避免了同步移動的問題,提高了仿真的真實性;同時利用簡單的光照模型實現(xiàn)了一天內(nèi)隨著時間的變化,云色彩的逐步變化.最后,本文將云模擬嵌入三維場景,通過幾組實驗驗證及與相關(guān)文獻工作的對比分析表明,所提出的方法能夠?qū)崿F(xiàn)多態(tài)云在虛擬環(huán)境下的實時仿真.今后我們將研究云在不同天氣狀況下的模擬問題,使云更加真實.