
概要 📖 – パーティクルの発生と運動制御
Particle POPは、入力ポイントからパーティクルを発生させ、寿命・初期速度・質量・ドラッグなどを管理し、GPU 上で粒子シミュレーションを駆動する POPです。Feedback POP 参照で前フレームの状態を次フレームへ受け渡すフィードバックループ構造により、Force Radial POP などの後段フォースと組み合わせて時間積分的な粒子運動を表現できます。
主な用途 🎯
- パーティクルの発生と寿命管理 (Birth Rate / Life Expectancy / Random Seed で誕生数と生存時間を制御)
- 初期速度・初期質量・初期ドラッグの一括設定 (Initial Velocity / Initial Mass / Initial Drag で各粒子のスタート条件を定義)
- GPU 上での粒子シミュレーション (Force Radial POP / Transform POP と組み合わせて重力・渦・推進などの物理運動を計算)
- フィードバックループによる時間積分 (Feedback POP 参照で前フレームの状態を次フレームへ受け渡し)
- カスタム属性の付与と入力属性のリネーム (New Attribute 定義と Input Attributes コピーで下流シェーダ向けデータを構築)
データフロー 🔄
入力: ソースポイント (Point Generator POP / Sphere POP など)
↓
Particle POP (Birth Rate / Initial Velocity / Life Expectancy で粒子化) + Feedback POP 参照
↓
寿命管理されたパーティクル POP を出力
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Particles Page 📋
Feedback POP (フィードバック参照) .targetpop 🔁
次フレームへ粒子状態を再注入するためのフィードバック先 POP:
- Feedback POP:
targetpop(フィードバック先 POP) — ダウンストリームに置いた下流 POP への参照。Particle POP はここを通じて次フレームに粒子状態を再注入する。フィードバックループを構成するための必須参照。
Create Point Primitives (ポイントプリミティブ生成) .createpointprim 🟢
各パーティクルにポイントプリミティブを作成するトグル:
- Create Point Primitives:
createpointprim(ポイントプリミティブ生成) — オンにすると各粒子に対しポイントプリミティブを 1 個ずつ作成。下流でレンダリング (Geometry COMP からの点描画) に使うときに有効化
Point Id Reuse (ポイント ID の再利用方式) .pointidreuse 🔢
パーティクル死亡時にポイント ID を再利用する方式の選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| Reuse Point Ids in Loop | .loop |
Maximum Particles 上限内で ID をリングバッファ的にループして再利用 |
| Reuse First Available Point Id | .unused |
空いている最小の ID を割り当てて再利用 (ID 詰めが起きる) |
| Don’t Reuse Point Ids | .none |
ID を再利用せず常にインクリメント (Maximum Particles 到達で停止) |
Maximum Particles (最大パーティクル数) .maxparticles 📏
同時に存在できるパーティクル数の上限:
- Maximum Particles:
maxparticles(最大粒子数) — 同時生存可能なパーティクル数の上限。この値を超えると新規発生が抑制される。VRAM 消費に直結するため適切な上限が必要
Emission from (発生モード) .emissionmode 🎛️
パーティクルの発生方式の選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| Birth Rate | .rate |
Birth Rate パラメータの値で発生数を直接指定 (パーティクル/単位時間) |
| Birth Attribute | .attr |
入力ポイントの属性値で発生数を指定 (Input Birth Attribute で属性名を指定) |
Birth Rate / Birth Attribute (発生数の制御) .birthrate 🌱
単位時間あたりの発生数を決めるパラメータ群:
- Birth Rate:
birthrate(誕生率) — 1 単位時間あたりに新規発生させるパーティクル数。Emission from = Birth Rate のとき有効 - Input Birth Attribute:
birthattr(発生属性) — Emission from = Birth Attribute のとき、参照する入力ポイントの属性名。属性値が単位時間あたりの粒子発生数として使われる - Randomize Input Points:
rndinputpts(入力点シャッフル) — オンにするとソースポイントの選ばれる順序をランダム化。複数フレームにわたって偏らない発生分布を得る
Life Expectancy (寿命とランダム化) .life ⏳
粒子の寿命とそのばらつきを決めるパラメータ群:
- Life Expect:
life(寿命の平均) — 各パーティクルの平均生存時間。この時間が経過すると粒子は死亡し ID は Point Id Reuse 設定に従って扱われる - Life Variance (Fraction):
lifevariance(寿命のばらつき) — 寿命の Life Expect に対するゆらぎ割合 (0〜1)。同じ Random Seed では時間方向に分布が周期的に繰り返すため、長時間シミュでは Random Seed をアニメすると分布の単調さを回避できる - Random Seed:
randomseed(乱数シード) — 寿命ばらつきとソース位置ばらつきに使う乱数シード
Time Integration (時間積分の制御) .timeintegration ⏱️
毎フレーム位置・速度を時間積分するかのトグル:
- Enable Time Integration:
timeintegration(時間積分) — オンで位置と速度を毎フレーム時間積分。オフにすると粒子は発生位置・速度に固定され、Force POP の力ベクトルだけが計算される
Jitter (発生タイミング・位置のばらつき) .jitter 🎲
1 フレーム内の発生時刻と位置のランダム化:
- Jitter Births During Frame:
jitterbirthtime(発生時刻のゆらぎ) — オンにすると 1 フレーム内のどの瞬間に粒子が発生するかをランダム化。連続した滑らかな発生ストリームを作るのに有効 - Jitter Birth Position:
jitterbirthpos(発生位置のゆらぎ) — ソース位置の周辺の指定半径内でランダムに発生位置を散らす。点状ソースを使うときに発生位置の塊感を解消するのに使う
Initial Conditions (初期速度・質量・ドラッグ) .initial 🚀
誕生時の物理初期値 (速度・質量・ドラッグ・減衰):
- Initial Velocity:
initvelocity(初期速度ベクトル) — 各粒子の初期速度 (単位: ユニット/秒)。XYZ 成分を指定。Initial Velocity X/Y/Z (initvelocityx/initvelocityy/initvelocityz) で個別制御可能 - Initial Mass:
initmass(初期質量) — 各粒子の質量。後段の Force POP で力から加速度を求める際の分母 (F = m a) - Initial Drag:
initdrag(初期ドラッグ) — 各粒子の空気抵抗係数。値が大きいほど速度が減衰しやすくなる - Velocity Damping:
damping(速度減衰) — 毎フレーム速度に乗算される係数。値 < 1 で速度が指数的に減衰し、徐々に静止する
Simulation Control (シミュレーション制御) .simctrl 🎮
Initialize / Start / Speed / Pre-Roll / Done でシミュ全体を制御するパルス・パラメータ群:
- Initialize:
initializepulse(初期化パルス) — 入力とパラメータから POP を初期化する。完了すると接続した Info CHOP のreadyチャンネルがオンになり、Start パルス待ち状態へ遷移する - Start:
startpulse(開始パルス) — 粒子シミュレーションを開始する。Initialize 完了後に押すとフィードバックループが動き始める - Speed:
speed(シミュ速度) — シミュレーション速度倍率。スローモーション / 早送りに使う - Pre-Roll:
preroll(事前回転時間) — 初期化時に内部で空回しする時間。最初のフレーム到達時にあらかじめ "前進" した状態から開始したい場合に使う (定常状態に達した粒子分布で見せたいときに便利) - Go to Done:
donepulse(完了パルス) — 即座に "Done" 状態へ遷移する。シミュレーション終了を強制する用途
Play (再生制御) .play ▶️
フィードバックループの再生・一時停止・1 フレーム送りの制御
| 項目 | 内部名 | 説明 |
|---|---|---|
| Play | .play |
シミュレーションを継続して進行 (通常再生) |
| Step Pulse | .steppulse |
1 フレーム分だけ前進するパルス (フレーム単位デバッグに使用) |
Attributes Page 🏷️
Input Attributes (入力属性の取り込み) .attrs 📥
ソースポイント属性のコピー方針とリネーム・強制終了制御:
- Input Attributes:
attrs(取り込む入力属性) — ソースから新規パーティクルへコピーする属性名のリスト (スペース区切り、ワイルドカード可) - Rename to:
renameto(属性名の置換) — 取り込み時に属性名を別名に変更する。元属性と粒子上属性で名前を分けたいときに使用 - Use Death Attribute:
usedeathattr(死亡属性の使用) — オンにすると粒子上のdeath属性が真のとき強制的にその粒子を死亡させる。条件付き間引きに利用
New Attribute (カスタム属性の定義) .attr ✨
パーティクルに新規追加する属性のブロック定義:
- New Attribute:
attr(新規属性ブロック) — シーケンシャルブロックの開始。N 個積み重ねて複数のカスタム属性を同時定義できる - New Attribute Name:
attr0name(新規属性名) — 追加する属性の名前。あらかじめ定義された属性名 (P / N / Cd など) または任意のカスタム名から選択 - Attribute Type:
attr0type(属性の型) — 属性のデータ型 (浮動小数点・整数・ベクトルなど) を選択 - Default Value:
attr0value(デフォルト値) — 属性の初期値。最大 4 成分 (attr0value0〜attr0value3) を持ち、Attribute Type に応じて成分数が決まる
Map Page 🗺️
Mapping (属性 → パラメータ写像) .map 🔁
別 POP の属性をポイント単位で Particle POP のパラメータに割り当てる写像ブロック:
- Mapping:
map(写像ブロック) — 属性 → パラメータ写像ブロックの開始。複数積み重ねて属性ごとに異なるパラメータへ流せる - OP:
map0op(写像元 OP) — 写像元の OP 参照。デフォルトの_in0は入力 POP 自身を指す - Element:
map0element(写像元要素) — 写像元 OP のうち、写像する属性 (またはその成分。例:P.x)
Parameter (写像先パラメータ) .map0parm 🎯
属性が書き込まれる Particle POP 側のパラメータをメニューから選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| life (Life Expect) | .life |
寿命の平均値に書き込む |
| lifevariance (Life Variance) | .lifevariance |
寿命のばらつき割合に書き込む |
| damping (Velocity Damping) | .damping |
速度減衰係数に書き込む |
| initvelocity (Initial Velocity) | .initvelocity |
初期速度ベクトル (XYZ 一括) に書き込む |
| initvelocityx | .initvelocityx |
初期速度の X 成分のみに書き込む |
| initvelocityy | .initvelocityy |
初期速度の Y 成分のみに書き込む |
| initvelocityz | .initvelocityz |
初期速度の Z 成分のみに書き込む |
| initmass (Initial Mass) | .initmass |
初期質量に書き込む |
| initdrag (Initial Drag) | .initdrag |
初期ドラッグ係数に書き込む |
Combine Operation (合成方法) .map0combineop ➕
属性値と既存パラメータ値の合成方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Set | .set |
パラメータ値を属性値で 上書き |
| Multiply | .mult |
パラメータ値に属性値を 乗算 |
| Add | .add |
パラメータ値に属性値を 加算 |
Common Page 🔧
Bypass .bypass 🚫
POP の処理をスキップして入力をパススルーする設定:
- オン: 最初の入力 (input1) をそのまま出力にパススルー、POP 内部の処理を無効化
- 用途: デバッグ時に特定 POP の効果を一時的に外して比較する際に使用
Free Extra GPU Memory .freeextragpumem 🧠
蓄積した GPU メモリの解放:
- Free Extra GPU Memory パルス: 出力ポイント数が増減を繰り返した際に確保されたままの GPU メモリを明示的に解放するパルスパラメータ
- 用途: 大規模パーティクル系で出力サイズが大きく変動した後、未使用メモリを返却して VRAM を節約
Delete Input Attributes .delinputattrs 🗑️
出力属性の絞り込みパターン:
- Delete Input Attributes パターン: 出力に残したい属性名のパターン (例:
P N Cd) を指定。指定外の属性は破棄される - 用途: 下流で不要な属性を切り落として分岐ブランチを軽量化、メモリ・帯域を節約
実践アイデア 💡
Example 1: 発火の火花 🔥
Point Generator POP (発火源) → Particle POP (birthrate=200, life=0.6, lifevariance=0.4, initvelocity=(0,2,0), damping=0.95) → Force Radial POP (planar=on, planarstrength=-9.8) → Feedback POP
発火源となるソースポイントから瞬間的に多数の火花を散らす例。短い寿命 0.6 秒 + 寿命ばらつき 0.4 で粒子が次々消えていく "火花感" を出し、初期速度を上向き Y に与えて重力 (Planar Force 負値) で落下させる構成。
- Point Generator POP で発火源となる単点 (もしくは少数点) を生成
- Particle POP の
emissionmode= Birth Rate、birthrate= 200 で 1 秒に 200 個発生 life= 0.6、lifevariance= 0.4 で短寿命 + ばらつき設定initvelocityy= 2.0 で上向きの初速、damping= 0.95 で速度をわずかに減衰- 後段に Force Radial POP を接続し
planarオン +planarstrength= -9.8 で重力を表現 - Feedback POP を末端に置き、その参照を Particle POP の
targetpopに設定
Example 2: 雪の降下 ❄️
Grid POP (天井ソース) → Particle POP (emissionmode=rate, birthrate=50, life=10, jitterbirthpos=on) → Force Radial POP (Global Force = (0,-0.5,0), Wind Speed = (0.3,0,0)) → Feedback POP
天井に広げた Grid をソースに、緩やかな Birth Rate 50 で雪片を発生させ、長寿命 10 秒で空中をゆっくり漂わせる例。発生位置のジッタで天井から一様にばらまき、Force Radial POP の Global Force (重力) と Wind Speed (横風) を組み合わせて緩やかな降雪表現を作る。
- Grid POP で天井相当の平面ソースポイントを生成
- Particle POP の
emissionmode= Birth Rate、birthrate= 50 life= 10、lifevariance= 0.2 で寿命を長めにjitterbirthposをオンにして発生位置を Grid 全体にばらまく- 後段 Force Radial POP の
globforcey= -0.5 で弱い重力、windspeedx= 0.3 で横風を追加 - Feedback POP を経由してフィードバックループを閉じる
Example 3: 属性駆動の発生数制御 🎯
Noise POP (各ポイントに birthrate 属性を付与) → Particle POP (emissionmode=attr, birthattr=birthrate) → Feedback POP
ソース POP の各ポイントに Noise POP や Attribute POP で birthrate 属性を計算しておき、Particle POP の emissionmode = Birth Attribute で属性値を発生数として読ませる例。発生量を空間的に変化させたいシーン (高密度ホットスポット、密度マップ駆動) で使う。
- ソース POP (Grid / Sphere など) を用意し各ポイントを発生候補に
- Noise POP / Attribute POP で各ポイントに
birthrate属性を計算 - Particle POP の
emissionmode= Birth Attribute を選択 birthattr= "birthrate" を指定 (属性名と完全一致が必要)- Feedback POP でフィードバックを閉じる
関連オペレータ 🔗
類似機能OP 🔍
- None — Particle POP は POP ファミリー内で唯一の GPU パーティクル発生器。類似機能 OP は存在しません。
組み合わせ推奨OP 🔄
- Force Radial POP — 発生したパーティクルに放射状・軸方向・螺旋・平面の力を加える物理フォース
- Transform POP — パーティクル位置全体に平行移動・回転・スケールを適用
- Attribute POP — パーティクルに任意属性 (色・サイズ等) を追加・編集
- Attribute Combine POP — 複数属性を演算で合成 (速度と外力を加算するなど)
- Noise POP — 発生数や属性に乱流的ノイズを加える
- Random POP — 粒子属性にランダム値を割り当てる (個性付け)
- Lookup Attribute POP — 他 POP の属性を ID 経由でルックアップして取得
- GLSL POP — GLSL シェーダでカスタム粒子ロジックを実装
- Cache POP — シミュ結果をフレームキャッシュして再生・編集
- File Out POP — パーティクルの各フレームをファイル出力 (アーカイブ・再利用)
前処理・後処理POP 🎯
- 前処理: Point Generator POP、Grid POP、Sphere POP、Box POP、Circle POP、Noise POP
- 後処理: Force Radial POP、Transform POP、Attribute POP、Cache POP、Convert POP、File Out POP
Info POP情報 📊
Particle POP は Info CHOP / Info DAT による詳細情報取得に対応しています。
POP固有情報 ✨
num_verts: POP に含まれる頂点 (vertex) 数num_points: POP に含まれるポイント数num_prims: POP に含まれるプリミティブ数
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号cook_abs_frame: 最後にクックされた絶対フレーム番号 (アプリケーション起動からの累積)cook_start_time: 最後のクック開始時刻 (ミリ秒)cook_end_time: 最後のクック終了時刻 (ミリ秒)cooked_this_frame: 現フレームでクックされたか (0 / 1)warnings: 警告数errors: エラー数gpu_memory: Particle POP が確保している GPU メモリ使用量。Maximum Particles に比例して増加
シミュレーション状態 🧪
ready: Initialize パルスによる初期化が完了し、Start パルスを受け付けられる状態か (真理値)running: 現在シミュレーションが進行中か (Play 状態かつ Done に到達していない)done: シミュレーションが終了状態かどうか (Go to Done パルスや内部条件で真になる)
粒子数・属性数 🧩
num_points: 現在生存しているパーティクル数。発生・死亡で時々刻々変化するnum_attributes: 出力 POP が保持する属性の総数 (Input Attributes + New Attribute で定義した属性の合計)
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: パーティクルが発生しない / Start を押しても進まない
✅ Solution:
targetpop(Feedback POP 参照) が空または不正な POP を指していないか確認。フィードバックループが閉じていないとシミュは進行しない- Initialize パルスを押した後に Start パルスを押す順序を守る。Info CHOP の
readyチャンネルがオンになるまで待つ maxparticles= 0 や非常に小さい値になっていないか確認 (上限ゼロでは発生できない)emissionmode= Birth Attribute の場合、ソースにbirthattrで指定した属性が実際に存在し非ゼロ値を持っているか Info DAT で確認
❌ Problem: パーティクルが画面に出ない / レンダリングされない
✅ Solution:
createpointprimをオンにしてポイントプリミティブを作成しているか確認 (オフではポイントとしては描画されない)- Geometry COMP 経由でレンダリングし、POP を Geometry の中で参照しているか確認
- Particle POP 出力後に Convert POP / Transform POP を挟む構成の場合、最終 POP が Geometry COMP の SOP/POP 入力に接続されているかチェック
- Info DAT で
num_pointsが 0 でないか (= そもそも粒子が存在しているか) を確認
❌ Problem: パーティクルが瞬時に消えてしまう / 寿命が短すぎる
✅ Solution:
life(Life Expect) が想定より小さくないか。秒単位なので 0.1 などにすると一瞬で消えるlifevarianceが 1 に近いと寿命のばらつきが極端になり、想定外に短命な粒子が発生する。0.2〜0.4 程度に抑えるusedeathattrがオンでdeath属性が誤って真になっていないか入力側で確認dampingの影響で速度が早期に消える場合、見た目の動き喪失と寿命切れを混同していないか切り分け
❌ Problem: Map で属性が反映されない / パラメータ駆動できない
✅ Solution:
map0opが正しい OP を指しているか確認。デフォルトの_in0は入力 POP 自身map0elementに指定した属性名が写像元 OP に実在するか Info DAT で確認 (大文字小文字を含めて完全一致)map0parmが書き込みたい先のパラメータと一致しているか (例: 初期速度 X だけに写像したいならinitvelocityx)map0combineopが Set 以外 (Multiply / Add) のとき、元のパラメータ値とのスケール関係を確認
参考資料 📚
その他 🔗
- TouchDesigner Wiki — POP 概要
- TouchDesigner Wiki — Category:POPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – Particle POP
- TouchDesigner公式ドキュメント – Force Radial POP
- TouchDesigner公式ドキュメント – Info CHOP

