許金生,宋萬忠
(1.四川大學(xué) 計(jì)算機(jī)學(xué)院,四川 成都610064;2.四川大學(xué) 視覺合成圖形圖像技術(shù)國防重點(diǎn)學(xué)科實(shí)驗(yàn)室,四川 成都610064)
在虛擬現(xiàn)實(shí)仿真中,自然景物是不可或缺的場景組成內(nèi)容。雪是常見的自然景觀,雪的模擬可以提高視景的真實(shí)感,所以無論從現(xiàn)實(shí)意義的角度,還是從計(jì)算機(jī)仿真的角度,在視景中創(chuàng)建和研究雪景模擬均有重要的意義。目前,粒子系統(tǒng)是模擬自然環(huán)境中運(yùn)動物體非常有效的方法,Reeves于1983年首先提出粒子系統(tǒng)建模仿真的方法并被廣泛應(yīng)用。OpenSceneGraph圖形系統(tǒng)[1]是一個(gè)基于工業(yè)標(biāo)準(zhǔn)OpenGL的軟件接口,封裝并提供了數(shù)量眾多的提高程序運(yùn)行時(shí)性能的算法[2]。雪景模擬方面,研究者們已經(jīng)做了一定量的研究工作,文獻(xiàn) [3]中,對雪粒子的受力進(jìn)行了分析與建模,但是對雪粒子的運(yùn)動學(xué)描述進(jìn)行了相應(yīng)的簡化,沒有考慮到風(fēng)力對雪粒子的影響,而只是使用了隨機(jī)速度來簡化影響[3];文獻(xiàn) [4]中,利用與距離相關(guān)的概率函數(shù)考慮粒子的密度,只需要少量的粒子就可以模擬大量降雪的場景,但是粒子的屬性設(shè)置過于簡單,沒有設(shè)置粒子的重力、生命周期等屬性[4]。
本文基于粒子系統(tǒng)原理和OSG圖形庫,在分析粒子系統(tǒng)的一般原理基礎(chǔ)上,利用OSG圖形接口,提出了一種實(shí)時(shí)模擬雪景的算法。該算法分析了所采用的粒子模型的受力情況與初始屬性等,同時(shí)實(shí)時(shí)的改變每幀中風(fēng)速的大小和方向,并與前一幀中的風(fēng)速形成合力對雪粒子產(chǎn)生影響,更加符合真實(shí)情況。
粒子系統(tǒng)的基本思想是使用大量的、具有狀態(tài)和屬性的微小粒子來描述不規(guī)則的物體,通過對每個(gè)粒子屬性和狀態(tài)的改變進(jìn)行不規(guī)則物體運(yùn)動變化的仿真模擬。
粒子系統(tǒng)是一個(gè)動態(tài)的而非靜態(tài)的系統(tǒng),其動態(tài)變化過程就是眾多新粒子產(chǎn)生和舊粒子消亡的過程。系統(tǒng)中各個(gè)新生粒子在出生時(shí)都有各自的屬性 (如形狀、顏色、初速度等),并且這些屬性在各個(gè)粒子的生命周期中不斷的發(fā)生著變化[5-7]。粒子系統(tǒng)的動態(tài)運(yùn)行過程分為以下幾個(gè)步驟[8-9]:
(1)新的粒子出生并加入到系統(tǒng)中;
(2)新出生的粒子獲得各自的初始屬性;
(3)粒子的屬性動態(tài)更新;
(4)根據(jù)粒子的實(shí)時(shí)屬性進(jìn)行繪制并形成圖形;
(5)刪除死亡的舊粒子并取消顯示。
粒子系統(tǒng)的關(guān)鍵點(diǎn)是確定粒子的動態(tài)變化規(guī)律、粒子的初始屬性 (如形狀、顏色、初速度等)和粒子的繪制與刪除等。粒子系統(tǒng)中的這些關(guān)鍵點(diǎn)主要由各個(gè)具體的應(yīng)用場景來確定[10-11]。
OSG中建立粒子系統(tǒng)一般有兩種方式:一是讀取OSG預(yù)定義粒子系統(tǒng),加載具體的粒子效果至場景;另一種是建立自定義粒子系統(tǒng),創(chuàng)建特定效果至場景中。
OSG預(yù)定義的粒子效果都是從類osgParticle::ParticleEffect派生而來的。類中關(guān)系圖如圖1所示。
圖1 OSG預(yù)定義粒子系統(tǒng)類
這些類可以獨(dú)立的使用,直接加入到場景中就可以顯示相應(yīng)的效果。其中ExplosionDebrisEffect是爆炸物四濺的效果模擬;ExplosionEffect是爆炸的模擬;FireEffect是關(guān)于火光的模擬;Smoke(Trail)Effect是關(guān)于煙霧的模擬。此外,OSG中添加了一個(gè)osgParticle::osgPrecipitation新類,可以使用雨效、霧效和雪效等。
OSG自定義粒子系統(tǒng)的建立分為以下步驟:
(1)確定自定義粒子系統(tǒng)的整體意圖;
(2)使用osgParticle::Particle類,通過確定單個(gè)粒子的具體屬性來建立粒子模板;
(3)使用osgParticle::ParticleSystem類,通過確定粒子總體數(shù)量、屬性等來建立粒子系統(tǒng);
(4)設(shè)置發(fā)射器,使用osgParticle::Counter、osg-Particle::Placer、osgParticle::Shooter 和 osgParticle::Emitter等類設(shè)置粒子的發(fā)射屬性,出生地的位置方向,發(fā)射器的初速度,粒子發(fā)射的數(shù)目等;
(5)設(shè)置操作,利用osgParticle::Operator等類進(jìn)行旋轉(zhuǎn)度,風(fēng)力等因素的設(shè)置;
(6)加入結(jié)點(diǎn),更新。
關(guān)系圖如圖2所示。
使用OSG預(yù)定義的粒子系統(tǒng)來描述雪景時(shí),使用osg-Particle::PrecipitationEffect類的void snow (float intensity)來設(shè)置雪景的密度大??;使用void setWind(const osg::Vec3&wind)接口來設(shè)置場景中風(fēng)速的方向和大小,同時(shí)可以利用接口osg::Fog*getFog()來設(shè)置場景霧效,增加場景效果。
圖2 OSG自定義粒子系統(tǒng)類
利用osgParticle::PrecipitationEffect類,還可以設(shè)置粒子的大小、顏色、粒子出生速度、最大粒子密度、粒子透明度、雨模擬、霧的顏色等等??梢栽趯?shí)際使用中,加載需要的效果至場景中,例如可以在場景中同時(shí)添加雪效和霧效,并設(shè)置雪效和霧效不同的顏色、密度等。
2.2.1 自定義OSG粒子數(shù)學(xué)模型分析
OSG環(huán)境中,坐標(biāo)軸與OpenGL中坐標(biāo)軸不同。粒子系統(tǒng)中,新生粒子位于屏幕上方的圓型區(qū)域內(nèi),如圖3所示。粒子出生時(shí)賦予每個(gè)粒子不同的隨機(jī)初始參數(shù)。對于每個(gè)粒子而言,其實(shí)際意義是其每幀的位置和速度,如圖4所示。
式中:f1——粒子受到的重力,f2——粒子受到的浮力,f3——粒子受到的風(fēng)力,f4——不同粒子之間的相互作用力,f5——粒子下降過程中受到的空氣摩擦力。粒子所受其合力fsum決定了雪粒子的運(yùn)動軌跡[12-14]。
粒子的當(dāng)前速度可以通過粒子在上一幀中的速度和粒子當(dāng)前的加速度求得,可以用式 (2),(3)對粒子在當(dāng)前的速度和位置表達(dá)
式中:v0——上一幀的速度,v1——當(dāng)前速度,p0——上一幀的位置,p1為粒子的當(dāng)前位置,dt——一幀的時(shí)間間隔。若v0的方向角為 (θ1,θ2,θ3),則式 (2), (3)可展開為標(biāo)量形式
粒子的實(shí)時(shí)位置由時(shí)間間隔和粒子的實(shí)時(shí)速度決定,其標(biāo)量式如下
將式 (4)代入即可求得粒子的位置變化[15]。
2.2.2 自定義OSG粒子的具體設(shè)置
使用自定義的粒子系統(tǒng)來描述雪景的時(shí)候,需要設(shè)置粒子的各種基本屬性,如粒子模板、發(fā)射器、粒子更新器等,將設(shè)置好的屬性加入到場景中,實(shí)現(xiàn)自定義效果。其中,粒子的各種基本屬性設(shè)置如下:
生命周期:void setLifeTime(double t),設(shè)置粒子生命周期,以秒為單位,若t小于0,則粒子永不消失。
粒子尺寸:void setSizeRange (const rangef &r),設(shè)置粒子的最大最小尺寸,只對多邊形形態(tài)適用。
粒子透明度:void setAlphaRange (const rangef&r),設(shè)置粒子生命周期中透明度的變化范圍。
粒子半徑:void setRadius(flota r),設(shè)置粒子半徑大小。
粒子顏 色:void setColorRange (const rangev4&r),設(shè)置粒子生命周期中顏色變化范圍。
粒子重量:void setMass(float m),設(shè)置粒子的重量,在雪景模擬中配合重力顯示雪效的下降過程。
粒子屬性:void setDefaultAttributes,設(shè)置粒子的紋理、光滑度、發(fā)光度等屬性來顯示自定義的粒子系統(tǒng),在模擬系統(tǒng)中使用自定義的紋理來顯示雪花。
發(fā)射器:設(shè)置粒子系統(tǒng)的發(fā)射器,包括粒子系統(tǒng)的osgParticle::Counter、osgParticle::Placer、osgParticle::Shooter等類。設(shè)置粒子每秒產(chǎn)生的數(shù)目、粒子出生點(diǎn)的位置、粒子出生的范圍和角度、粒子出生的初速度以及出生的朝向等。在本模擬場景中,使用SectorPlacer環(huán)形發(fā)射源和0-2*osg::PI的角度來模擬初生雪粒子,具體的初速度、粒子數(shù)目等參數(shù)來模擬雪效。
影響操作設(shè)置:設(shè)置粒子的向下引力、氣流作用等。在本模擬場景中,void setToGravity()使用默認(rèn)的重力值為9.80665f來模擬地球重力,使用void setFluidToAir()來模擬空氣條件。
本文中具體的接口選擇和參數(shù)設(shè)置如表1所示。
實(shí)際的自然現(xiàn)象中,雨雪天氣常常伴隨著風(fēng)的吹動。雪的下降過程不是固定的方向和速度,雪的下降經(jīng)常左右擺動,由于雪的重量很輕,有時(shí)候甚至?xí)霈F(xiàn)向上擺動的情況。OSG預(yù)定義場景中只能使用接口void setWind(const osg::vec3&wind)設(shè)置風(fēng)向,這樣設(shè)置的風(fēng)向是固定不變的。因此需要在自定義的場景中,設(shè)置不同的風(fēng)向和風(fēng)速對雪粒子的下降過程產(chǎn)生影響。
在模擬程序的主循環(huán)中,在每一幀場景viewer.frame()前對風(fēng)速進(jìn)行設(shè)置。使用getOperator()得到之前設(shè)置風(fēng)速的operator,同時(shí)利用隨機(jī)函數(shù)進(jìn)行風(fēng)速的隨機(jī)產(chǎn)生,將新產(chǎn)生的風(fēng)速和通過接口getWind()得到的前楨風(fēng)速進(jìn)行疊加,疊加的風(fēng)速通過接口setWind()添加至影響操作設(shè)置的osgParticle::Program中,這樣產(chǎn)生的風(fēng)速是隨機(jī)風(fēng)速和前幀風(fēng)速的合力作用結(jié)果,符合現(xiàn)實(shí)情況,可以模擬出雪粒子下降過程中風(fēng)對雪粒子的影響。
表1 自定義粒子參數(shù)
其中風(fēng)速的隨機(jī)產(chǎn)生對雪粒子的下降影響很大,經(jīng)過實(shí)驗(yàn),本模擬系統(tǒng)中利用osg::Vec3((((float)rand()/(float)RAND_M(jìn)AX)-0.5)*0.5,(((float)rand ()/(float)RAND_M(jìn)AX)-0.5)*0.5,(((float)rand ()/(float)RAND_M(jìn)AX)-0.5)*0.2)來產(chǎn)生模擬的風(fēng)速達(dá)到較好的效果。
本文在CPU為Intel(R)Pentium (R)4 3.00GHz,內(nèi)存DDR 1GB,顯卡Intel(R)82946GExpress Chipest Family的普通PC上進(jìn)行仿真模擬。圖5、6為預(yù)定義雪景和自定義雪景的場景效果圖。
圖5 預(yù)定義雪景 (intensity為0.005)
可以看出,預(yù)定義的雪景模擬中,雪花的各種屬性設(shè)置比較固定,效果相對自定義的雪景模擬不太逼真,優(yōu)點(diǎn)是代碼簡單,生成快速,適合對細(xì)節(jié)要求不高的環(huán)境使用。自定義粒子系統(tǒng)中,各種屬性設(shè)置參數(shù)較多,代碼復(fù)雜,但是效果逼真,情景真實(shí),適合對細(xì)節(jié)要求嚴(yán)格的環(huán)境使用。
圖6 自定義雪景 (粒子參數(shù)見表1)
OSG環(huán)境下,設(shè)置其他不同的參數(shù)同樣會導(dǎo)致不同的場景效果。例如,void setMass(float m)和void setToGravity ()分別設(shè)置粒子的重力和系統(tǒng)的重力,配合使用才能實(shí)現(xiàn)合適的效果;void setNumberOfParticlePerSecondToCreate (double numPerSecond)和void setLifeTime(double t)分別設(shè)置場景中每秒產(chǎn)生的粒子數(shù)目和粒子的生存時(shí)間,配合設(shè)置可以決定場景中的粒子總數(shù)等。因此,可以利用OSG豐富的接口來定義不同的例子模型,滿足不同的場景需求,結(jié)果證實(shí)了該方法可以得到比較理想的效果。
基于粒子系統(tǒng)原理和OSG粒子系統(tǒng)的雪景仿真模擬是利用OSG粒子系統(tǒng)來進(jìn)行仿真模擬的一個(gè)縮影。本文使用OSG圖形開發(fā)包進(jìn)行模擬仿真,利用自定義粒子系統(tǒng),根據(jù)粒子物理運(yùn)動規(guī)律,實(shí)時(shí)模擬降雪的效果,并在三維場景中實(shí)時(shí)應(yīng)用,達(dá)到逼真的自然效果。三維仿真模擬是一項(xiàng)涉及面很廣的復(fù)雜工程,而且還有許多理論知識需要完善、許多技術(shù)難題需要解決,例如隨機(jī)函數(shù)的選擇,粒子系統(tǒng)屬性參數(shù)設(shè)定和具體實(shí)際情況相符合與否,場景的燈光、LOD等細(xì)節(jié)特效處理等,這些問題還有待深入研究。下一步的工作將根據(jù)本文中自定義的OSG粒子系統(tǒng)為總體框架,通過粒子系統(tǒng)中輸入?yún)?shù)的實(shí)時(shí)改變,開發(fā)出交互式的、實(shí)時(shí)的仿真粒子系統(tǒng),使之具有實(shí)際的現(xiàn)實(shí)應(yīng)用。
[1]Martz P.Open scene graph quick start guide [M/OL].New York:Skew Matrix Software LLC http://www.lulu.com/content/1164927,2007.
[2]YANG Shixing,CAO Mingliang.Step into open scene graph [EB/OL]. [2008-12-05].http://www.vrchina.net/bbs/viewthread.php?tid=2708.
[3]YU Chunxuan,WANG Lei.Real-time simulation of rain and snow based on driving simulator [J].Computer Engineering and Design,2011,32 (1):324-327 (in Chinese). [余春暄,王雷.基于汽車駕駛模擬器的實(shí)時(shí)雨雪效果模擬 [J].計(jì)算機(jī)工程與設(shè)計(jì),2011,32 (1):324-327.]
[4]HE Huaiqing,XUE Juntao.A new approach for simulation of snow falling and accumulating for large-scale terrain [J].Journal of Image and Graphics,2007,12 (9):1676-1681 (in Chinese).[賀懷清,薛軍濤.一種大場景環(huán)境下降雪和積雪仿真的新方法[J].中國圖象圖形學(xué)報(bào),2007,12 (9):1676-1681.]
[5]CHEN Huajie,YU Xiaoqing.Real-time simulation of rain and snow effect based on particle system and LOD [J].Computer Simulation,2008,25 (4):491-494 (in Chinese). [陳華杰,余小清.基于粒子系統(tǒng)與LOD技術(shù)的實(shí)時(shí)雨雪效果模擬 [J].計(jì)算機(jī)仿真,2008,25 (4):491-494.]
[6]XIAO He,HE Minggeng,BAI Zhongjian.Fountain simulation based on particle system in OpenGL [J].Computer Simulation,2007,24 (12):201-204 (in Chinese). [肖何,何明耕,白忠建.OpenGL中基于粒子系統(tǒng)的噴泉模擬實(shí)現(xiàn) [J].計(jì)算機(jī)仿真,2007,24 (12):201-204.]
[7]WANG Jiwen,HU Wenping,JIN Yufeng.8-word dynamic fireworks simulation based on particle system [J].Computer Simulation,2010,27 (10):211-214 (in Chinese).[汪繼文,胡文平,金余峰.基于粒子系統(tǒng)的8字動態(tài)煙花仿真 [J].計(jì)算機(jī)仿真,2010,27 (10):211-214.]
[8]XU Liming,JIANG Yuming.Realtime simulation of rain and snow based on particle system and OpenGL [J].Computer Simulation,2005,22 (7):242-245 (in Chinese).[徐利明,姜昱明.基于粒子系統(tǒng)與OpenGL的實(shí)時(shí)雨雪模擬 [J].計(jì)算機(jī)仿真,2005,22 (7):242-245.]
[9]WANG Jiwen,LU Hejun.Water droplet splashing down simulation based on particle system [J].Science Technology and Engineering,2010,10 (6):1547-1550 (in Chinese).[汪繼文,陸和軍.基于粒子系統(tǒng)的水滴濺落模擬 [J].科學(xué)技術(shù)與工程,2010,10 (6):1547-1550.]
[10]YANG Shuhua,LIAO Shouyi,WQNG Shicheng,et al.Realtime simulation of rain and snow based on particle system and Vega software [J].Journal of Computer Applications,2008,28 (6):238-240 (in Chinese).[楊述華,廖守億,王仕成,等.基于粒子系統(tǒng)和Vega的實(shí)時(shí)雨雪模擬 [J].計(jì)算機(jī)應(yīng)用,2008,28 (6):238-240.]
[11]HE Liang,BA Lideng.Dynamic simulation of snowscape based on particle system [J].Journal of Northwest University(Natural Science Edition),2010,40 (4):603-606 (in Chinese).[何亮,巴力登.基于粒子系統(tǒng)的動態(tài)雪景模擬 [J].西北大學(xué)學(xué)報(bào) (自然科學(xué)版),2010,40 (4):603-606.]
[12]CHEN Lei,CHEN Hexin,WANG Runjie,et al.Real time snow simulation in flight simulator [J].Journal of Jilin University of Technology (Natural Science Edition),2005,35(2):164-166 (in Chinese).[陳蕾,陳賀新,王潤杰,等.在飛行模擬器中實(shí)現(xiàn)雪的實(shí)時(shí)模擬 [J].吉林大學(xué)學(xué)報(bào) (工學(xué)版),2005,35 (2):164-166.]
[13]YANG Cun,MAO Xuan,ZHU Fuquan,et al.Dynamic simulation of chemistry experimental phenomenon based on particle system [J].Journal of Computer Applications,2010,30(1):150-152 (in Chinese).[楊春,毛軒,朱福全,等.基于粒子系統(tǒng)的化學(xué)實(shí)驗(yàn)現(xiàn)象動態(tài)模擬 [J].計(jì)算機(jī)應(yīng)用,2010,30 (1):150-152.]
[14]LI Sujun,WU Lingda.Real-time simulation of rain based on particle system [J].Computer Engineering,2007,33 (18):236-238(in Chinese).[李蘇軍,吳玲達(dá).基于粒子系統(tǒng)的實(shí)時(shí)雨模擬 [J].計(jì)算機(jī)工程,2007,33 (18):236-238.]
[15] TAN Liang,LUO Yifan.Simulation of precipitation phenomenon based on particle system method [J].Computer Science,2010,37 (1):271-274 (in Chinese).[譚良,羅一帆.基于粒子系統(tǒng)方法的沉淀現(xiàn)象模擬 [J].計(jì)算機(jī)科學(xué),2010,37 (1):271-274.]