Particle Fire 粒子火焰

2021-04-16 06:16:11 字數 1522 閱讀 5994

粒 子火焰可以說是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++) 上

1、對於大量粒子的管理,最好構造乙個效果類(ceffect)封裝起來,並且用預分配記憶體的陣列形式儲存,而不要用動態鍊錶結構,因為陣列的遍歷比鍊錶快得多,而且大量的new和delete也會極大的影響速度。 2

、對粒子的初始狀態和運動施以不同的規則,可以構造出不同的粒子火焰效果,煙火即可用這種方法實現。 3

、對於調色盤的靈活運用可以使程式更加富予色彩。如對調色盤進行分段,可同時顯示出不同顏色的粒子火焰;對調色盤進行迴圈,顯示出火焰整體色彩的變換。 4

、blur的演算法有很多種,還可以實現blur的同時向某個方向移動的效果,或是實現如火焰般的效果。

Cesium粒子系統 火焰粒子 噴水粒子

cesium中可以使用粒子系統來實現現實生活中的一些效果,比如噴泉 火焰等效果。通過cesium自帶的粒子系統實現 火焰粒子標繪類 import particleplotbase from plotbase import plottypes from plottypes export default...

UGUI粒子遮罩(UI Mask 遮擋粒子)

在unity中ugui的mask遮罩無法對partice system 粒子 起到直接的作用,於是這裡我們使用shader來實現ui mask對粒子的遮罩效果。關於粒子顯示在同一層兩個不同ui之間疊加的問題 upgrade note replaced mul unity matrix mvp,wit...

粒子系統 3D粒子

你現在可能已經知道了,2d和3d在godot中是彼此的映象。凡是2d中存在的節點,在3d中也存在。所以,自然而然地,particles2d節點有乙個3d的替代品,叫做particles節點。particles節點會發出3d粒子。它不需要紋理,而是需要乙個網格。然而,如果你在屬性中檢視,你會發現不是乙...