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

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

CPlusPlus POP の C++ プラグイン読み込み機能を示す図

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

概要 📖 – 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 データ

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

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 で吸収する。

  1. ベンダー SDK と TouchDesigner POP 用 SDK の両方をリンクした .dll をビルド
  2. Plugin Path にビルド成果物のパスを指定
  3. 出力 POP を Transform POP でセンサー座標系から TouchDesigner 座標系へ変換
  4. 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 やマルチスレッドを使ってネイティブ性能を引き出せる。

  1. Sphere POP / Box POP 等で初期点群 (seed) を生成
  2. CPlusPlus POP の execute() で各点の P / v / 寿命属性を更新
  3. 後段の Particle POP やレンダリングノードに渡してビジュアライズ
  4. 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 に直接持ち込める。

  1. PCL / OpenVDB をリンクした .dll をビルドし Plugin Path に設定
  2. プラグインの execute() で入力 POP の点属性を読み取り、フィルタ後の点群を出力 POP として書き込む
  3. 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 CHOPnum_points / num_verts / num_prims を確認し、書き込みが実際に行われているか検証
  • Common PageDelete Input Attributes パターンで必要な属性まで削っていないか確認

参考資料 📚

その他 🔗

公式リソース 📖

この記事は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をコピーしました