
概要 📖 – 入力点から粒子を生成し物理運動
Particle SOPは、入力ジオメトリの点から粒子を放出し、力・衝突・寿命をシミュレーションして各フレームの粒子群を出力する SOPです。重力や風、乱流といった力を加えながら粒子の誕生・運動・衝突・消滅を計算し、Particle Type で線分または点スプライトとして描画できます。
主な用途 🎯
- 入力ジオメトリの点から粒子を放出(Birth で 1 秒あたりの発生数を指定)
- 重力・風・乱流による物理運動(External Force / Wind / Turbulence で粒子の軌道を制御)
- 寿命と透明度の制御(Life Expect / Life Variance / Alpha Speed で粒子の生死とフェードを表現)
- 衝突面でのバウンド・付着・消滅(Limit Plane と Hit Behavior で境界の挙動を選択)
- 線分または点スプライトとして描画(Particle Type で速度方向の線 / カメラ対面スプライトを切替)
データフロー 🔄
入力: 放出元ジオメトリの点
↓
誕生処理 (Birth で粒子を発生)
↓
力の適用 (External Force / Wind / Turbulence で加速)
↓
衝突・寿命判定 (Limit Plane / Life Expect)
↓
出力: 各フレームの粒子群 (点または線分の SOP)
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Page 📁
放出元の指定 🎯
Source Group .sourcegrp 🎯
– Source Group (放出元グループ) — 指定したポイントグループ内の点だけから粒子を発生させる
– 空欄のときは入力ジオメトリの全ポイントが放出元になる
State Page 🎛️
Particle Type .prtype 🎛️
Particle Type (粒子の描画形式) — 粒子をどのように描画するかを選択する
| 項目 | 内部名 | 説明 |
|---|---|---|
| Render as Lines | .lines |
各粒子を速度に応じた長さの 2 点線分として描画 (速度が 0 のときは 1 ピクセルの点) |
| Render as Point Sprites | .pointprites |
Point Sprite MAT と併用し、常にカメラを向く正方形ピクセルとして描画 (テクスチャ座標も自動生成) |
Behavior .behave 🔀
Behavior (動作モード) — 入力点から粒子を放出するか、元ジオメトリを変形するかを選択する
| 項目 | 内部名 | 説明 |
|---|---|---|
| Particle System | .psystem |
パーティクルシステムとして動作し、入力点から粒子を誕生させる |
Point Reuse .ptreuse ♻️
Point Reuse (点メモリの再利用) — 粒子が生成・消滅する際の内部点メモリの再利用方法を選択する
| 項目 | 内部名 | 説明 |
|---|---|---|
| Reuse Points in Loop | .loop |
消滅した粒子の点メモリをループ状に再利用する |
| Don’t Reuse Points | .none |
点メモリを再利用しない |
Attractor Use .attractmode 🧲
Attractor Use (アトラクタの適用方式) — 第 4 入力のサーフェスアトラクタをどう適用するかを選択する
| 項目 | 内部名 | 説明 |
|---|---|---|
| All Points | .all |
すべてのアトラクタ点がすべての粒子に影響する |
| Single Point per Particle | .single |
各粒子に 1 つのアトラクタ点を割り当て、その点だけが影響する (割当は点番号をアトラクタ点数で割った余りで決定) |
シミュレーション設定 ⚙️
Compute Normals .normals 🧭
– Compute Normals (法線を計算) — ジオメトリに法線を生成する
– Behavior が Modify Source Geometry のときのみ使用する
Preroll Time .timepreroll ⏪
– Preroll Time (事前計算時間) — リセット時刻に達した後、シミュレーションを何秒分スキップするかを指定 (秒)
– 例えば 33 を入れるとフレーム 1 で 33 秒後の状態を表示する (内部では先頭 32 秒分も計算されるためリセット時に遅延が出る)
Time Inc .timeinc ⏱️
– Time Inc (クック間隔) — SOP をどの頻度でクックするかを決める (デフォルトは 1 / me.time.rate で 1 フレームに 1 回)
– 複雑な力学では値を小さくしてサブフレーム精度を上げられる (例: 0.5 / me.time.rate で 1 フレームに 2 回)。1 / me.time.rate より大きくしてはいけない
Max Steps .maxsteps 🪜
– Max Steps (最大ステップ数) — 正しい相互作用のために TouchDesigner が過去にさかのぼって粒子位置を計算する上限を制限する
– フレームレートが低いときに過去計算が重くなりすぎるのを防ぐ
Jitter Births .jitter 🎲
– Jitter Births (誕生位置のゆらぎ) — 各粒子が誕生する位置ピクセルにランダムなゆらぎを与える
Accurate Moves .accurate 📐
– Accurate Moves (高精度移動) — フレーム間の粒子の軌道を端数フレーム値で計算し、より正確に移動させる
Remove Unused Points .rmunused 🧹
– Remove Unused Points (未使用点の削除) — 入力ジオメトリから未使用の点を削除する
– シミュレーション中のメモリ消去時間を節約するため、自動ではなく明示オプションとして提供されている
リセット制御 🔁
Reset .reset ⏹️
– Reset (リセット保持) — オンのあいだパーティクルシステムをリセット状態に保ち、粒子を放出しない
Reset Pulse .resetpulse ⏏️
– Reset Pulse (リセット実行) — パーティクルシステムを開始状態へ即座に初期化する
Forces Page 💨
力のパラメータ 💨
External Force .external 🌍
– External Force (外部の力) — 粒子に作用する重力などの力を X / Y / Z で指定する
– 質量に応じて加速度が決まり (F = 質量 × 加速度)、Drag が 0 のときは速度に上限なく加速する
Wind .wind 🍃
– Wind (風) — 粒子に作用する風の力を X / Y / Z で指定する (速度に依存する力)
– 粒子が既に風速に達しているときは追加の力を受けないため、風単独では風速が最大速度になる
Turbulence .turb 🌀
– Turbulence (乱流) — 各軸方向のカオス的な力の振幅を指定する (正の値を使う)
Turb Period .period 📏
– Turb Period (乱流の周期) — 値が小さいと狭い範囲で乱流が速く変化し、大きいと近接した点が似た影響を受ける
Seed .seed 🌱
– Seed (乱数シード) — パーティクルシミュレーションの乱数シード
Particles Page ✨
属性の付与 🏷️
Add Particle ID .doid 🆔
– Add Particle ID (粒子 ID を付与) — 誕生時に各粒子へ ID 番号を割り当てる
– 新しい属性はリセット時または初回ロード時にのみ現れる
Add Mass Attribute .domass ⚖️
– Add Mass Attribute (質量属性を付与) — オンにすると Mass フィールドで指定した粒子の質量を計算する
Mass .mass 🪨
– Mass (質量) — 各粒子の相対質量
– 重い粒子ほど動き出しと減速に時間がかかる
Add Drag Attribute .dodrag 🪂
– Add Drag Attribute (抵抗属性を付与) — オンにすると Drag フィールドで入力した抵抗係数を計算する
Drag .drag 🛑
– Drag (抵抗) — 各粒子の抵抗 (空気抵抗のように速度を抑える力)
誕生と寿命 🌱
Birth .birth 🐣
– Birth (誕生数) — 1 秒あたりに誕生する粒子の数
– 粒子はまとめてではなく、最初のフレーム中のランダムな時刻に誕生する
Life Expect .life ⏳
– Life Expect (寿命) — 各粒子が存在する秒数 (デフォルトは 3 秒)
– アニメーションの長さに応じて調整する
Life Variance .lifevar 🎲
– Life Variance (寿命のばらつき) — 粒子の寿命の分散 (秒)
– 寿命 1 秒で分散 0.5 のとき、半秒で消える粒子も 1.5 秒生きる粒子も現れ、自然な見た目になる
Alpha Speed .alpha 🌫️
– Alpha Speed (速度による透明度) — 粒子が速くなるほど透明にする (デフォルト 0 で速度による変化なし)
– 0.5 にすると 1 単位/秒で進む粒子が 70% の不透明度になる。速度 0 のときは常に 100% 不透明
アトラクタとパルス放出 🧲
Surface Attraction .subattract 🧲
– Surface Attraction (サーフェス吸引) — 第 4 入力のサーフェスアトラクタへ粒子をどれだけ引き寄せるかを制御する
Birth Count .birthcount 🔢
– Birth Count (パルス誕生数) — Birth パルスを押したときに生成する粒子の数を指定する
Birth .birthpulse ⏏️
– Birth (パルス放出) — パルスを押すと Birth Count で指定した数の粒子を手動で生成する
Limits Page 🚧
境界面の設定 🧱
+ Limit Plane .limitpos ➕
– + Limit Plane (正方向の境界面) — 粒子が境界面に到達すると消滅またはバウンドする
– 6 枚の境界面で立方体を定義する。デフォルトは 1000 単位とかなり大きいため、効果を見るには 1 程度に縮める
– Limit Plane .limitneg ➖
– - Limit Plane (負方向の境界面) — 粒子が境界面に到達すると消滅またはバウンドする
– 上記の正方向と合わせて 6 枚で立方体を定義する
Hit Behavior .hit 💥
Hit Behavior (衝突時の挙動) — 6 枚の境界面または衝突オブジェクトに当たったときの挙動を選択する
| 項目 | 内部名 | 説明 |
|---|---|---|
| Die on Contact | .die |
衝突入力に当たると粒子が消滅する |
| Bounce on Contact | .bounce |
衝突入力に当たると粒子がバウンドする |
| Stick on Contact | .stick |
衝突入力に粒子が付着する |
衝突時の摩擦 🪞
Gain Tangent .gaintan ↔️
– Gain Tangent (接線方向のゲイン) — 衝突時のエネルギー損失を表す摩擦パラメータのうち、面に対して接線方向の成分
Gain Normal .gainnorm ⬆️
– Gain Normal (法線方向のゲイン) — 面に対して垂直方向のエネルギー損失 (0 で全エネルギー喪失、1 で損失なし)
– 例: 0.1 と 1 で屋根の雨だれのように面に沿って流れ、1 と 0 で入射角に関わらず垂直にバウンドする
Split .splittype 🔱
Split (分裂) — 粒子が分裂するかどうか、どの条件で分裂するかを選択する
| 項目 | 内部名 | 説明 |
|---|---|---|
| No Splitting | .no |
デフォルト設定で、粒子を分裂させずそのまま保つ |
| Split on Contact | .bounce |
衝突ソースに当たったときに粒子が分裂する |
| Split on Death | .die |
粒子が消滅するときに分裂する |
分裂時の運動 🎆
Min/Max Splits .split 🔢
– Min/Max Splits (分裂数の範囲) — 粒子が分裂する際の生成数をこの最小〜最大の範囲でランダムに決める
Split Velocity .splitvel 🚀
– Split Velocity (分裂時の速度) — 分裂した各粒子に与える基準速度を X / Y / Z で指定する
Velocity Variance .splitvar 🎲
– Velocity Variance (速度のばらつき) — 分裂速度に加算するランダムな量を X / Y / Z で指定する
– 花火では分散を大きく速度を低く、雨のしぶきでは Y の速度を大きく X / Z の分散を加える、といった使い分けをする
実践アイデア 💡
Example 1: 点群から噴き上げる ✨
Grid SOP → Particle SOP (Behavior=Particle System, Birth=200, External Force Y=2, Life Expect=3) → Point Sprite MAT → Geometry COMP → Render TOP
Grid SOP の点を放出元にして Particle SOP で粒子を発生させ、上向きの外部の力で噴き上げる最小構成のパーティクルシステム。誕生数・寿命・力の関係を確認する学習の起点として頻繁に使うパターン。
- Grid SOP を配置し、放出元となる点群を用意する
- Particle SOP を後段に接続し
BehaviorをParticle Systemに設定 Birthを 200 程度、Life Expectを 3 秒に設定して粒子を発生させるExternal Forceの Y を 2 にして上向きに噴き上げ、Particle TypeをRender as Point Spritesに変更- Point Sprite MAT を割り当て、Geometry COMP / Camera COMP / Render TOP で描画結果を確認
Example 2: 床面でバウンドさせる 💥
Sphere SOP → Particle SOP (External Force Y=-9.8, - Limit Plane Y=0, Hit Behavior=Bounce, Gain Normal=0.6) → Geometry COMP
重力を表す下向きの外部の力を加えた粒子を、負方向の境界面 (床) でバウンドさせる衝突パターン。Hit Behavior と Gain Normal の組み合わせで跳ね返りの強さを調整する。
- Sphere SOP を放出元に Particle SOP を接続する
External Forceの Y を -9.8 に設定して重力で落下させる- Limit Planeの Y を 0 にして床面の境界を定義するHit BehaviorをBounce on Contactに設定するGain Normalを 0.6 程度にして跳ね返りのエネルギー損失を調整する
Example 3: 死亡時に分裂する花火 🎆
Add SOP (1 point) → Particle SOP (Split=Split on Death, Min/Max Splits=20-40, Split Velocity Y=3, Velocity Variance=2,2,2) → Geometry COMP
単一の放出点から打ち上げた粒子が寿命を迎えた瞬間に多数の子粒子へ分裂する花火表現。Split を Split on Death にし、分裂数と速度のばらつきで広がりを作る。
- Add SOP で 1 点を作り、Particle SOP の放出元にする
SplitをSplit on Deathに設定して死亡時に分裂させるMin/Max Splitsを 20〜40 にして分裂数をランダム化するSplit Velocityの Y とVelocity Varianceの X / Y / Z を調整して放射状の広がりを作る- Geometry COMP に接続して打ち上げと分裂のタイミングを確認する
関連オペレータ 🔗
類似機能OP 🔍
- Sprite SOP — テクスチャ付きスプライト点群を生成する SOP
- Metaball SOP — 粒子的な有機形状を生成する SOP
組み合わせ推奨OP 🔄
- Force SOP — Particle SOP の入力に接続して粒子へ追加の力を与える
- Spring SOP — 粒子間にバネ的な拘束を加えて挙動を拡張
- Point Sprite MAT — Render as Point Sprites の粒子へテクスチャを割り当てる
- Trail SOP — 粒子の移動軌跡を線として残して可視化
- Geometry COMP — 粒子の出力をレンダリングパイプラインへ投入
前処理・後処理SOP 🎯
Info CHOP情報 📊
Particle SOP は Info CHOP による詳細情報取得に対応しています。
ジオメトリ統計 📐
num_points: この SOP に含まれるポイント数num_prims: この SOP に含まれるプリミティブ数num_particles: この SOP に含まれるパーティクル数
GPU 転送タイミング 🎮
last_vbo_update_time: 別スレッドで SOP の CPU データを GPU 上のジオメトリデータに更新するのにかかった時間 (フレーム時間外)last_meta_vbo_update_time: 別スレッドで metaball や NURBS のようなメタサーフェスジオメトリデータを GPU に更新するのにかかった時間 (フレーム時間外)
汎用オペレータ情報 🔄
total_cooks: プロセス開始以降にこのオペレータがクックされた合計回数cook_time: 直近のクック所要時間 (ミリ秒)cook_frame: このオペレータが最後にクックされたフレーム番号warnings: このオペレータの警告数errors: このオペレータのエラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: 粒子がまったく出ない
✅ Solution:
BehaviorがParticle Systemになっているか確認 (Modify Source Geometry では粒子は放出されない)- 放出元の入力 SOP がポイントを出力しているか確認 — ポイント数が 0 だと誕生元がない
Resetがオンのままだとリセット状態に保たれて放出されないため、オフに戻すかReset Pulseで初期化する
❌ Problem: 粒子がすぐ消える / 寿命が短すぎる
✅ Solution:
Life Expect(寿命) を伸ばしてアニメーション長に合わせる (デフォルトは 3 秒)Life Varianceが大きすぎると一部の粒子が極端に早く消えるため値を見直す- 境界面に当たって消えている場合は
Hit BehaviorがDie on Contactになっていないか、+ Limit Plane/- Limit Planeが狭すぎないか確認
❌ Problem: シミュレーションが重い / カクつく
✅ Solution:
Time Incを小さくしすぎると 1 フレームに複数回クックして重くなるため、必要な精度に合わせて戻すBirth(1 秒あたりの誕生数) を下げて同時に存在する粒子数を抑えるMax Stepsを制限してフレームレート低下時の過去計算を抑え、放出元には前段で Point SOP 等で点数を絞ったジオメトリを渡す
❌ Problem: リセット時に表示が遅れる
✅ Solution:
Preroll Timeに大きな値を入れていると、先頭からその秒数分を内部計算するためリセット時に遅延が出る仕様- 学習・確認段階では
Preroll Timeを 0 にして遅延をなくす - 事前計算した状態から始めたい本番のみ Preroll Time を設定し、計算遅延を許容する運用にする
参考資料 📚
その他 🔗
- TouchDesigner Wiki — SOP 概要
- TouchDesigner Wiki — Category:SOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – Particle SOP
- TouchDesigner公式ドキュメント – Sprite SOP
- TouchDesigner公式ドキュメント – Point Sprite MAT
- TouchDesigner公式ドキュメント – Force SOP

