從前兩節的範例程式可看出,粒子系統(SCNParticleSystem)產出實例時並不需要給任何參數,這表示粒子系統60多個屬性,一定都有預設值(在第5單元 class與struct異同曾提過:物件初始化最重要工作就是給所有屬性初始值),或屬性為Optional類型(預設為nil)。
每個預設值對應粒子系統的某些預設行為,因此,了解這些預設值非常重要,熟悉之後,會讓我們更活用粒子系統。以下將粒子系統所有屬性分成四組分別說明:
第一組:外觀與尺寸
第二組:產出與噴發
第三組:物理模擬
第四組:細部控制與修飾函式
前兩節範例已經對外觀與尺寸、產出與噴發這兩組有初步了解,下一節將學習粒子系統加上物理模擬之後的效果。至於最後一組是進階功能,留給讀者自行探索。
第一組:外觀與尺寸
# | 粒子系統屬性 | 中文名稱 | 預設值 | 說明 |
---|---|---|---|---|
1 | particleImage | 粒子圖案 | nil | 外觀(2D)圖案,預設(nil)使用正方形 |
2 | imageSequenceRowCount | 圖案列數 | 1 | 圖片含多少(MxN)圖案 |
3 | imageSequenceColumnCount | 圖案行數 | 1 | 圖片含多少(MxN)圖案 |
4 | imageSequenceInitialFrame | 首幀索引 | 0 | 0表示左上角第一個圖案 |
5 | imageSequenceInitialFrameVariation | 首幀索引變化 | 0 | 索引變化範圍(例如10,則表示±5) |
6 | imageSequenceFrameRate | 幀率 | 0.0 (frame/sec) | 每秒顯示多少幀圖案 |
7 | imageSequenceFrameRateVariation | 幀率變化 | 0.0 (frame/sec) | 幀率變化範圍(例如10,則表示±5) |
8 | imageSequenceAnimationMode | 動畫模式 | .repeat | .repeat (循環) |
.clamp (一次動畫) | ||||
.autoReverse (迴轉) | ||||
9 | particleSize | 粒子尺寸 | 1 (m) | 預設長、寬各1米 |
10 | particleSizeVariation | 尺寸變化 | 0 (m) | 尺寸變化範圍(例如10,則表示±5) |
11 | particleColor | 粒子顏色 | UIColor.white | 粒子主色,預設白色 |
12 | particleColorVariation | 顏色變化 | (0, 0, 0, 0) | 主色變化,4個值分別為彩度(hue)、飽和度(saturation)、亮度(brightness)以及透明度(alpha),0表示不變化,其他數值(0 < x ≤ 1)表示變化範圍。 |
13 | fresnelExponent | 菲涅耳係數 | 1.0 | 常用於透明表面的反光,若 particleImage 為六面圖案,則粒子會透過此係數映射為透明氣泡 |
14 | stretchFactor | 伸展係數 | 0.0 | 令粒子移動時,沿運動方向伸展變形 |
第二組:產出與噴發
# | 粒子系統屬性 | 中文名稱 | 預設值 | 說明 |
---|---|---|---|---|
15 | birthRate | (噴射)產出率 | 0 (particle/sec) | 0 表示停止產出/噴射 |
16 | birthRateVariation | 產出率變化 | 0 | 產出率變動範圍(例如10,則表示±5) |
17 | particleLifeSpan | 存活時間 | 1.0 秒 | 粒子存活時間(或生命週期) |
18 | particleLifeSpanVariation | 存活時間變化 | 0.0 秒 | 存活時間變動範圍(例如10,則表示±5) |
19 | warmupDuration | 預熱時間 | 0.0 (秒) | 初次噴射前的準備時間 |
20 | emissionDuration | 噴射時間 | 1.0 (秒) | 產出率 x 噴射時間 = 發出粒子數 |
若0.0則瞬間全部發射 | ||||
21 | emissionDurationVariation | 噴射時間變化 | 0.0 (秒) | 噴射時間變動範圍(例如10,則表示±5) |
22 | loops | 是否循環/迴圈 | true | 噴射時間結束後,是否從頭繼續 |
23 | idleDuration | 閒置時間 | 0.0 (秒) | 噴射時間結束後的休息時間 |
24 | idleDurationVariation | 閒置時間變化 | 0.0 (秒) | 閒置時間變動範圍(例如10,則表示±5) |
25 | emitterShape | 噴射器外形 | nil (點/噴射源) | 指定噴射源,從幾何形狀表面隨機位置(SCNPlane, SCNBox, SCNSphere, SCNPyramid, SCNCone, SCNCylinder, SCNCapsule, SCNTube, and SCNTorus),預設為單點 |
26 | birthLocation | 產出點/噴射源 | .surface | 預設從幾何形狀表面噴射,其他選項為: |
.vertex 從頂點噴射 | ||||
.volume 從內部空間噴射 | ||||
27 | birthDirection | 產出方向 | .constant | 預設為固定方向,其他選項有: |
.surfaceNormal 法線(垂直表面)方向 | ||||
.random 隨機方向 | ||||
28 | emittingDirection | 噴射方向 | (0, 1, 0) | 預設向上(+Y軸)噴射,僅出生方向為 .constant 時有效。採節點區域座標。 |
29 | spreadingAngle | 分散角度 | 0.0 (度) | (隨機)噴射角度 |
30 | particleAngle | 旋轉角度 | 0.0 (度) | 粒子旋轉角度 |
31 | particleAngleVariation | 旋轉角度變化 | 0.0 (度) | 旋轉角度變動範圍(例如10,則表示±5) |
32 | particleVelocity | 移動速度 | 0.0 (m/sec) | 粒子移動速度,預設靜止 |
33 | particleVelocityVariation | 移動速度變化 | 0.0 (m/sec) | 移動速度變動範圍(例如10,則表示±5) |
34 | particleAngularVelocity | 角速度 | 0.0 (度/秒) | 粒子旋轉速度(角速度) |
35 | particleAngularVelocityVariation | 角速度變化 | 0.0 (度/秒) | 角速度變動範圍(例如10,則表示±5) |
第三組:物理模擬
# | 粒子系統屬性 | 中文名稱 | 預設值 | 說明 |
---|---|---|---|---|
36 | isAffectedByGravity | 是否受重力影響 | false | 預設不受重力影響 |
37 | isAffectedByPhysicsFields | 是否受力場影響 | false | 預設不受物理力場影響 |
38 | colliderNodes | 可碰撞節點 | [ ] | 碰撞偵測的對象 |
39 | particleDiesOnCollision | 碰撞後消亡 | false | (若有碰撞對象)碰撞後粒子是否消失 |
40 | acceleration | 加速度 | (0, 0, 0) | X/Y/Z三方向的加速度 |
41 | dampingFactor | 阻尼係數 | 0.0 | 運動(位移)時的阻力 |
42 | particleMass | 粒子質量 | 1.0 (Kg) | 若受重力影響才有效 |
43 | particleMassVariation | 質量變化範圍 | 0 (Kg) | 質量變動範圍(例如10,則表示±5) |
44 | particleCharge | 粒子電荷 | 0.0 (庫侖C) | 受電磁力場影響時才有效 |
45 | particleChargeVariation | 電荷變化範圍 | 0.0 (庫侖C) | 電荷變動範圍(例如10,則表示±5) |
46 | particleBounce | 反彈係數 | 0.7 | 與物理實體碰撞後的反彈(1.0表示能量未損耗) |
47 | particleBounceVariation | 反彈係數變化 | 0.0 | 反彈係數變動範圍(例如10,則表示±5) |
48 | particleFriction | 摩擦係數 | 1.0 | 無摩擦力,可自由滑行 |
49 | particleFrictionVariation | 摩擦係數變化 | 0.0 | 摩擦係數變動範圍(例如10,則表示±5) |
50 | systemSpawnedOnCollision | 碰撞後啟動另一個粒子系統 | nil | 當粒子偵測到碰撞後,可啟動另一個粒子系統 |
51 | systemSpawnedOnDying | 消亡後啟動另一個粒子系統 | nil | 當一個粒子消亡後,可啟動另一個粒子系統 |
52 | systemSpawnedOnLiving | 產出後啟動另一個粒子系統 | nil | 當一個粒子產出時,可啟動另一個粒子系統 |
53 | blendMode | 色彩混合模式 | .additive | 適用於粒子重疊時: |
.additive 顏色疊加 | ||||
.subtract 顏色相減 | ||||
.multiply (正規化)顏色相乘 | ||||
.screen 顏色過濾 | ||||
.alpha 透明度相乘 | ||||
.replace 顏色取代 | ||||
54 | orientationMode | 旋轉模式 | .billboardScreenAligned | .billboardScreenAligned 圖案永遠面向螢幕視角 |
.free 圖案可任意角度 | ||||
.billboardViewAligned | ||||
.billboardYAligned | ||||
55 | sortingMode | (渲染次序)排序模式 | .none | 適用於粒子重疊時: |
.none 無特定次序 | ||||
.projectedDepth 投影深度 | ||||
.distance 距離遠者優先 | ||||
.oldestFirst 最早者優先 | ||||
.youngestFirst 最後者優先 | ||||
56 | isLightingEnabled | 是否受光照影響 | false | 是否開啟光照渲染 |
57 | isBlackPassEnabled | 啟用全黑塗色 | false | 先渲染為黑色,再套用圖案(增加對比,但影響效能) |
58 | isLocal | 是否採區域座標 | false | 位置、距離、速度是否採用節點的區域座標 |
59 | speedFactor | 整體速度因子 | 1.0 | 加快或減慢整體速度 |
第四組:細部控制與修飾函式
# | 粒子系統屬性 | 中文名稱 | 預設值 | 說明 |
---|---|---|---|---|
60 | reset() | 重置函式 | - | 所有屬性返回預設值 |
61 | handle() | 事件處理函式 | - | 事件包括 |
.birth 粒子產出時 | ||||
.death 粒子消亡後 | ||||
.collision 粒子發生碰撞 | ||||
62 | propertyControllers | 屬性控制動畫 | nil | 對粒子某個屬性增加動畫行為 |
63 | addModifier() | 新增修飾函式 | - | 對粒子某個或某些屬性增加自訂的修飾程式(匿名函式),每幀畫面執行一次 |
64 | removeModifiers() | 移除修飾函式 | - | 移除修飾函式 |
65 | removeAllModifiers() | 移除所有修飾函式 | - | 移除所有修飾函式 |
66 | orientationDirection | 面對方向 | (0, 0, 0) | 官方文件未說明 |
67 | particleIntensity | 粒子密度 | 1.0 | 官方文件未說明 |
68 | particleIntensityVariation | 粒子密度變化 | 0.0 | 官方文件未說明 |
69 | writesToDepthBuffer | 是否寫入深度緩衝(zBuffer) | false | 官方文件未說明 |