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