
概要 📖 – C++ プラグインで高速・低レベルなカスタム POP を実装
CPlusPlus POPは、コンパイル済の C++ プラグインを読み込み、カスタムロジックでポイント / 頂点 / プリミティブを生成・加工する POPです。Plugin Path で .dll / .dylib ファイルを指定すると、プラグイン内のクラスインスタンスが生成されクックごとにコールバックが呼ばれます。
主な用途 🎯
- 高パフォーマンスなカスタム POPをコンパイル済 C++ プラグイン (
.dll/.dylib) として実装 - 大規模ポイントクラウド処理 (LiDAR / 深度センサーの数十万点) を Python では速度不足な場合に C++ で実装
- 外部 C++ ライブラリ統合 (PCL / OpenVDB / Eigen 等のジオメトリ / 数値計算ライブラリを POP として取り込み)
- 独自パーティクルソルバや物理シミュレーションのネイティブ実装
- クロスプラットフォーム配布可能な再利用 POP コンポーネントの作成
データフロー 🔄
入力: 任意の POP データ (オプションの入力 POP)
↓
C++ プラグイン (execute()等のコールバックで点群処理)
↓
出力: プラグインが構築した POP データ
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
CPlusPlus Page 📋
プラグイン読み込み 📦
Plugin Path .plugin 📂
– 読み込む C++ プラグインのファイルパス (Windows: .dll / macOS: .dylib)
– パスは絶対パスまたは .toe ファイルからの相対パスで指定
– プラグインは POP 用ベースクラスを継承したクラスを公式エクスポート関数経由で公開する必要がある
Re-Init Class .reinit 🔁
– On (1) にすると、プラグインが作成したクラスのインスタンスを破棄して新規に生成し直す
– 内部状態をリセットしたい時 / プラグインを差し替えた後に使用
Re-Init Class (Pulse) .reinitpulse ⚡
– パルスで即座にクラスインスタンスを再生成
– トグル reinit を保持せず 1 回だけ再初期化したい場合に便利
Unload Plugin .unloadplugin 🚫
– パルスで現在のクラスインスタンスを破棄 + プラグインファイルをアンロード
– 同じプラグインを複数 POP で読み込んでいる場合は、それら全てがアンロードしないとファイルは解放されない
– 再コンパイルした .dll / .dylib で上書きしたい時に必要 (Windows はロード中ファイル上書き不可)
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: 外部 LiDAR SDK からの点群ストリーミング 📡
External LiDAR SDK → CPlusPlus POP (Plugin Path = lidar_ingest.dll) → Transform POP → Render TOP
サードパーティの LiDAR SDK (Velodyne / Ouster 等) を C++ プラグインで直接叩き、毎フレーム数十万点をネイティブ速度で POP データに変換するフロー。Python 経由のラッパーでは追いつかないスループットを CPlusPlus POP で吸収する。
- ベンダー SDK と TouchDesigner POP 用 SDK の両方をリンクした
.dllをビルド Plugin Pathにビルド成果物のパスを指定- 出力 POP を Transform POP でセンサー座標系から TouchDesigner 座標系へ変換
- Render TOP で点群を可視化、必要に応じて Convert POP で SOP / メッシュへ変換
Example 2: カスタムパーティクルソルバの C++ 実装 ✨
Sphere POP (seed) → CPlusPlus POP (custom solver) → Particle POP → Geometry COMP
汎用 Particle POP では表現できない独自の力場や衝突ロジックを C++ で実装し、毎フレーム数万点の位置 / 速度 / 寿命属性を更新するソルバを CPlusPlus POP として配置する例。SIMD やマルチスレッドを使ってネイティブ性能を引き出せる。
- Sphere POP / Box POP 等で初期点群 (seed) を生成
- CPlusPlus POP の
execute()で各点のP/v/ 寿命属性を更新 - 後段の Particle POP やレンダリングノードに渡してビジュアライズ
Re-Init Classパルスでシミュレーション状態をリセット可能にしておく
Example 3: PCL / OpenVDB による点群フィルタリング 🧮
In POP → CPlusPlus POP (Plugin Path = pcl_filter.dll) → Out POP
Point Cloud Library (PCL) や OpenVDB のフィルタ (Statistical Outlier Removal / Voxel Grid Downsampling 等) を C++ プラグインに包み、入力点群を整形してから後段に流すフロー。既存の数値計算資産を TouchDesigner に直接持ち込める。
- PCL / OpenVDB をリンクした
.dllをビルドしPlugin Pathに設定 - プラグインの
execute()で入力 POP の点属性を読み取り、フィルタ後の点群を出力 POP として書き込む Delete Input Attributesで下流に不要な属性 (例: 中間 normal) を破棄
関連オペレータ 🔗
類似機能OP 🔍
- GLSL POP — GPU シェーダで POP を実装する版。CPU 重処理は CPlusPlus / GPU 並列処理は GLSL という棲み分け
- CPlusPlus CHOP — CHOP family の C++ プラグイン版
- CPlusPlus TOP — TOP family の C++ プラグイン版
- CPlusPlus SOP — SOP family の C++ プラグイン版
- CPlusPlus DAT — DAT family の C++ プラグイン版
組み合わせ推奨OP 🔄
- Transform POP — プラグイン出力の座標系を後段で正規化 / 移動 / 回転
- Convert POP — プラグインが生成した POP を SOP やメッシュへ変換
- Particle POP — プラグインが seed した点群を後段の標準パーティクル系で展開
- Render TOP — プラグイン出力の点群を 3D ビューに描画
- Info CHOP — プラグイン出力の
num_points/num_prims等をモニタ
前処理・後処理POP 🎯
Info CHOP情報 📊
CPlusPlus POP は Info CHOP による詳細情報取得に対応しています。
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: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: プラグインが読み込まれない / Error: could not load plugin
✅ Solution:
Plugin Pathが正しいファイルを指しているか確認 (絶対パスで一度試す)- プラグインのアーキテクチャが TouchDesigner と一致しているか確認 (現行 TouchDesigner は 64bit のみサポート)
- プラグインが依存する DLL (PCL / OpenVDB / boost 等) がシステム PATH または同フォルダに存在するか確認
❌ Problem: プラグインを差し替えても変更が反映されない
✅ Solution:
Unload Pluginパルスを押してプラグインファイルをアンロードしてから再ビルド・上書き- Windows ではロード中の
.dllは上書き不可。同じプラグインを読んでいる他の CPlusPlus POP も全て Unload する必要あり Re-Init Classパルスでクラスインスタンスを再生成して内部状態をリセット
❌ Problem: プラグイン内で例外が起きると TouchDesigner ごとクラッシュする
✅ Solution:
- プラグイン側で
try / catchで例外を全捕捉し、戻り値 / エラーログで通知する設計に変更 - デバッグ時は Visual Studio / Xcode から TouchDesigner プロセスにアタッチしてブレークポイントを設定
- GPU 並列で済むロジックは先に GLSL POP で試し、本当に CPU 側 C++ が必要な部分だけ CPlusPlus POP に絞る
❌ Problem: 出力 POP のポイント数が 0 / 期待した数にならない
✅ Solution:
- プラグインの
execute()内で出力バッファを正しく確保・書き込みしているか確認 - Info CHOP で
num_points/num_verts/num_primsを確認し、書き込みが実際に行われているか検証 Common PageのDelete Input Attributesパターンで必要な属性まで削っていないか確認
参考資料 📚
その他 🔗
- TouchDesigner Wiki — POP 概要
- TouchDesigner Wiki — Category:POPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

