粒子系統在圖形學上的應用十分廣泛。最常見的,是通過控制大量的、具有相似行為的點元素,來描繪自然現象。例如下雨、下雪、火焰、水、霧等等。在家用控制台或pc上的2d、3d遊戲中,粒子特效代替了更為傳統的精靈繪圖,並取得了更靈活多變的視覺效果。但在手機裝置上,因為機能和api的諸多限制,對於這一技術的應用並不常見。本文試圖嘗試一下如何在這些裝置上實現簡單的例子系統。這僅僅是一次試驗,並不能保證一定能用於你的實際開發。
粒子系統簡介
粒子系統,即粒子群系統。在自然界中,微粒以各種各樣的方式聚集在一起形成,擁有了自身的屬性和運動規律,構成了複雜的世界。對這種微粒的研究過於寬泛,我們僅僅關注微粒系統在圖形學上應用的一小部分應用。乙個常見的微粒系統由兩部分組成:微粒群和微粒管理器。微粒包括了一系列的屬性:速度、顏色、貼圖等和一系列的行為。微粒管理器則負責建立微粒群,呼叫微粒群的行為、以及將微粒群表現出來(顯示)。
例子系統常見的應用有:描述群體(乙個子彈群)、描述自然現象(下雨、下雪、火焰、水、霧)。此文關注的是後者。
實現粒子系統的成本
實現通用粒子系統的前提:
1,要有足夠的記憶體空間儲存粒子系統本身
2,可以對螢幕上的點進行控制
對於第1條,我的建議是,不要為每乙個粒子系統建立類物件,僅僅儲存乙個多維陣列用作描述狀態資訊。行為可以抽象到粒子管理器去處理。儘管這樣,當粒子數目很多時其消耗也是非常驚人的。
對於第2條,midp2.0提供了對螢幕上的點進行訪問的能力。這一能力是通過graphics的
void drawrgb(int rgbdata, int offset, int scanlength, int x, int y, int width, int height, boolean processalpha)
renders a series of device-independent rgb+transparency values in a specified region.
方法實現的。此方法不是直接取得對緩衝區的操作能力,而是通過對乙個rgbdata進行各種操作,然後將它繪畫出來,從而實現點的控制。換句話說,對螢幕的點的控制,轉換為了對陣列的控制。不開放對緩衝區的直接操作,優點是:不去限制硬體廠商的實現;缺點是:一旦要對整個螢幕進行畫素操作,就不得不開闢乙個足夠大的陣列,則對普通的手機來說顯得負擔承重。以sek700為例,176*221=38896畫素,每個畫素乙個int(佔2byte),則總共需要77792b約76kb的連續空間。正如後面看到的,大量的例子演算法需要使用到blur技術用於提高畫面效果。此技術需要上次的螢幕的點資訊,因此需要兩個76kb的連續空間。這還不算粒子群本身需要的空間。如果僅僅作為螢幕特效,就吃掉兩個76kb的連續空間似乎有些得不償失。另外,標準沒有對陣列進行操作的繪圖指令,因此如何對陣列進行簡單的畫圓、輸出字元等操作都很棘手。所以可以預見,因為標準api的限制,我們僅能有限的利用粒子系統。
試驗一:模擬瀑布
基本思路:將粒子群的出生地定於一點,隨機產生乙個小範圍的水平速度。讓粒子按照自然規律自由落體。在接觸地的時候發生碰撞,產生很小的向上動力(能量衰減)。
以下是**,其中blur是一種簡單的模糊演算法,它可以上畫面更見好看,這裡使用的是演算法是取乙個點為其周圍四個點的平均值。這個例子使用了調色盤技術實現了瀑布由白向藍再向黑的過渡(查表法)。通過這個例子,你可了解到例子系統的基本實現、簡單的物理模型模擬和調色盤的使用技巧。在模擬器上執行很慢,但在nokia3310上有13fps。
public class wate***ll
private void initpal()
// for(int i=0;i<64;i++)
// pal.setcolor(i,i,i/3,0);
// for(int i=64;i<192;i++)
// pal.setcolor(i,63,21+(i-64)/3,0);
// for(int i=192;i<256;i++)
// pal.setcolor(i,63,63,(i-192)*4);
}public void init(int x, int y, int high)
refreshstate(x, y);
last = (y + high) << 10;
}public void refreshstate(int x, int y) }}
public void move()
if (particle[i][y] > last) }}
public void paint(byte buffer, int scanlength)
} catch (exception e)
}public void blur(byte inbuffer, byte outbuffer, int scanlength)
}// for (k = 0; k < scanlength; k++)
// for (k = (backheight - 1) * scanlength; k < inbuffer.length; k++)
}public string tostring()
return sb.tostring();}}
試驗二:模擬定點火
有了上面的基礎,我們這次就駕輕就熟了。只要準備好調色盤,確定好粒子的狀態:出生位置,選擇適當的blur演算法就可以了。
火焰這個例子有些特殊的地方是,並不需要很多的粒子屬性。僅僅將粒子出生於螢幕底端(火焰的定點位置),再通過乙個特殊的blur演算法,就可實現了。這個blur演算法就是取一點為自身和自身正下方、左下方、右下方四點的平均值。這樣一來,火焰就誕生了。這個例子在nokia3310上有13fps。因為選取的調色盤不是很好,所以顏色很黯淡,你也可以使用更高的調色盤達到更好的效果。
試驗三:模擬**
和火焰大同小異,blur演算法換回了標準的演算法。主要是物理模型變動,加速度很重要,因為它可以改變物體的運動方向。這個例子在nokia3310上有13fps。
試驗四:模擬水波
演算法來自一片經典文章,是某位前輩很早之前貢獻出來的,有興趣可以google一下。為表尊重,依舊用的原來的。演算法大意是通過勢能計算物體位移。這個例子在nokia3310上有12fps。
試驗五:模擬星空
最後這個例子並沒有用到blur演算法,所以速度很快,效果也不錯。只要是利用顏色速度區分遠近達到視覺上的層次感效果。這個例子在nokia3310上有36fps。
總結機能和標準api的雙重限制,讓我們使用粒子系統遇到了不少的障礙。但在高階手機裝置上,記憶體堆比較大,可以嘗試利用粒子系統進行一些特效(選單使用火焰等),在支援alpha合成的機器上,還可以引入乙個單純的特性層,來進行特效合成,這對於高檔手機的機能是個開發。本文僅僅泛泛而談,幾個例項也很簡單,都有優化的餘地。感興趣讀者可自行實現。
MIDP中嘗試粒子系統
粒子系統在圖形學上的應用十分廣泛。最常見的,是通過控制大量的 具有相似行為的點元素,來描繪自然現象。例如下雨 下雪 火焰 水 霧等等。在家用控制台或pc上的2d 3d遊戲中,粒子特效代替了更為傳統的精靈繪圖,並取得了更靈活多變的視覺效果。但在手機裝置上,因為機能和api的諸多限制,對於這一技術的應用...
球中的粒子系統
過年雖說主要任務是看孩子,不過還是見縫插針的趕了些產品的活 把粒子系統完美的移植到球上了,這是前兩天的成果,不過今天高興順道發出來,呵呵,下面是一些預設的效果 此次實現最大的優點是 1,介面定義的很明確,一種粒子,通過不同屬性可以方便修改為不同的樣式,如同上圖的效果 2,把粒子定義為一種atitud...
CCParticleSystem粒子系統
第一次接觸粒子系統,以前遊戲裡面的一些小特效,像製作動畫一樣,是採用一幀一幀的切出來的,由於這種特效,變化無常,切出來的幀,都非常的大,也很耗記憶體,一下就記憶體溢位了.呵呵 主要是以前都沒有接觸過.現在接觸了,以後遊戲就可以用到了.開心 建立乙個ccparticlesystem粒子系統 ccpar...