上節提到影響粒子系統外觀最重要的參數是粒子圖案(particleImage),實際運作時圖案是如何被套用呢?值得我們做個實驗來仔細觀察。

調整上一節6-5a奧運聖火的參數,將出生率從每秒300降到1,存活時間延長為3.6秒,尺寸放大到10公分,以便近距離觀察粒子行為:

粒子雲.birthRate = 1
粒子雲.particleLifeSpan = 3.6
粒子雲.particleSize = 0.1
粒子雲.particleSizeVariation = 0.2

這樣放慢、放大之後,可觀察到每個粒子整個生命週期,從下圖看來,一旦粒子產出後,大小、顏色、外觀似乎就不再變化,這個結果與原先預期不同,原廠文件明明說會按不同圖案依序變化啊!

原來的效果

再仔細推敲文件說明,原來還得加上額外參數 — 每秒變化幀率 imageSequenceFrameRate (預設值0)。在上面我們將存活時間設為3.6秒,圖案共16幅,換算起來幀率約4.4 (16÷3.6),故插入一行程式:

粒子雲.imageSequenceFrameRate = 4.4

如此一來,果然每個粒子就會開始變化,這才符合文件所說的效果:

變更後效果

回頭重新調整奧運聖火的參數,增加一行”imageSequenceFrameRate = 32”,其他參數跟著微調:

let 粒子雲 = SCNParticleSystem() 
粒子雲.birthRate = 100
粒子雲.particleLifeSpan = 0.5
粒子雲.particleImage = UIImage(named: "particleImage")
粒子雲.imageSequenceRowCount = 4
粒子雲.imageSequenceColumnCount = 4
粒子雲.imageSequenceFrameRate = 32
粒子雲.particleColor = .orange
粒子雲.particleColorVariation = SCNVector4(0, 0, 1, 1)
粒子雲.particleSize = 0.03
粒子雲.particleSizeVariation = 0.02
粒子雲.particleVelocity = 0.2
粒子雲.particleVelocityVariation = 0.15
粒子雲.emitterShape = SCNSphere(radius: 0.06)
粒子雲.emissionDuration = 0.2
粒子雲.emissionDurationVariation = 0.1
粒子雲.emittingDirection.y = 1.0

修改後的粒子系統,只需產出原先的1/3(每秒100個粒子),效能更節省,而火焰燒得更旺更活潑,最終效果如下(左圖修改前,右圖修改後):

修改前

修改前

修改後

修改後

結論:particleImage 用一個簡單圖案,就能達到不錯的效果;若用多個圖案,則錦上添花,以更少效能達到更佳效果。

下一節:6-5b 文字雨(粒子系統)