CPlusPlus SOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

※当サイトにはプロモーションリンクが含まれます。

CPlusPlus SOP の C++ プラグインによるジオメトリ拡張機能を示す図

記事更新の通知はXでアナウンス٩(๑❛ᴗ❛๑)
@maru6o6をフォロー

概要 📖 – C++ プラグインによるカスタム SOP 拡張

CPlusPlus SOPは、C++ で記述したプラグインを読み込み、独自のジオメトリ生成・メッシュ加工ロジックを実行する SOPです。コンパイル済みの .dll / .pluginPlugin Path に指定し、Re-Init / Unload で動的に再ロードできます。

主な用途 🎯

  • C++ で記述したカスタム SOP プラグイン(.dll / .plugin)の読み込みと実行
  • 高速なプロシージャルジオメトリ生成(フラクタル・L-System・サブディビジョン 等)の低オーバーヘッド実装
  • 外部ジオメトリライブラリ(OpenVDB / CGAL / libigl 等)と TouchDesigner の橋渡し
  • 独自ハードウェア(3D スキャナー・LiDAR・デプスセンサー)から取得したメッシュデータの直接取り込み
  • Python ベースの Script SOP では追従できないリアルタイムメッシュ生成パイプラインの最適化

データフロー 🔄

入力: 任意の上流 SOP(ある場合)

C++ プラグイン本体(execute / getOutputInfo 等のコールバック)

出力: プラグインが生成したポイント・プリミティブ群

Tips

初心者の方は、以下日本語書籍も手元にあると安心です。

まる。
まる。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!


パラメータ解説 ⚙️

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 マルチスレッド化により大量プリミティブのリアルタイム生成が可能になる。

  1. Visual Studio / clang で .dll プラグインをコンパイル(Derivative 公式 SDK SOP_CPlusPlusBase 派生)
  2. Plugin Path にコンパイル成果物の絶対パスを指定
  3. プラグイン側 execute 内でポイント・プリミティブを追加
  4. Re-Init Class でパラメータ変更時にインスタンスを再生成

Example 2: OpenVDB / CGAL によるボリュームメッシュ抽出 🔬

Volume Data → CPlusPlus SOP (OpenVDB linkage) → Geometry COMP

OpenVDB のスパースボリュームデータや CGAL の幾何アルゴリズムを CPlusPlus SOP プラグインにリンクし、TouchDesigner ネイティブには無い等値面抽出(Marching Cubes)・ブーリアン演算・サーフェスリメッシュをジオメトリとして取り出す事例。

  1. プラグインプロジェクトに OpenVDB / CGAL を静的リンク
  2. execute コールバック内で等値面抽出を実行し三角形を生成
  3. SOP_Output API でポイント・プリミティブを書き戻す

Example 3: 3D スキャナー / LiDAR デバイス連携 🔌

3D スキャナー / LiDAR → CPlusPlus SOP (ベンダー SDK ラップ) → メッシュ出力

ベンダー提供の C++ SDK しか持たない 3D スキャナーや LiDAR センサーから取得した点群・メッシュデータを、CPlusPlus SOP プラグインで包み込み TouchDesigner 上の通常の SOP として扱う事例。

  1. ベンダー SDK のヘッダ・ライブラリをプラグインプロジェクトに取り込む
  2. デバイス初期化を getInfoDATEntries 等のライフサイクルコールバックで実行
  3. 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 を確認

参考資料 📚

その他 🔗

公式リソース 📖

この記事はLLMと共に内容を執筆、更新しています。
最新バージョンとの項目差異など、情報の不一致を見つけた心優しい方はXもしくはInsta、メールなどよりサイト管理者までご連絡ください😎


まる。

お仕事のご依頼はDM又はメールにて。
━━━━━━━━━━━━━━━━━
Python/Touchdesigner/M5Stackをこよなく愛すフルスタックエンジニア。
専門は生理心理学、趣味はヨガやサウナ、EMS電気風呂などヘルスケア全般。
脳波や筋電、心拍を中心とした生体情報のセンシング&インタラクティブアートづくりがライフワーク。

普段はワントゥーテンという会社で空間演出エンジニアをしています。
リファラル採用お繋ぎできますので、我こそはという尖った方は経歴と希望職種添えてDMください(エンジニア以外、営業職等もOK)。
ご飯行きましょう。

↓日常垢
Instagram:@malmal0v0

まる。をフォローする
その他の記事はこちら
Math Combine POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED Select TOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Window COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Widget COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

タイトルとURLをコピーしました