摘 要:針對目前大規模場景中導彈尾焰等特效繪制計算量大,導致系統實時性差等缺點,給出了一種基于多級粒子系統和新型粒子形狀的尾焰繪制方法,在用三角函數勾畫出輪廓后,對外部采用圓周發射新形狀的粒子,內部采用特殊單面片作為基本粒子形狀且用直線運動代替曲線運動,并采用了LOD結合GPU的粒子系統技術,在不影響真實感的情況下減少了計算量,有效提高了大規模場景中尾焰特效繪制的逼真度和實時性。
關鍵詞:虛擬仿真; 導彈尾焰; 多級粒子系統; 紋理映射; 新粒子形狀
中圖分類號:TP391.9文獻標志碼:A
文章編號:1001-3695(2010)06-2387-04
doi:10.3969/j.issn.10013695.2010.06.112
Simulation algorithm for flying trail fire based on multilevel particlesystem and new particle shape
CHEN Yan, NIE Junlan, WANG Yanfen
(Information Science Engineering Institute, Yanshan University,Qinhuangdao Hebei 066004, China)
Abstract:This paper proposed a drawing method based on multilevel particle system and new particle shape, because the calculation amount and realtime capability were a great disadvantage for the special effect drawing of the missile tailflame in current largescale scenes. This new method reduced the computation greatly in the circumstances of not affect the reality, and also effectively improved the fidelity and realtime capability when special effect drawing happens for largescale scenes. Externally, used circumference to launch the newshape particle, internally, by using special singleslice as elementary morphism particle model and replacing the curvilinear motion by linear motion. Furthermore, the method of LOD combined with GPU of particle system had been adopted too.
Key words:virtual simulation; missile plume; multilevel particle system; texture mapping; new particle shape
0 引言
在大規模戰場環境的可視化仿真研究中,爆炸、火焰、毒氣云團等特殊效果是虛擬戰場仿真中的重要組成部分,這些特殊效果可以顯著地提高虛擬戰場的逼真程度。然而,在大規模虛擬場景中,特殊效果對資源的占用大幅度增加了系統的開銷,使得戰場仿真系統可視化受到嚴重阻礙。如何減小這一阻礙,又不影響仿真的逼真度,是眾多科研人員著力解決的問題。其中導彈尾焰是虛擬戰場場景中必不可少的一種特效,但由于其具有幾何外形和內在的不確定性,不能用通常的三維建模方法來制作,對于這類景物,計算機圖形學中用粒子系統的方法來描述,能夠達到很好的效果,但傳統算法所需的粒子數量巨大,很難滿足實時性的要求,不能靈活應用于大規模場景中。針對這一問題,國內外很多科研人員在該領域都進行了很有價值的研究。Perry等人[1]用紡錘體模擬火苗的輪廓,將表面分割成12層,每層均為一個圓形,每個圓形等間隔取16個點,即用192個點來描述火苗的特征,這種方法在普通的微機上僅有20 fps左右的刷新率。禹海全等人[2]提出選用兩組相互垂直交叉的兩個平面作為粒子的基本形狀來解決二維紋理表示立體效果的問題,但兩組垂直交叉面不能得到充分的利用,從與兩平面交線平行的方向觀察會使交線與視線平行的粒子不可見,造成了資源的浪費。馬登武[3]和陳志偉[4]等人采用紋理映射和粒子系統原理相結合的技術,但真實性不夠,沒有達到很好的三維效果。鞏建華等人[5]首先用幾何體定義了尾焰的輪廓,再對輪廓尾焰進行透明度擾動,該算法計算量大且動態感不足。朱宏偉等人[6]引入了粒子發射盤進行整體發射和圓周發射粒子,但整體發射粒子數量較多,影響實時性,圓周發射又只能在限制的視角內觀察,否則會出現尾焰中空的錯誤。總結前人的研究成果[7,8],在逼真度和實時性的權衡上仍沒有達到十分滿意的效果。為此提出了一種新的粒子基本形狀,并對尾焰的外部和內部分別用不同的粒子系統即多級粒子系統,采用LOD結合GPU的粒子系統技術,在不影響逼真性的情況下有效地提高了系統的實時性,使其能在大規模場景中得到靈活的應用。
1 導彈尾焰模型的建立和模擬
怎樣才能對逼真性和實時性進行有效的權衡是本文的工作重點,本文主要通過以下技術手段來增加逼真性,提高實時性:a)用函數勾畫尾焰輪廓;b)采用三個面片所組成的新的粒子形狀,解決二維紋理在三維觀察下的失真問題;c)對尾焰外部采用圓周發射新形狀的粒子,對尾焰內部則采用單面片作為基本粒子形狀且用直線運動代替曲線運動;d)對尾焰內部粒子系統在一定角度上采用公告板(billboarding)技術,在不影響實時性的條件下增強逼真性;e)用紋理映射和粒子系統相結合的技術以及融合技術;f)采用LOD結合GPU的優化技術,將復雜的計算轉移到GPU中運行,從而適合大規模場景的仿真。
1.1 導彈尾焰輪廓的建立
用如圖1所示的正弦曲線繞x軸旋轉360°所得的幾何體作為導彈尾焰的基本輪廓,正弦曲線的方程為:
f(x)=A×sin(kx)
其中:A表示尾焰的最大寬度,k決定尾焰的長度。在圖1中,M表示一個半徑為r1的圓形面片,粒子在這個圓形區域內發射出去,N表示半徑為R的圓形面片,粒子在這個面片的前后區域消亡,在M區域內部劃分一個半徑為r2的圓,則在由兩個圓組成的圓環Q(圖2中畫“☆”的部分)及半徑為r2圓的內部分別用不同的粒子系統去發射粒子,如圖2所示為M的正面圖,將其分別稱為外部粒子系統(其產生區域為圖中畫“☆”的部分)和內部粒子系統(其產生的區域為圖中畫“○”的部分)。
外部粒子系統在圓環Q的區域內產生軌跡為正弦曲線的粒子,內部粒子系統在半徑為r2的圓形區域內產生軌跡為直線的粒子。下面分別詳細地介紹這兩個粒子系統。
1.2 外部粒子系統的仿真
為了更加逼真地表現出導彈尾焰的形狀,外部粒子的軌跡顯得至關重要。本文將外部粒子系統的粒子軌跡均設為正弦曲線,其每時每刻的速度值決定了粒子的運動軌跡,粒子在圓環Q的區域內剛產生的時候會隨機賦給初始速度,記為Vx0,Vy0,Vz0,由于粒子在x軸方向上的位移函數為
Sx0 = Vx0×t
對t求導可得Vx=Vx0,粒子在y軸上的位移函數為正弦曲線,又因為π /k表示尾焰的長度,所以y軸上位移函數的周期為T= π/ (k×Vx0),此位移函數為Sy=Ay×sin(k×Vx0×t)。此函數對t求導可得
Vy=Ay×k×Vx0×cos(k×Vx0×t)
將t=0代入可得
Vy0=Ay×k×Vx0Ay=Vy0k×Vx0
所以Vy=Vy0×cos(k×Vx0×t)
同理可以求出Vz關于時間的函數Vz=Vz0×cos(k×Vx0×t)。因此,每個時刻的速度可以求出,粒子的軌跡也可以表現出來。
對于粒子初速度的大小和方向的確定,則由粒子在圓環Q上產生的位置決定。粒子初速度的方向為O點與粒子產生位置的延長線的方向,設粒子產生的位置坐標為(x0,y,z),其中x0為產生粒子的圓面M與x軸交點的橫坐標,設初速度大小為V初,則可根據給定的位置坐標和初速度大小求出粒子速度在各軸方向上的分初始速度。設P為粒子到O點的距離,則粒子在x軸方向上的初速度為Vx初=V初×x0P,同理可得Vy初=V初×yP,Vz初=V初×zP。為了簡化計算,這里先隨機給出P(P2< P 粒子形狀的選擇對粒子系統來說是至關重要的,不同的粒子形狀,在相同的其他條件下會得到不同的效果。以往有的采用幾何體(如球體、立方體、長方體等)來作為基本粒子形狀的方法,由于計算量大,對實時性影響重大,為了達到逼真的立體效果又減小對實時性的影響,降低計算的復雜程度,很多人對粒子形狀作了很大的改進:讓粒子以多邊形的形式出現,采用平面不規則組合體表示三維形體。具有代表性的有禹海全等人[2]提出的利用兩組互相垂直的交叉平面來表現導彈尾焰,但兩組平面不能得到充分的利用,從與兩平面交線平行或垂直的方向觀察,僅能使平面正對視線方向的粒子可見,大約有一半的粒子不可見,造成了資源的浪費。本文提出一種新的粒子形狀,如圖4所示,此粒子形狀由三個四邊形面片組成,其中使任意一條邊與x軸平行放置,均不影響視覺效果,且無論從哪個角度觀察,都不會出現盲點,這種粒子形狀達到了很強的立體效果,相對于文獻[2]的粒子形狀,此形狀減少了組成粒子所需的四邊形個數,且無須用兩組粒子來達到任何角度觀察都能可見的問題,僅用這樣的一種粒子就可達到。 1.3 內部粒子系統的仿真 與外部粒子系統相比,內部粒子系統在側面和前面的視角觀察時是不可見的,從尾焰的后方觀察時,內部粒子系統就起到了極為重要的作用。因此,內部粒子系統的仿真不必像外部粒子系統那樣復雜,粒子的軌跡和形狀均可以使其簡化。這樣既減少了計算量,提高了系統的實時性,又不會影響尾焰的逼真效果。 對于內部粒子系統,粒子是由半徑為r2的圓形區域發射出來的,如圖5所示,將其軌跡簡化為勻速直線運動。圖中O′為直線AB、A′B′的交點,其中B、B′為外部粒子系統在截面N上的理論邊緣,粒子的速度方向為O′與粒子產生位置的延長線方向,這樣就可保證內部粒子向外散射形成以AA′、BB′為底的圓臺形狀。與外部粒子系統類似,只是頂點O變成了O′,可根據與外部粒子系統相同的算法來計算,在此不再詳細介紹。 由于內部粒子系統的可見僅在從尾焰后方觀察時起主導作用,故僅用單個的四邊形面片作為基本粒子形狀就可以達到滿意的效果,且減少了計算量,大大優化了整個系統。 1.4 紋理映射與布告板技術的應用 本文采取三種尾焰特征圖片作為紋理數據,在映射的時候可以隨機選擇,如圖6所示。 同時為了增加動態性,采用了OpenGL中提供的融合技術來滿足導彈尾焰的特殊要求。 因為內部粒子系統在火焰正面觀察的時候為不可見,故僅在視線從尾焰側面或后面觀察時才采用布告板技術,使紋理圖片始終在視點的正前方。 1.5 LOD結合GPU的優化技術 上述方法從計算復雜度和粒子數量這兩個角度對尾焰進行了優化,為了進一步適應大規模場景的特點,在上述算法的基礎上采用LOD結合GPU的優化技術。首先,根據尾焰中心距離視點的遠近用LOD技術計算出所需繪制的粒子數量。其次,對多級粒子系統進行分級,將相對計算復雜的外部粒子系統的計算轉到GPU中進行,從繪制效率的角度對尾焰系統進行優化。 1.5.1 LOD技術在尾焰仿真上的應用 將粒子模型根據視點到尾焰中心的距離分成n(1…n)個等級,每個等級的模型用不同數量的粒子來繪制。設N0為繪制尾焰的原始粒子數亦為粒子數量的上限,L0為視點與尾焰的原始距離亦為距離的下限,隨著視點與尾焰距離的增加,繪制尾焰所需的粒子數逐漸減少,且粒子數量的變化率和距離的變化率是相對應的。設Nm為m等級所需的粒子數量,Lm為m級視點與尾焰的距離,則 N0×L0 = Nm×Lm 所以 Nm = N0×L0/ Lm 當L < L0時,N= N0 當Lm< L≤Lm+1時,N= Nm 可以根據視點到尾焰的距離L來判定繪制尾焰所需要的粒子數量,減少了距離較遠時不必要粒子的繪制,且不影響真實感。 1.5.2 GPU中的計算 由于相對于內部粒子系統來說,外部粒子系統的計算量較為復雜,特別是在大規模場景中,CPU的工作量十分巨大[9~11]。為減輕CPU的負擔,本文在用LOD方法判斷所需要的粒子數量之后,將外部粒子系統的計算交給GPU來處理。 因為GPU的輸入輸出均以浮點紋理為目標,浮點紋理中每個像素均由R、G、B、A四個分量組成,所以可以將粒子的屬性存儲到浮點紋理中,并同時定義兩個相同的浮點紋理形成一組紋理對,用來保存粒子的信息。紋理對中一個用于讀取信息供Cg代碼計算,另一個保存計算結果。在下一幀的計算時,調換兩個紋理。針對本文的粒子系統的特點,其粒子的處理流程如圖7所示(圖中的空心箭頭為片段處理器二次處理的標志)。 1.6 導彈尾焰的顏色特征 導彈尾焰是可燃物或可燃混合氣體的燃燒區。通過實際觀察得知導彈尾焰的顏色變化可分為:藍色→黃色→淺紅色→白色,其顏色的變化是時間的函數,隨著粒子生命時間的推移而變化,且各段之間的顏色并不是突變的,可通過對顏色的隨機干擾產生平滑的過渡以增強尾焰的逼真效果。例如: if(particle[loop].lifet==particle[loop].life0/5) {particle[loop].g=rand()%10/100+0.5f; particle[loop].b= rand()%10/100+0.5f; particle[loop].a= rand()%10/100+0.5f;} 其中:particle[loop].lifet為t時刻粒子的生命值,particle[loop].life0為粒子的壽命。 2 導彈尾焰的繪制 首先對粒子的位置、顏色、速度、生命值等屬性進行初始化,其次根據粒子的初始位置屬性確定其是否屬于外部粒子系統,若是,則將其計算通過GPU來實現,反之則在CPU中運行。隨著時間的推移,粒子的屬性不斷改變,當粒子超過其生命周期或超出規定的區域時,粒子消亡,產生新粒子。由于尾焰由兩個粒子系統構成,可根據實際需要來控制內部粒子系統的打開或關閉,如當從尾焰的前方觀察時,則可關閉內部粒子系統,進一步達到尾焰優化的目的。 3 實驗結果與對比 如圖8所示,其中(a)~(c)為其他方法所實現的尾焰效果,從(d)可以清楚地看到粒子在不同時間的位置變化,(e)表示本方法粒子個數為250個(250×3=750個面片)時的效果。文獻[8]則需要1 000個粒子來實現,相比于其他的方法(圖8中(a)~(c)),從外形上來說,先前的效果都較為粗糙,而且可以明顯地看出尾焰尾部粒子的顆粒形狀;本方法所體現的效果較為細膩,尾部粒子透明度的過渡也較為平滑,在視覺上能很好地體現出尾焰向后噴射的感覺。從繪制效率上來說,其中的效率對比可以通過表1來體現,綜合兩者可以看出,文中方法無論對導彈尾焰繪制的真實性還是實時性都起到了較為理想的優化作用。 表1 各種方法的比較 名稱粒子數面片數刷新率/fps 幾何建模法25 無紋理方法5 0005 00027 文獻[8]方法1 0001 00034 本方法CPU25075041 本方法LODGPU250750140 不同的場景對實時性的要求是不同的,在較小的場景中僅使用CPU中運行的方法即可滿足要求,雖然使用LOD結合GPU的方法也可滿足需要,但是多余的編程是沒有必要的,因此合理地針對場景有選擇是選擇所使用的方法是科學的也是必要的。圖9表明了不同優化方法的效率對比,也可為實際中對方法的選擇提供依據。 上述算法在個人計算機上(P4 2.66 GHz CPU,512 MB內存,NVIDIA GeForce MX400 128 MB顯卡),基于Windows平臺,采用Visual C++和OpenGL進行了實驗,取得了非常好的效果,達到了140 fps的刷新率,實時性較高且立體感強,能夠滿足實際模擬的需求,應用在場景中的效果如圖10所示。 4 結束語 傳統的粒子系統方法,粒子數量巨大,計算復雜,很難應用到實時性要求較高的大規模虛擬場景中。本文提出了一種新的粒子形狀來解決二維紋理在三維觀察下失真的問題,且采用多級粒子系統對導彈尾焰進行了模擬,并結合LOD技術將部分工作分配給GPU運算。該方法立體感較強,用戶可在各個角度進行觀察,且實時性較高,取得了比較理想的仿真結果,已經在大規模虛擬戰場仿真中得到了應用。 對于今后的工作,將把尾焰和導彈的運動結合在一起,因為如果導彈運動的速度太快超過了一定的限度,而粒子還來不及產生的話,會產生脫節的現象。如何根據導彈的運動速度合理控制尾焰的生成,是今后重點要解決的問題。 參考文獻: [1]PERRY C H, PICARD R W. Synthesizing flames and their spread[C]//Proc of SIGGRAPH’94. 1994. [2]禹海全,李巖,馮振聲.基于某型防空導彈的尾焰仿真研究[J].計算機仿真,2004,21(2):22-24. [3]馬登武,葉文,鄧建球,等.一種簡便高效的導彈尾焰的繪制算法[J].系統仿真學報,2006,18(3):663-665. [4]陳志偉,馬小虎,徐云龍.一種快速的飛行尾焰繪制方法[J]. 計算機科學,2007,34(12):151-153. [5]鞏建華,李濤,王衛平,等.導彈尾焰及爆炸效果的實現方法[J].火炮發射與控制學報,2004(2):33-36. [6]朱宏偉,姜國華,王寶智.導彈尾焰的可視化仿真研究與實現[J].計算機仿真,2008,25(2):29-32. [7]王功明,郭新宇,趙春紅,等.粒子系統的優化技術研究[J].計算機應用研究,2008,25(2):495-500. [8]嚴濤,吳恩華.飛行模擬系統中導彈尾焰的實時生成[J].計算機輔助設計與圖形學學報,1999,11(1):74-76. [9]OWENS J D, LUEBKE D, GOVINDARAJU N .A survey of generalpurpose computation on graphics hardware [C]//Proc of EUROGRAPHICS.2005. [10]張漢清,張科.基于GPU粒子系統的戰場實時雨雪效果模擬[J].計算機仿真,2007,24(10):200-203. [11]高玉建,李帥,郝愛民.一種真實感焰火實時模擬方法及其GPU實現[J].系統仿真學報,2008,20(24):6725-6729.