粒子火焰可以說是particle system在2d圖象上的經典應用,曾經有乙個著名的粒子火焰螢幕保護,可以說是將2d particle system的能力發揮到了及至。本文所介紹的程式mypfire(左圖)即是仿照該屏保所做,但是限於imagic的時間和能力,mypfire在任何方面都無法超越該屏保。imagic希望你在閱讀這篇文章之後,能夠寫出你自己的更加精彩的粒子火焰程式。
出於速度的考慮,mypfire執行在8bit模式下,使用了乙個由黑到藍,然後由藍到白逐漸過渡的調色盤。
執行程式後,你會看見大量發光的粒子在螢幕上運動,如果仔細觀察一下就不難發現它們的運動規律:每乙個粒子都有一定的生命週期,在這個週期內以一定的角加速度運動,同時,速度逐漸變慢。那麼,我們不難定義出這樣乙個粒子結構
struct cparticle;
當乙個粒子誕生時,我們需要對它進行一些必要的初始化,對於不同的效果,初始化的內容也是不一樣的,下面是一種最簡單的運動粒子的初始化:
void initparticle(cparticle& particle, float x, float y) 可
以看出,其中有許多引數帶有一定的隨機性,這樣即可以保證每個粒子的座標、速度或角加速度在一定範圍內分布,也可以保證整體效果永遠不會以相同的面貌出現。有了這些初始資料,我們就可以計算出粒子的運動軌跡:
void moveparticle(cparticle& particle) 每
一次呼叫moveparticle函式,即可獲得該粒子的新座標,同時粒子的生命值降低。如果粒子生命值》0,設定粒子在新座標象素的顏色為255(調色盤最大值),如果粒子生命值小於0,表明粒子已經死亡,不予顯示,這樣,就能夠模擬出大量粒子的運動軌跡了。
實際上,mypfire程式在應用partical system方面也就是上面這三段**,但僅僅這些還是不夠的,因為要顯示出發光粒子拖著一條長尾巴的效果,還需要對圖象進行一些特殊的處理才行。blur演算法即是完成這個目的。blur,模糊的意思,最簡單的blur演算法是取該象素前後左右四個象素的平均值,**如下:
for (y=1; y< height-1; y++)
for (x=1; x< width-1; x++) 上
面只是mypfire程式中的一些原理性的描述和未經優化的**,在具體程式設計中,還會有以下一些需要考慮和注意的問題: 1
、對於大量粒子的管理,最好構造乙個效果類(ceffect)封裝起來,並且用預分配記憶體的陣列形式儲存,而不要用動態鍊錶結構,因為陣列的遍歷比鍊錶快得多,而且大量的new和delete也會極大的影響速度。 2
、對粒子的初始狀態和運動施以不同的規則,可以構造出不同的粒子火焰效果,煙火即可用這種方法實現。 3
、對於調色盤的靈活運用可以使程式更加富予色彩。如對調色盤進行分段,可同時顯示出不同顏色的粒子火焰;對調色盤進行迴圈,顯示出火焰整體色彩的變換。 4
、blur的演算法有很多種,還可以實現blur的同時向某個方向移動的效果,或是實現如火焰般的效果。 i
magic並沒有提供mypfire程式原始碼的原因一是**比較亂,也沒有加注釋,實在不好拿出來示人;二是因為imagic覺得只有通過親自實踐,才能學到更多東西。
基於粒子濾波的物體跟蹤
一直都覺得粒子濾波是個挺牛的東西,每次試圖看文獻都被複雜的數學符號搞得看不下去。乙個偶然的機會發現了rob hess 實現的這個粒子濾波。從 入手,一下子就明白了粒子濾波的原理。根據維基百科上對粒子濾波的介紹 粒子濾波其實有很多變種,rob hess實現的這種應該是最基本的一種,sampling i...
基於粒子濾波的物體跟蹤
一直都覺得粒子濾波是個挺牛的東西,每次試圖看文獻都被複雜的數學符號搞得看不下去。乙個偶然的機會發現了rob hess 實現的這個粒子濾波。從 入手,一下子就明白了粒子濾波的原理。根據維基百科上對粒子濾波的介紹 粒子濾波其實有很多變種,rob hess實現的這種應該是最基本的一種,sampling i...
基於粒子濾波的SLAM GMapping 演算法分析
1 階段 粒子濾波首先根據狀態轉移函式 生成大量的取樣,這些取樣就稱之為粒子,利用這些粒子的加權和來逼近後驗概率密度。2 校正階段 隨著觀測值的依次到達,為每個粒子計算相應的重要性權值。這個權值代表了 的位姿取第個粒子時獲得觀測的概率。如此這般下來,對所有粒子都進行這樣乙個評價,越有可能獲得觀測的粒...