陳華光,王京文
(湖南工程學(xué)院 計算機與通信學(xué)院,湘潭 411101)
近年來,自然現(xiàn)象中云彩的建模和渲染越來越成為計算機圖形學(xué)中最具挑戰(zhàn)性的研究方向之一,這是由云形成物理過程的復(fù)雜性、形狀的不規(guī)則、變化的實時性等因素決定的.對云的生成仿真研究有著重要的現(xiàn)實意義.云的模擬在戰(zhàn)場環(huán)境仿真,氣象條件的仿真、視景仿真系統(tǒng)、計算機游戲、三維動畫、影視及廣告中有著廣泛的應(yīng)用.
目前形成的對云的仿真方法多種多樣,從云建模方法看大體可以分為以下幾類[1]:基于物理的建模方法[2],試圖通過仿真生成云的氣象學(xué)過程和光與云的相互作用來建立云的模型.基于個體生長的建模方法:包括基于分形的云建模方法[3],基于過程的建模方法[4]等.但這些方法的主要目的在于生成靜止的云,難以產(chǎn)生動態(tài)的具有現(xiàn)實意義的云.兩種方法的結(jié)合:Y Dobashi等人用細(xì)胞自動機的方法將云的生成模型進行了簡化,生成了動態(tài)的積狀云[5].R Miyazaki等人在此基礎(chǔ)上用CML方法研究了層云和積云的三維生成,但計算代價仍需進一步降低.
本文先介紹Perlin噪聲的構(gòu)造,給出靜態(tài)云圖像的算法;然后討論不重復(fù)運動云彩的生成算法和云彩平滑變形的生成算法,最后將云彩置入虛擬環(huán)境中,進行了云的動態(tài)模擬.結(jié)果表明:本文實現(xiàn)動態(tài)云的方法實現(xiàn)簡單,在現(xiàn)行的PC機上可獲得實時、逼真的動態(tài)云效果.
本文用Perlin噪聲構(gòu)造2維云圖.將云圖平面劃分為有m×n個控制點的噪聲控制點陣列.設(shè)平滑噪聲函數(shù)為 Noise(x,y),其輸入?yún)?shù)為點I(x,y)的坐標(biāo)值.假設(shè)I(x,y)落在4個相鄰噪聲控制點C(i-1,j-1),C(i,j-1),C(i-1,j)和C(i,j)所圍成的區(qū)域內(nèi),其中i,j為整數(shù),并且1≤i≤m,1≤j≤n.先計算從每個相鄰控制點到I(x,y)的向量與該控制點的梯度的點積 :
圖1 Perlin噪聲
設(shè)u和v分別為x和y的小數(shù)部分,在x方向上對d1和d2,d3和d4分別進行3次調(diào)和插值 :
最后在y方向上對s1和s2進行3次調(diào)和插值,就得到了二維平滑噪聲函數(shù)的表達式為
得到一個平滑的噪音函數(shù)后,按照公式(4)改變該噪音函數(shù)的振幅(amplitude)和頻率(frequency)構(gòu)造出若干新的噪音函數(shù)[5]Noise(x,y)
式中,i是第i個被相加的平滑噪音函數(shù),它反映了perlin噪聲函數(shù)的細(xì)致程度.通常persistence取2n,n可以隨意取值,它的大小決定了Perlin噪聲函數(shù)的振幅,n越小,Perlin噪聲函數(shù)的形態(tài)越平緩.本文定義了振幅值是隨頻率變化的,將這些噪音函數(shù)進行疊加,就構(gòu)造出PerlinN噪音函數(shù)為[5]
為了便于編程計算,本文采用公式(6)作為PerlinN噪音函數(shù)
這里使用矩形區(qū)域作為研究對象來描述使用Perlin噪聲生成云的過程.用公式(6)計算每個網(wǎng)格點Perlin噪聲值,用噪聲值作為云的灰度,從而得到了兩維云圖的灰度圖像.N越大,灰度變化的連續(xù)性就越強,但運算量也隨之增多,一般計算時取N為5~8,圖2就是取N=6的結(jié)果.
圖2所示的云圖像比較模糊,和真云圖像有區(qū)別,可進一步用指數(shù)函數(shù)對云的灰度進行銳化.指數(shù)函數(shù)的公式為[6]
其中Cloudcover為控制云復(fù)蓋天空密度的參數(shù),值越大,云復(fù)蓋天空密度就越小,取值0~255,本文取90~140.參數(shù)cloudsharpness與云銳化程度有關(guān),取值為0~1,取值較小,云比較稠密,取值接近為1,云比較稀薄,本文取值0.90~0.98.C必須大于或等于0;vcolor為Perlin噪聲計算得到的云的灰度.ecolor為銳化后的灰度值.圖3是Cloudcover取值120,cloudsharpness取值0.95的結(jié)果.
藍(lán)天白云是虛擬現(xiàn)實中應(yīng)用最廣,也是云彩變化最豐富的一種景象.實現(xiàn)藍(lán)天白云云彩圖像的步驟是將圖像中的灰色背景用閾值篩選法變換成藍(lán)色背景.所謂灰度閾值篩選法是將圖像中灰度值小于閾值的顏色換成藍(lán)色,如果直接用灰度閾值篩選法實現(xiàn),則篩選之后云彩邊緣的一些霧化效果就消失了,不太逼真.本文通過HLS顏色模型將銳化后得到的灰度云圖像轉(zhuǎn)化為逼真的藍(lán)天白云效果.HLS顏色系統(tǒng)是用色調(diào)(Hue)、亮度(Light)和色飽和度(Saturation)三個值來表示一種顏色.由于計算機的顯示設(shè)備采用RGB顏色系統(tǒng),所以需要用兩個顏色函數(shù)完成RGB→HLS,HLS→RGB的顏色轉(zhuǎn)換.用HLS顏色系統(tǒng)實現(xiàn)顏色替換的步驟如下[8].
(1)從用戶提供的背景色(天空的RGB顏色)轉(zhuǎn)化為HLS顏色(Hsky、Lsky、Ssky三分量).
(2)從黑白灰度云彩圖像中的提取顏色值作為L,由(Hsky,Lsky,Min(start+L/3,240))得到一個HLS顏色值,這里start是一個常量值,主要是為了跳過HLS顏色中的黑色部分.
(3)把上一步得到的HLS顏色值轉(zhuǎn)化為RGB值,用此RGB作為顏色繪制像素點.
圖4就是對圖3進行顏色替換的結(jié)果.
上述方法可由用戶輸入?yún)?shù)來生成形狀不同、非常逼真的云圖,但云圖是靜止不動的,在此基礎(chǔ)上可進一步生成動態(tài)云圖.
當(dāng)前許多的自然景物模擬運動采用的都是圖形循環(huán)的方式,將一幅云圖沿著某一軌跡運動,在一個方向走到圖的邊緣以后,再返回到圖的開始地方,觀察者會感覺到動態(tài)演示的是一個不斷重復(fù)的狹小的圖形,缺少自然真實感.本文提出的無限不重復(fù)運動生成算法,可生成任意給定長度的云圖.設(shè)屏幕顯示窗口寬度為W,高度為H;首先生成寬為2W,高度為H的靜態(tài)云圖,云圖以速度v向左運動,上述右邊W×H的圖像在時間為t=W/V內(nèi)將到顯示框,即完成一幀圖像的顯示.為了運動繼續(xù),在完成一幀圖像的顯示之前,在右邊生成大小為W×H并與左邊圖像連續(xù)的靜態(tài)云圖.不斷循環(huán),達到連續(xù)而不重復(fù)的運動效果.算法描述如下:
步驟(1):將運動云彩分成由若干個W×H的矩形組成,為了能實現(xiàn)紋理映射,寬(W)和高(H)尺寸分別為2的整數(shù)次冪+1,每個矩形對應(yīng)一幀圖像.在內(nèi)存中開辟一個計算區(qū),即定義一個大小為2W×H的數(shù)組用來計算第i幀云彩的圖像;再開辟一個顯示區(qū),即定義一個大小為2W×H的數(shù)組來存放要顯示的第i幀云彩的圖像.
步驟(2):產(chǎn)生第1和第2個矩形的偽隨機梯度,放入計算區(qū),用計算靜態(tài)云彩的方法計算第1幀圖像的云彩的圖像;
步驟(3):從i=1開始,將計算機區(qū)的結(jié)果存放顯示區(qū),在時間為t=W/V內(nèi)完成第i幀圖像的云彩的顯示,同時產(chǎn)生第i+2個矩形的偽隨機梯度;將第i+1個矩形的偽隨機梯度和i+2個矩形的偽隨機梯度合并放入計算區(qū),用計算靜態(tài)云彩的方法計算第i+1幀圖像的云彩的圖像;
步驟(4):重復(fù)(3)直到運動結(jié)束.
如果只有云圖產(chǎn)生的動態(tài)平移運動,不能逼真自然界云彩的運動,云彩在運動時結(jié)構(gòu)常常發(fā)生變化,產(chǎn)生云彩形運動.運動云彩結(jié)構(gòu)平滑變形的生成方法是:首先產(chǎn)生L幅靜態(tài)云圖,為使云彩結(jié)構(gòu)連續(xù)平穩(wěn)變化,避免抖動、跳躍現(xiàn)象,通過插值將兩幅靜態(tài)云圖之間劃分成K等份,得到K幅靜止插值云圖,再按順序進行快速顯示,達到結(jié)構(gòu)變形運動云彩的效果.
運動云彩平滑變形的生成算法如下:
步驟(1):生成M幅W×H的靜止云彩算法生成的云圖,W為2n+1,n為正整數(shù);
步驟(2):顯示第i幅靜止云圖Fi(u,v),1≤i≤M;
步驟(3):在i到i+1兩幅云圖Fi(u,v)和Fi+1(u,v)中間,插值生成k幅云圖;
①生成第j幅插值算法生成的云圖,1≤j≤K;
③顯示第j幅插值算法生成的云圖Fj(u,v);
④轉(zhuǎn)①繼續(xù)處理,直到j(luò)>K.
步驟(4):轉(zhuǎn)步驟(2)繼續(xù)處理,直到i>M.
本文采用紋理映射方法,將Perlin噪音生成的云的圖像映射到虛擬環(huán)境中.具體做法是用VC和OpenGL進行編程實現(xiàn)生成虛擬環(huán)境,用半球形當(dāng)成天空,將本文云生成的圖像映射到天空上.在硬件基本配置為2.83GHz CPU,4GBHz內(nèi)存,顯存為1G顯卡的計算機上仿真,設(shè)置象素模式為1280×800,測試基本可達到50~70左右的幀頻.其運動效果圖如圖5所示.
圖5 虛擬環(huán)境中運動的云圖
本文給出的靜止云彩和動態(tài)云彩的生成算法簡捷有效,改進了目前的常用算法.在靜止云彩的生成算法中,只要改變幾個控制參數(shù),就能生成不同類型的云彩;無限不重復(fù)運動云彩的生成算法得到的任意長度的云圖,分幀顯示運動效果明顯;云彩平滑變形的生成算法能快速輸出插值得到的云圖,云彩結(jié)變化非常平穩(wěn).可用于普通的PC平臺上,它們在虛擬環(huán)境可視化系統(tǒng)的研制開發(fā)中將起著重要的作用.
[1]朱長征,諶海新.云建模方法現(xiàn)狀、發(fā)展趨勢及在軍事領(lǐng)域的應(yīng)用[J].計算機應(yīng)用,2003,23(9):22-24.
[2]Taxen G.Cloud Modeling for Computer Graphics[M].Royal lmtitute of Technology,Stockholm,Sweden,1999.
[3]T Nishita,Y Dobashi,E Nakamae.Display of Clouds Taking into Account Multiple Anisotropic Scattering and Sky Light[C].Proc.SIGGRAPH96,1996:379-386.
[4]D S Ebert.Volumetric Modeling with Implicit Functions:A Cloud is Born[C].Visual Proc.SIGGRAPH97,1997:147.
[5]S.Liu,R.Huang,Z,Wang,et al.Texture Advection Based Simulation of Dynamic Cloud Scene,Proc.of CAD/Graphics,2007:144-149.
[6]陳華光,王京文,張曉清.基于Perlin噪聲的云生成系統(tǒng)[J].微計算機應(yīng)用,2008,29(2):63-65.
[7]陳 鋒,姚俊峰,過程紋理實現(xiàn)動態(tài)云層[J].系統(tǒng)仿真學(xué)報,2007,19(2):218-220.
[8]石教英.計算機圖形學(xué)的算法基礎(chǔ)[M].彭群生[譯].北京:機械工業(yè)出版社,2002:481-483.