AS星塵粒子系統 初識 1

2022-08-14 05:27:12 字數 4758 閱讀 3462

新專案需要,開始接觸粒子系統。對比各大粒子引擎,最終選擇stardust particle engine。

可能是我比較懶,沒找到相關的中文資料。也許實際上研究的人不多吧。所以,我holycy就用自己蹩腳的英語翻譯了大致的內容。

以下是引擎文件英文的一些整理,概括這個粒子系統特性以及能幹什麼。

這個粒子系統支援2d以及3d 特效,並且易於擴充套件,它是基於出名的flint粒子引擎而改裝,內建了zedbox,pv3d等3d引擎,當然你也可以使用其他引擎。同時這個粒子系統也包括了flash原生內建的3d引擎。

類似pv3d 或nd3d 的3d引擎,通常是畫draw出乙個顯示物件到bitmap上並且讓這個位圖成為粒子的材質。如果這個顯示物件的尺寸過大,這通常導致一些效能上的問題,甚至當它只是包括一些簡單的向量圖形也會這樣。

星塵3d和zedbox並不會把這個顯示物件畫到bitmap上,他們直接將顯示物件add到顯示列表中,因此顯示物件依舊是被fp作為向量圖來被渲染。他們基於透視投影演算法來控制顯示物件的位置和尺寸,取代將其畫到位圖上並生成在乙個3d物件上。

星塵系統支援重力和模擬變流。所以模擬重力,風力黑洞之類的效果是小case啦。

星塵系統支援行為觸發,可以定製很多種行為。

stardustelement:是以下類的基類,定義了粒子系統中乙個元素最基本的屬性和方法:emitter, initializer, action, clock, renderer, random, field, deflector, and zone.

emitter:粒子發射器。主要用於建立新的粒子,在主迴圈中更新粒子,並且從模擬(simulation)中移除死亡的粒子。你需要反覆的呼叫step()方法來保持simulation的繼續進行。step()方法是星塵粒子系統的主迴圈中的方法。

initializer:這個類用於粒子出生時的初始化粒子相關屬性。乙個initializer可以通過發射器(emitter)的addinitializer()方法新增到乙個發射器(emitter)上。可初始化粒子的位置,速度,角度,角速度,塊,遮罩,透明度,尺寸,等。。

action:通過呼叫發射器(emitter)的step()方法來操作粒子的屬性。它可以更新粒子的速度,重力等。。

clock:時鐘頻率。這個類決定發射器生成新粒子的頻率。當emitter.step()被呼叫的時候,發射器(emitter)會呼叫相關的clock的getticks()方法來決定有多少新粒子會被建立。

renderer:呈現器。emitter更新粒子的資料,不過資料畢竟只是資料,並不是可視的。通過renderer類來將資料轉化為螢幕可顯示物件。如果你需要使用特殊的3d引擎的畫你可以通過繼承這個類來建立你自己的renderer。 engine-specific **只能用用這個類寫以及初始化。

random:總言之,用他來產生隨機值,包括隨機大小,角度,透明度等。

field:域。表示一些向量域。可用做重力域,衝力域等。比如,乙個uniformfield(均勻場)物件,顧名思義,乙個均勻的向量場。如果作用點向下可用於建立地心引力,或者massless為false時建立風的效果。

deflector:轉向器。

輸入乙個粒子的位置和速度,能產生新的位置和速度。通過這種轉向行為,你能在原位置速度基礎上操控出新的位置和速度。

zone:地域,區域。

這個類用於描繪幾何的區域。乙個區域產生隨機的點,通過getpoint()方法拿到包含在這個區域中的點,這個點能用來初始化粒子的位置和速度。

3d版本的deflector,field,zone類 分別是 deflector3d, field3d, and zone3d。

下面介紹的類不是stardustelement的子類,而是vo(valueobject)類。--------------------

particle: 粒子。

這個類是粒子的vo類。定義了粒子的屬性,類似mask, mass, scale, alpha, 和collision radius等。他的子類:partical2d和particle3d,一些屬性不一樣。比如2d向量和3d向量。

vec2d & vec3d :

用2d和3d方式表現向量。這些類為2d和3d提供一些向量操作方法,比如點積和向量積。

motiondata2d & motiondata3d :

這幾個類是老版本的向量類:他們的目的是儲存變數,不為向量操作提供任何方法。

motiondata4d & motiondata6d :

這兩個類擁有motiondata2d 和 motiondata3d 類兩倍的屬性。主要是用在粒子的位置和速度資訊的轉向行為上。

使用這個粒子系統的大致工作流程:

1.  先建立乙個時鐘頻率 clock。

2.  建立乙個發射器emitter,設定這個發射器的時鐘(第一步建立的clock)的一些屬性。

3.  建立乙個呈現器renderer。

4.  通過renderer的addemitter()方法新增emitter到renderer中。

5.  通過emitter的addinitializer()方法新增initializer初始化器到發射器emitter中。

6.  通過emitter的addaction()方法新增action動作到發射器emitter中。

7.  通過主迴圈(由enterframe或timer或其他產生的)迴圈呼叫emitter的step()方法。就可以工作了。

主迴圈:

主迴圈涉及到了如下的程序(工作):

1.  時鐘檢查階段:

發射器通過clock得知多少個粒子將被建立。clockgetticks()方法的返回值決定了粒子建立的數量。

2. 新粒子的建立階段:

發射器建立了新的粒子(數量是由時鐘決定的),把粒子新增到粒子列表中。emitter讓他的initializer來初始化這些新的粒子。

3.  新粒子初始化階段。

通過initializer.initialize() 進行初始化。

注意的是,每個initializer都有乙個priority屬性,這些initializer通過這個屬性來分類並且按順序來初始化新粒子。

4.  新粒子的渲染階段:

當新粒子被新增並且初始化後,發射器會派發乙個事件:emitterevent.particles_added。renderer監聽這個事件,呼叫renderer.particlescreated()。這個方法負責新粒子效果的處理。

比如,displayobjectrendrerer 將新的粒子對應的顯示物件新增到乙個顯示物件容器的顯示物件列表裡。

5.  動作預更新階段:

在更新目前的粒子前,emitter呼叫preupdate()方法設定好所有動作。

如,在即將來臨的碰撞計算的這個階段優化collide(碰撞) 行動計算最大距離。

注意,乙個action動作可以有乙個沒做任何事情的preupdate()方法,對很多action都適用。

6.  動作階段:

在這個階段,發射器emitter詢問所有他的action來更新在發射器粒子列表上的粒子,通過的方法是action的update()方法。

注意,每個action都有priority屬性。action都是通過這個屬性來進行分類以及在分類列表上更新粒子。

當然,每個action都有mask屬性,action可以忽略並且不更新粒子(如果這個粒子的mask屬性和動作的mask屬性進行按位與之後的結果為0)。這對於一些一些粒子的特殊動作的偽裝有用。乙個粒子的mask值可以通過mask的initializer進行初始化。

7.  動作postupate階段:

emitter呼叫所有action的postupdate()方法來結束更新(update)。

注意,乙個action可以有不做任何事情的postupdate()方法,對大部分action適用。

8.  死亡的粒子的移除階段:

發射器會檢測所有粒子的isdead屬性來判斷是否這個粒子死亡了。

9. 死亡粒子的渲染階段:

所有的死亡的粒子都從發射器的粒子列表中移除。發射器emitter派發乙個emitterevent.particles_removed事件。renderer監聽這個事件,並且這個事件將引用到renderer.paritclesremoved()方法。這個方法負責移除死亡的粒子。

如,displayobjectrenderer將死亡粒子的顯示物件移除到顯示物件容器列表中。

翻譯有誤麼???原文:

for instance, the displayobjectrenderer removes the dead particles』 corresponding display objects to a display object container』s display list.

10. 活動粒子的渲染階段。

在主迴圈結束派發最後乙個事件(emitterevent.stepped)之前.

這個事件會呼叫renderer.render()方法(主要負責引擎特效渲染)。

如,displayobjectrenderer設定x, y, rotation, scalex, scaley, 以及存活的粒子其他屬性,基於儲存在emitter的粒子列表裡的數字資料。

經過我蹩腳的翻譯之後,應該大致明白了星塵粒子系統主要是有什麼作用以及基礎結構了吧。

CCParticleSystem粒子系統

第一次接觸粒子系統,以前遊戲裡面的一些小特效,像製作動畫一樣,是採用一幀一幀的切出來的,由於這種特效,變化無常,切出來的幀,都非常的大,也很耗記憶體,一下就記憶體溢位了.呵呵 主要是以前都沒有接觸過.現在接觸了,以後遊戲就可以用到了.開心 建立乙個ccparticlesystem粒子系統 ccpar...

Unity粒子系統

首次接觸unity的粒子系統,內容太多,搞得都不好寫筆記,所以就記錄下unity的粒子系統做出來的東西以及經常用的一些引數。火焰效果製作 這個相對簡單 建立粒子系統物件 1 調duration 1 開啟loop start size 1 start lifetime 1 start speed 1 ...

Unity粒子系統

rateoverdistance 隨著移動距離產生的粒子數量。只有當粒子系統移動時,才發射粒子。bursts sprite 通過相同尺寸的sprite實現粒子動畫。tiles 網格的行列數。animation startframe 開始的幀是哪一幀。flipu 翻轉u。flipv 翻轉v。enabl...