李 海,汪繼文
(安徽大學 計算機科學與技術學院,安徽 合肥 230601)
1983年,由REEVES W T等人提出的粒子系統繪制算法被認為是迄今為止模擬不規則模糊物體最為成功的算法[1],使得具有不規則幾何形狀、內在不確定性且運動具有隨機性的模糊物體的虛擬仿真模擬上了一個新的臺階。目前,國內已經有很多研究者采用粒子系統對自然景物進行成功模擬,如王曉娟對禮花進行了模擬[2],肖何等人成功地進行了噴泉仿真[3]。本文在以上理論的基礎上,通過 VC++和OpenGL開發工具,利用鼠標注冊回調等函數[4]對煙花燃放的位置加以控制,并加入了音頻技術,從視覺和聽覺兩個方面上進一步增強了煙花爆炸模擬的靈活性、逼真性和沉浸感。
粒子系統不是一個簡單的靜態模型,而是一種過程計算模型。粒子系統是由許多簡單形狀的微小粒子(如球體、橢球、立方體、點、線等)作為基本元素聚集起來形成一個不規則的模糊物體,并以這些粒子充滿物體,使其呈現各式各樣的形狀,從而構成的一個封閉的系統。
組成粒子系統的每個粒子都有一組屬性,包括位置、運動速度、運動加速度、形狀、大小、顏色、透明度、運動方向和生命周期等,這些屬性隨著時間的推移在不斷地變化。一個粒子究竟有什么樣的屬性主要取決于其實現的具體應用。
一般情況下,系統中的每個粒子都會隨著虛擬世界時間的流逝經歷一個產生—活動—消亡3個階段的流程[5],如圖 1所示。

圖1 粒子系統流程圖
本文建立的坐標系以屏幕的中心為坐標原點,從左到右的方向為X軸的正方向,從下到上為Y軸的正方向,從屏幕里面指向外面的方向為Z軸正方向[6]。
煙花粒子的數據結構如下:

煙花粒子系統的初始化就是賦予煙花粒子屬性初始狀態。在煙花系統中,每個煙花由一組具有相似性質的煙花粒子組成,每一幀煙花的更新就是這組煙花粒子的更新。這里把每組粒子數定義為一個常數MAX_PARTICLES,這個常數的選擇很重要[7],如果過大,會影響系統的實時性;如果過小,則會影響煙花模擬的真實性。

通過隨機函數rand()和參數控制煙花的初始位置、初始顏色、速度、加速度、生命周期及衰減速率。其中,顏色的初始化可以在模型中定義各種顏色到一個顏色數組中,然后通過隨機函數rand()調用。粒子的運動受到各種外力的影響,包括重力和空氣阻力等,在本實驗中,只考慮垂直方向重力所產生的加速度。

煙花粒子運動更新是整個煙花系統中最重要的組成部分,就是確定每一時刻當前粒子的運動狀態,包括該時刻粒子的位置、速度和生命值等各種屬性值。而這些屬性又是由上一幀屬性狀態和運動的規律決定的。粒子下一幀的位置為:


其中,當前幀位置為(sx(t),sy(t),sz(t)),當前幀速度為(vx(t),vy(t),vz(t)); 下 一 幀 的 位 置 為 (sx(t+dt),sy(t+dt),sz(t+dt)),下 一 幀 的 速 度 為 (vx(t+dt),vy(t+dt),vz(t+dt)),dt為 連 續 兩幀間的時間間距。
煙花粒子從生成開始到消失所經歷的時間是其在整個煙花系統中的生命周期。初始化粒子的生命值為1,為每個煙花粒子定義在一定范圍內的隨機衰減因子,衰減因子越大,粒子生命周期越短;相反,衰減因子越小,粒子生命周期越長。隨著時間的推移,單個煙花粒子的生命值也在逐漸減少,直到為0,則從系統中刪除此粒子。
2.6.1 色彩融合技術
色彩融合技術是將輸入的像素段與幀緩存中目標區域中的像素相結合生成新的像素。當煙花粒子逐漸消亡時,顏色漸漸消退,最終達到與背景融為一體的效果。融合公式為:
(Rs×Sr+Rd×Dr,Gs×Sg+Gd×Dg,Bs×Sb+Bd×Db,As×Sa+Ad×Da)(3)
源 因 子 為 (Sr,Sg,Sb,Sa),目 的 因 子 為 (Dr,Dg,Db,Da)。 其中,Rs、Rd、Gs、Gd、Bs、Bd、As、Ad 是由紋理函數設置的紋理映射方式參數。
2.6.2 紋理映射技術
紋理映射技術是將紋理空間中的紋理像素與某個物體對應的像素顏色相互結合的技術,從而達到簡化建模過程的作用,并且可以提高系統的實時性,模擬物體表面豐富的紋理細節,提高圖形的逼真性。本文以矩形作為繪制煙花粒子的基本圖元,利用紋理映射和色彩融合技術將一幅二維的BMP格式的煙花圖片(如圖2所示)映射至該矩形圖元上。

圖2 煙花紋理圖片
OpenGL應用工具包GLUT中封裝有鼠標消息注冊回調函數,利用此函數可以很好地控制煙花的位置,從而進一步增強煙花模擬的可控性和靈活性。
鼠標的按下、松開或移動等操作都可以產生相應的鼠標消息,這些消息在應用程序開發中出現,常常需要處理。GLUT對這幾種常用的鼠標消息進行了封裝,glutMontionFunc(void(*func)(intbutton,intstate,intx,int y))可以實現對鼠標左鍵、右鍵或中鍵的按下、松開等操作的消息響應。其中,button是左鍵、右鍵和中鍵的標志,state是按下、松開的標志。
用鼠標單擊屏幕,系統把單擊的位置傳送給鼠標消息注冊回調函數 glutMontionFunc(mouseFunc),通過一系列的坐標轉換生成最終需要的OpenGL坐標,然后煙花在此位置上發生爆炸。主要實現的代碼如下:

OpenGL本身不支持音頻,本文使用了Win32的API函 數 庫 中 的 PlaySound (LPCSTR pszSound,HMODULE hmod,DWORD fdwSound)函數實現音頻與煙花爆炸的同步。 引入 windows.h 頭文件(#include<windows.h>),后面加上如下代碼:

DWORD fdwSound)只能實現 WAV格式的文件,其他音頻文件可以通過別的軟件進行剪切并轉化為WAV格式。參數pszSound是指定了要播放聲音的字符串,本實驗中設為WAVE文件的名字;參數fdwSound是標志的組合,為實現同步和引入音頻文件,將其設為SND_FILENAME|SND_SYNC。主要實現的代碼如下:

實驗利用粒子系統對煙花生成的過程進行仿真,應用了OpenGL的紋理映射、色彩混合、顯示列表、加入背景圖片、插入音頻和控制位置等技術,結果如圖3所示。圖3是運用可以截取鼠標位置的紅蜻蜓截圖工具截取的實驗結果圖片,從圖中可以清晰地看見在鼠標的位置上煙花發生了爆炸。

圖3 位置控制的煙花
運用粒子系統對不規則模糊物體進行模擬是一個有效的方法。本實驗從系統的實時性、簡單性、靈活性和逼真性角度出發實現了煙花模型模擬,采用了紋理映射和顯示列表技術,提高了系統的實時性;采用了色彩融合技術,增強了系統的逼真性;加入了背景圖,提高了模擬的真實感;通過提取鼠標位置,實現了對煙花爆炸位置的控制,增強了系統的靈活性;加入了音頻技術,實現煙花爆炸和聲音的同步,增強了系統的沉浸感。
[1]REEVES W T.Particle systems-a technique for modeling a class of fuzzy objects[J]. Computer Graphics,1983,17(3):359-376.
[2]王曉娟.基于粒子系統動態煙花的模擬[J].青海大學學報,2009(4):29-32.
[3]肖何,何明耘,白忠建.OpenGL中基于粒子系統的噴泉模擬實現[J].計算機仿真,2007(12):201-204.
[4]SHREINER D.OpenGL 編 程 指 南[M].李 軍 , 徐 波 , 譯 .北京:機械工業出版社,2010.
[5]葛芳,張成,韋穗,等.基于粒子系統的煙花動畫設計[J].計算機技術與發展,2010,20(8):180-183.
[6]汪繼文,胡文平,金余鋒.基于粒子系統的 8字動態煙花仿真[J].計算機仿真,2010,27(10):211-214.
[7]丁紀云,陳利平,李思昆.基于OpenGL的煙花動態模擬方法的研究與實現[J].計算機 工 程 ,2002,20(4):233-250.