俞俊程
(江蘇科技大學(xué)計算機(jī)學(xué)院 鎮(zhèn)江 212001)
火焰是無規(guī)則物體的典型代表,具有無規(guī)則和實(shí)時多變的特征。它們沒有一般幾何物體光滑的表面和突出的棱角,外觀形狀極不規(guī)則,這就讓經(jīng)典幾何學(xué)很難對其進(jìn)行描述。近年來,經(jīng)過人們的不斷研究,已經(jīng)提出了多種火焰模擬的方法。通過對前人研究成果的總結(jié),可以將計算機(jī)火焰模擬的方法分成三種類型:基于2D 紋理的火焰模擬[2]、基于數(shù)學(xué)物理模型的火焰模擬[3]以及基于粒子系統(tǒng)的火焰模擬?;?D紋理的火焰模擬方法采用紋理貼圖的方式進(jìn)行模擬,這種方法雖然簡單方便,但人工痕跡極大,模擬的真實(shí)性也有待提高。而用數(shù)學(xué)物理模型進(jìn)行火焰模擬,其模擬效果比較真實(shí),但是模擬需要的運(yùn)算量很大,往往需要多次的迭代計算,這也一定程度上限制了這種模擬方法的使用。相比而言,運(yùn)用粒子系統(tǒng)進(jìn)行火焰模擬是最合適最經(jīng)得起考驗的方法[4~7],它的模擬效果比2D紋理方法好得多,同時運(yùn)算量也沒有數(shù)學(xué)物理方法那么大。
所謂粒子系統(tǒng)就是將一定數(shù)量的基本粒子組成粒子群體,用這種粒子群體來表示不規(guī)則的運(yùn)動物體,然后通過控制這些粒子的基本屬性如運(yùn)動、大小、顏色等來模擬不規(guī)則物體的運(yùn)動變化特征的技術(shù)。W.T.Reeves 等首次系統(tǒng)地提出了粒子系統(tǒng)方法[8],隨后,這種方法得到了很大的發(fā)展。Sims利用粒子系統(tǒng)的并行特點(diǎn),在CM-2 超級并行計算機(jī)上實(shí)現(xiàn)了并行的粒子動畫和繪制系統(tǒng)[9]。Richard 和David 引入有向粒子的概念,為可變形的物體表面進(jìn)行建模[10],實(shí)現(xiàn)變形物體表面斷開、連接或延伸等效果。Miroslav Sabo 對粒子系統(tǒng)作了進(jìn)一步擴(kuò)展[11],將粒子屬性的轉(zhuǎn)折點(diǎn)引入了粒子生命周期以保持系統(tǒng)結(jié)構(gòu)的完整。2010 年,唐勇等采用粒子系統(tǒng)與物理模型相結(jié)合的方法在復(fù)雜環(huán)境中進(jìn)行煙霧模擬[12],并利用有限粒子數(shù)生成了滿足真實(shí)性的煙霧場景。此方法被認(rèn)為是迄今為止模擬不規(guī)則模糊物體,最為成功的一種圖形生成算法[13~14]。
火焰在傳播的過程中受到空氣阻力、熱浮力、風(fēng)力和重力等因素的影響,由于粒子體積很小,其受到重力的影響可以忽略不計。熱浮力的大小由火焰的溫度決定,火焰內(nèi)部溫度高,火焰粒子受到的熱浮力較大,粒子上升速度快,相反,火焰外部溫度較低,粒子受到的熱浮力較小,上升速度慢。同時,火焰受到風(fēng)力的影響,當(dāng)風(fēng)出動火焰的時候,火焰粒子在水平方向以接近風(fēng)速的速度移動,在豎直方向受熱浮力影響向上運(yùn)動。當(dāng)火焰粒子以一定速度進(jìn)入空氣時,由于火焰粒子與空氣的摩擦,火焰粒子受到空氣的剪切力作用而產(chǎn)生旋轉(zhuǎn)變形,產(chǎn)生渦流效果。另外,風(fēng)吹動火焰時也會產(chǎn)生渦流效果,本文將兩者綜合考慮,在分析和研究當(dāng)前模擬火焰渦流現(xiàn)象的主要方法螺旋法的基礎(chǔ)上,提出了一種基于矢量場的火焰渦流模擬方法。
火焰粒子在進(jìn)入空氣中時,首先火焰粒子與空氣的摩擦,火焰粒子受到空氣的剪切力作用而產(chǎn)生旋轉(zhuǎn)變形,產(chǎn)生渦流現(xiàn)象[15]。同時受到熱浮力的影響產(chǎn)生豎直向上的運(yùn)動,螺旋法就是在綜合考慮火焰粒子受力情況下,采用隨機(jī)粒子在場景中做螺旋向上運(yùn)動來模擬火焰渦流現(xiàn)象。
圖1 粒子受力分析圖
粒子運(yùn)動軌跡滿足圓錐螺旋線方程:
其中,k 表示螺旋線的初始半徑,p 表示螺距。
旋渦粒子速度矢量隨時間變化規(guī)律如圖3 所示。
圖2 粒子運(yùn)動軌跡圖
圖3 旋渦粒子速度矢量圖
螺旋法原理較為簡單,將一部分粒子從火焰粒子中獨(dú)立出來,用這部分粒子的螺旋運(yùn)動來模擬火焰的渦流現(xiàn)象,這部分粒子稱為螺旋粒子。但是在實(shí)際模擬過程中,發(fā)射器向一定方向發(fā)射出的普通粒子肯定會有一部分運(yùn)動到做螺旋運(yùn)動的粒子所在的空間位置,在此空間位置上,既有按照螺旋線方程作螺旋上升運(yùn)動的粒子,又存在按照粒子發(fā)射器給定的初始狀態(tài)運(yùn)動,這就導(dǎo)致了在視覺效果上火焰粒子運(yùn)動狀態(tài)沖突。另外,粒子發(fā)射器產(chǎn)生的粒子其初始狀態(tài)都不相同,CPU需要按照螺旋線方程分別計算每個粒子的運(yùn)動狀態(tài),這樣增加了CPU的負(fù)擔(dān),造成大量的內(nèi)存消耗。
在螺旋法的基礎(chǔ)上,要想保障火焰粒子的連續(xù)性,消除粒子運(yùn)動狀態(tài)沖突的現(xiàn)象,需要將火焰粒子作為一個整體來處理,而不能將其分割成普通粒子和螺旋粒子兩個部分分別進(jìn)行火焰模擬,因此,本文提出使用矢量場的方法,對粒子系統(tǒng)中處于矢量場中的粒子的運(yùn)動狀態(tài)進(jìn)行控制,以達(dá)到模擬火焰渦流現(xiàn)象的目的。
物理學(xué)中把某個物理量在空間的一個區(qū)域內(nèi)的分布稱為場,如溫度場、密度場、引力場、電場、磁場等。如果形成場的物理量只隨空間位置變化,不隨時間變化,這樣的場稱為定常場;如果不僅隨空間位置變化,而且還隨時間變化,這樣的場稱為不定常場。依據(jù)場在時空中每一點(diǎn)的量的類型可以將場分為標(biāo)量場、矢量場和張量場三種。
如果形成場的物理量是矢量,則將這種場稱為矢量場(vector field),矢量場是由一個矢量對應(yīng)另一個矢量的函數(shù)[16]。建立坐標(biāo)系(x,y,z),空間中每一點(diǎn)(x0,y0,z0)都可以用由原點(diǎn)指向該點(diǎn)的向量表示。因此,如果空間在所有點(diǎn)對應(yīng)一個唯一的向量(a,b,c),那么時空中存在向量場F:(x0,y0,z0)→(a,b,c)。在實(shí)際中,一般的場都是不定常的場,矢量場也是一種不定常場。但為了研究方便,可以把在一段時間內(nèi)物理量變化很小的場近似地看作定常場。矢量場通常被用來模擬例如流體在整個空間中的速度和方向,或者某個力的強(qiáng)度和方向,比如磁力或者引力,隨著它從一個點(diǎn)到另一個點(diǎn)的變化。在本文中,火焰粒子可以看作是一種流體,可以用矢量場來模擬其在空間中的運(yùn)動狀態(tài)。
在矢量場的全部或部分存在角速度的場稱為漩渦場,漩渦場是一種特殊的矢量場。本文中采用旋渦場模擬火焰渦流現(xiàn)象,火焰粒子在旋渦場中按照旋渦場受力方向運(yùn)動。渦量是描寫旋渦運(yùn)動最重要的物理量之一,定義為流體速度矢量的旋度,渦量的單位是秒分之一。渦量的定義如下:
其中ω 表示流體微團(tuán)的平均角速度。
漩渦場中用渦線來表示流體微團(tuán)的運(yùn)動路徑,渦線的定義為:某一瞬時漩渦場中的一條曲線,曲線上任意一點(diǎn)的切線方向與改點(diǎn)流體微團(tuán)的旋轉(zhuǎn)角速度一致。由定義推導(dǎo)出其微分方程,設(shè)某一點(diǎn)上流體微團(tuán)的瞬時角速度為取過該點(diǎn)渦線上的微元矢量,根據(jù)定義這兩個矢量方向一致,矢量叉乘積為0,即
這就是渦線方程。
圖4 漩渦場示意圖
圖5 渦線示意圖
圖6 渦管示意圖
圖7 旋渦強(qiáng)度示意圖
某一瞬時,在渦量場中取一封閉曲線c(不是渦線),通過曲線上每一點(diǎn)作渦線,這些渦線形成的封閉的管型曲面稱為渦管。如果曲面c 構(gòu)成的是微小截面,那么這些渦管并與其中所有渦線垂直的斷面稱為渦管斷面,在微小斷面上,各點(diǎn)的旋轉(zhuǎn)角速度相同。渦管中充滿著的作旋轉(zhuǎn)運(yùn)動的流體稱為渦束,微元渦管的渦束稱為微元渦束或者渦絲。在微元渦管中,兩倍角速度與渦管斷面面積dA 的乘積稱為微元渦管的渦通量(旋渦強(qiáng)度),即:
對有限面積,則通過這一面積的渦通量為
如果A 是渦束的某一橫截面積,就稱為渦束旋渦強(qiáng)度,它也是角速度矢量的通量,旋渦強(qiáng)度不僅僅取決于旋度Ω,而且取決于面積A。在流場的某封閉周線上,流體速度矢量沿周線的線積分定義為速度環(huán)量,用符號Γ 表示,即:
Stokes 定理:在渦量場中,沿任意封閉周線的速度環(huán)量等于過該周線所包圍曲面面積的旋渦強(qiáng)度,即:
這一定理將旋渦強(qiáng)度與速度環(huán)量關(guān)聯(lián)起來,給出了通過速度環(huán)量計算旋渦強(qiáng)度的方法。
矢量場方法通過建立漩渦場改變火焰粒子運(yùn)動狀態(tài)從而模擬火焰的渦流現(xiàn)象。旋渦場只對進(jìn)入其中的火焰粒子作用,不會影響其他粒子的正常運(yùn)動,也不存在同一空間位置出現(xiàn)不同運(yùn)動狀態(tài)的粒子的情況,消除了斷層現(xiàn)象。同時,矢量場方法采用GPU Sprites Emitter 來模擬火焰渦流,將模擬粒子運(yùn)動的計算放在GPU 端執(zhí)行。相比CPU 端模擬粒子運(yùn)動,它的優(yōu)勢是減少了CPU 端的開銷,減少了內(nèi)存消耗,借助GPU 的高性能并行計算,能夠支持更多的粒子數(shù)目。
本文實(shí)驗環(huán)境:Intel Core i5-6300HQ,8G 內(nèi)存,NVIDIA GeForce GTX 960M,2G獨(dú)顯。
本文在Unreal Engine 4.15.3 軟件平臺上,同一個第三人稱視角項目的同一個關(guān)卡中對螺旋法和矢量場方法火焰渦流現(xiàn)象模擬情況進(jìn)行比較。兩種方法實(shí)現(xiàn)的具體粒子效果以及火焰效果如圖8~13所示。
圖8 普通粒子圖
圖9 螺旋法粒子圖
圖10 矢量場法粒子圖
比較兩種方法對應(yīng)的實(shí)驗效果圖12 和圖13,圖12 中同一位置有作螺旋運(yùn)動的火焰粒子以及作上升運(yùn)動的普通火焰粒子,出現(xiàn)火焰粒子運(yùn)動狀態(tài)沖突的現(xiàn)象。而圖13 中用矢量場法實(shí)現(xiàn)的火焰則不存在在同一位置火焰粒子運(yùn)動狀態(tài)沖突的現(xiàn)象,從視覺效果上看,矢量場方法所生成的火焰渦流要比螺旋法更好。
圖11 普通火焰圖
圖12 螺旋法渦流圖
圖13 矢量場法渦流圖
兩種方法在同一場景環(huán)境下所占系統(tǒng)資源以及實(shí)時場景數(shù)據(jù)如表1所示。
表1 對比分析表
從上表中可以清楚地看出,矢量場方法在相同粒子數(shù)的情況下,其所消耗的內(nèi)存遠(yuǎn)遠(yuǎn)小于螺旋法,矢量場法FPS 相對于螺旋法有17%的提升,其粒子渲染時間也比螺旋法更少。所以本文提出的矢量場方法更加適合于火焰渦流現(xiàn)象的模擬。
本文從虛擬仿真的真實(shí)性角度出發(fā),在介紹和分析螺旋法模擬火焰渦流的基礎(chǔ)上,提出了一種基于矢量場的火焰渦流模擬方法,這種方法彌補(bǔ)了螺旋法消耗大量內(nèi)存,容易出現(xiàn)火焰粒子運(yùn)動狀態(tài)沖突的缺點(diǎn),運(yùn)用矢量場來控制粒子的運(yùn)動狀態(tài),達(dá)到降低內(nèi)存占用,高真實(shí)性的目的。同時,本文中的方法還有更大的提升空間,比如利用粒子系統(tǒng)的交互來實(shí)現(xiàn)更加復(fù)雜的火焰粒子運(yùn)動等,后續(xù)還會繼續(xù)加深研究。