粒子系統 烟花效果的實現

2021-08-04 07:54:26 字數 1595 閱讀 6998

提到烟花,大家首先想到的都是天空上那綻放的炫美,或者手中炫目的白光,作為計算機體制內的人,以物件導向的思維來看待烟花的話,會得到什麼呢?我們可以將美麗的烟花效果抽象為由乙個個粒子組成的乙個系統,將粒子作為物件,它擁有座標、顏色、速度、生命週期等屬性,通過對大量粒子的顏色、路徑處理,就可以得到近似的烟花效果啦,那麼我們一起來看一下怎麼實現吧!

我們所說的粒子,可以理解為空間中的乙個點,或者半徑較小的圓,主要有以下屬性:

在例項化粒子物件之後,我們要考慮的就是如何讓粒子按照烟花的軌跡來動起來,這才是整個程式的關鍵,就是路徑實現問題。想必基本的小球運動執行緒大家都很熟悉,只要給出初始座標,配合v-t、a-t函式即可得到路徑。

尤拉方法:設物體在任意時間 t 的狀態:位置向量為 r(t)、速度向量為v(t) 、加速度向量為a(t), 則:

v(t+△t)=v(t)+a(t)△t

r(t+△t)=r(t)+v(t)△t

即從時間t的狀態,計算下乙個模擬時間t+△t的狀態。

這裡我們模擬的是仙女棒的效果,使用的v-t、a-t函式為:

pt.vspeed=new vector(10,-20);

pt.vacceleration=randomdirection();

public

static vector randomdirection()

函式所產生的角從0-3π,加速度的函式為(cosθ,sinθ),畫出座標圖來大家就可以發現,是圈型軌跡,隨著粒子向外運動和規模的增大,效果就近似於仙女棒了,怎麼樣,是不是想不到~(@ο@) ~

思路清晰了,實現起來就簡單了嘛,建立以下類:

image image=jf.createimage(jf.getwidth(),jf.getheight());

graphics bg=image.getgraphics();

bg.draw.....

jf.getgraphics().drawimage(image, 0, 0, null);

public vector add(vector v) 

public vector multiple(double rate)

//執行緒類中,對應的粒子的座標和速度的重新整理

p.vposition=p.vposition

.add(p.vspeed

.multiple(rate));

p.vspeed=p.vspeed

.add(p.vacceleration

.multiple(rate));

(懶得做gif別打我啊)

額,看著有那麼點凌亂,哎呀,不管了,有興趣的同學可以改一改路徑函式,做乙個天空版的烟花(我今天回去試一下)。

最後,歡迎各路大佬指點

OSG粒子系統應用 雨雪效果

目標 使用osg的粒子系統完全對天氣中雨雪效果的模擬 直接上 osg matrixd matrixeffect matrixeffect.maketranslate pos 設定粒子位置 osg ref ptr trans new osg matrixtransform 對粒子範圍進行了放大 tra...

粒子系統的簡單實現

粒子系統說起來高深摸測,其實就是許多許多許多許多許多許多的點圖象,然後對其進行執行速度,方向,衰減的處理。不可少的,先定義一些全域性變數。const intmaxpoint 1000 粒子的個數 float slowdown 2.0f float xspeed 粒子的速度,這裡沒有給出。可以自己加 ...

Unity粒子系統,探照燈效果,相機跟隨

粒子系統 粒子系統是每個引擎都必須具備的,如果缺乏粒子系統,對於引擎將會帶來重要影響。unity3d的粒子系統也同樣相當的強大,現將unity3d粒子系統的部分屬性做如下整理。ellipsoid particle emitter min max size 每個粒子的半徑大小隨機範圍 越大每個粒子就越...