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