
概要 📖 – C++ プラグインによるカスタム SOP 拡張
CPlusPlus SOPは、C++ で記述したプラグインを読み込み、独自のジオメトリ生成・メッシュ加工ロジックを実行する SOPです。コンパイル済みの .dll / .plugin を Plugin Path に指定し、Re-Init / Unload で動的に再ロードできます。
主な用途 🎯
- C++ で記述したカスタム SOP プラグイン(.dll / .plugin)の読み込みと実行
- 高速なプロシージャルジオメトリ生成(フラクタル・L-System・サブディビジョン 等)の低オーバーヘッド実装
- 外部ジオメトリライブラリ(OpenVDB / CGAL / libigl 等)と TouchDesigner の橋渡し
- 独自ハードウェア(3D スキャナー・LiDAR・デプスセンサー)から取得したメッシュデータの直接取り込み
- Python ベースの Script SOP では追従できないリアルタイムメッシュ生成パイプラインの最適化
データフロー 🔄
入力: 任意の上流 SOP(ある場合)
↓
C++ プラグイン本体(execute/getOutputInfo等のコールバック)
↓
出力: プラグインが生成したポイント・プリミティブ群
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Load Page 📋
Plugin Path .plugin 📂
ロードしたい C++ プラグインのファイルパス:
- Plugin Path: ロードしたい C++ プラグインのファイルパスを指定
Re-Init Class .reinit 🔄
Re-Init Class .reinit 🔄
– オンにするとプラグインが生成したクラスインスタンスを破棄し、新規インスタンスを再生成
– 内部状態をリセットしたい場合に使用
Re-Init Class (pulse) .reinitpulse ⚡
– パルスボタン: 1 回押下で即座にクラスを再初期化
– トグル状態を保持せず、ワンショットで再初期化したい場合に使用
Unload Plugin .unloadplugin 🚪
Unload Plugin .unloadplugin 🚪
– パラメータ値が 1 を超えるとクラスインスタンスを破棄しプラグインをアンロード
– 同じプラグインを複数の CPlusPlus SOP がロードしている場合は、すべての SOP がアンロードしないとファイルが解放されません
実践アイデア 💡
Example 1: 高速プロシージャルジオメトリ生成 🧬
CPlusPlus SOP (custom fractal/L-System plugin) → Geometry COMP → Render TOP
Python ベースの Script SOP では生成コストが嵩むハイポリゴンなフラクタルや L-System ジオメトリを、C++ プラグインで実装し毎フレーム再生成可能な速度で出力する事例。SIMD 最適化や OpenMP マルチスレッド化により大量プリミティブのリアルタイム生成が可能になる。
- Visual Studio / clang で
.dllプラグインをコンパイル(Derivative 公式 SDKSOP_CPlusPlusBase派生) Plugin Pathにコンパイル成果物の絶対パスを指定- プラグイン側
execute内でポイント・プリミティブを追加 Re-Init Classでパラメータ変更時にインスタンスを再生成
Example 2: OpenVDB / CGAL によるボリュームメッシュ抽出 🔬
Volume Data → CPlusPlus SOP (OpenVDB linkage) → Geometry COMP
OpenVDB のスパースボリュームデータや CGAL の幾何アルゴリズムを CPlusPlus SOP プラグインにリンクし、TouchDesigner ネイティブには無い等値面抽出(Marching Cubes)・ブーリアン演算・サーフェスリメッシュをジオメトリとして取り出す事例。
- プラグインプロジェクトに OpenVDB / CGAL を静的リンク
executeコールバック内で等値面抽出を実行し三角形を生成SOP_OutputAPI でポイント・プリミティブを書き戻す
Example 3: 3D スキャナー / LiDAR デバイス連携 🔌
3D スキャナー / LiDAR → CPlusPlus SOP (ベンダー SDK ラップ) → メッシュ出力
ベンダー提供の C++ SDK しか持たない 3D スキャナーや LiDAR センサーから取得した点群・メッシュデータを、CPlusPlus SOP プラグインで包み込み TouchDesigner 上の通常の SOP として扱う事例。
- ベンダー SDK のヘッダ・ライブラリをプラグインプロジェクトに取り込む
- デバイス初期化を
getInfoDATEntries等のライフサイクルコールバックで実行 Unload Pluginでデバイスを安全にクローズし再ロード可能にする
関連オペレータ 🔗
類似機能OP 🔍
- Script SOP — Python でカスタム SOP ロジックを記述(C++ より高レイヤ)
組み合わせ推奨OP 🔄
- Geometry COMP — プラグインが生成した SOP をレンダリングに投入するコンテナ
- Info CHOP — プラグインの cook 状況・ポイント数・プリミティブ数などを監視
前処理・後処理SOP 🎯
Info CHOP情報 📊
CPlusPlus 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: このオペレータのエラー数
クック統計 ⏱️
total_cooks:total_cooks— プロセス開始以降にこのオペレータがクックされた合計回数cook_time:cook_time— 直近のクック所要時間 (ミリ秒)cook_frame:cook_frame— このオペレータが最後にクックされたフレーム番号
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: プラグインがロードされない / 関数が見つからない
✅ Solution:
Plugin Pathが絶対パスで、対象.dll/.pluginが実在するか確認- プラグインのビルド構成(x64 / Release)が TouchDesigner 本体と一致しているか確認
- Derivative 公式 SDK のサンプル
SOP_CPlusPlusBase派生クラスとして適切にエクスポートされているか確認
❌ Problem: プラグインを再コンパイルしても変更が反映されない
✅ Solution:
Unload Pluginを 1 以上にしてプラグインを解放してから再ビルドする- 同じプラグインを複数の CPlusPlus SOP で参照している場合は、全インスタンスでアンロードする
Re-Init Class (reinitpulse)でクラスインスタンスのみリセットする
❌ Problem: 出力ジオメトリのポイント数 / プリミティブ数が想定と違う
✅ Solution:
- プラグイン側
executeでポイント追加 (addPoint) とプリミティブ追加 (addTriangles/addParticleSystem) を正しく呼び出しているか確認 getOutputInfoで出力サイズのヒントを返している場合、実際の生成数と整合しているか確認- 後段でInfo CHOPを接続して
num_points/num_primsを確認
参考資料 📚
その他 🔗
- TouchDesigner Wiki — SOP 概要
- TouchDesigner Wiki — Category:SOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

