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

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

OpenVR CHOP の VR デバイス入力機能を示す図

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

概要 📖 – VR ヘッドセット・トラッカー入力

OpenVR CHOPは、OpenVR 経由で VR ヘッドセット・コントローラー・トラッカー・スケルトンの状態をチャンネル化する CHOPです。Output パラメータで取得カテゴリを切替え、Sensor 姿勢・トラッカー Transform・Projection Matrix・Frame Timings・Actions・Skeletons を 1 オペレータで扱えます。

主な用途 🎯

  • VR ヘッドセット (HMD) のセンサー姿勢・位置データの取得
  • Vive Tracker やコントローラーのトランスフォーム取得
  • VR レンダリング用の左右目別 Projection Matrix 取得
  • OpenVR Actions マニフェストからのコントローラー入力チャンネル化
  • 手の Skeleton(指関節)データの取得とインタラクション制御

データフロー 🔄

入力: OpenVR ドライバ(HMD / コントローラー / トラッカー / スケルトン)

Output モード選択(Sensor / Trackers / Projection Matrices / Frame Timings / Actions / Skeletons)

出力: 各カテゴリのチャンネル群(姿勢・位置・トリガー値・関節角度 等)

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

Setup Page 📋

Active .active 🟢

Active .active 🟢
– OpenVR ドライバへのデータ問い合わせを有効化するトグル
– オフにすると CHOP は出力を更新せず、OpenVR ランタイムの起動も発生しない

Output .output 📤

OpenVR から取得するデータカテゴリを決定するメニューパラメータ

項目 内部名 説明
Sensor .sensor HMD のセンサー姿勢・レンダー解像度・プレイエリアサイズ等の一般情報を出力
Projection Matrices .projmatrices 左右目それぞれの Projection Matrix を出力
Trackers .trackers トラッカー(Vive Tracker / コントローラー)の状態・Transform を出力
Frame Timings .frametimings フレームレンダリングに関する一般情報(タイミング統計)を出力
Actions .actions OpenVR Actions マニフェストで定義されたアクションチャンネルを出力
Skeletons .skeletons 手の Skeleton(指関節)情報を出力。Finger Tip Bones は OpenVR では非対応

トラッカー範囲指定 🎯

Max Trackers .maxtrackers 🔢
– このノードから出力するトラッカーデータの最大個数
– 必要分だけに絞ることでチャンネル数とクック負荷を抑制

First Tracker .firsttracker ▶️
– 出力対象とする最初のトラッカー番号
– 例: First Tracker=2 / Max Trackers=2 のとき、トラッカー 2 と 3 のデータを出力

Sensor 出力切替 📡

Orientation .orientation 🧭
– Output が Sensor のとき、Orientation チャンネルを出力するか
– デフォルトでは Orientation の単位は 1 unit = 1 meter

General Info .generalinfo ℹ️
– Output が Sensor のとき、一般情報チャンネルを出力するか
– レンダー解像度・プレイエリアサイズ等が含まれる

Projection Matrices パラメータ 📐

Near .near 📥
Projection Matrices 出力時の近クリップ面
– この値で Projection Matrix が構築される

Far .far 📤
Projection Matrices 出力時の遠クリップ面
– この値で Projection Matrix が構築される

スケール調整 📏

Unit Scale .unitscale 📏
– OpenVR のデフォルト単位(1 unit = 1 meter)を任意のスケールに変換
– 別スケールでインポートされたシーンに合わせるために使用

Custom Actions 設定 🛠️

Custom Actions .customactions 🔀
– 独自の OpenVR Actions マニフェストファイル指定を有効化するトグル
– オフのときは OpenVR デフォルトのマニフェストが使われる

Action Manifest .actionmanifest 📄
– OpenVR Actions マニフェストファイルのパス
Custom Actions 無効時はデフォルトマニフェストが使われる

Use Legacy Names .uselegacynames 🗂️
– Action Manifest から取得するチャンネルに旧命名規則を適用
– 既存の古いプロジェクトを読み込む場合以外は基本オフのまま

Skeleton Range .skeletonrange

Skeleton の可動域モードを決定するメニューパラメータ

項目 内部名 説明
With Controller .withcontroller コントローラーの形状を考慮した Skeleton を出力。コントローラーを握っている見た目になる
Without Controller .withoutcontroller コントローラーを無視して Skeleton を出力。完全に握り込んだ拳の表現が可能

Common Page 🔧

Time Slice .timeslice ⏱️

Time Slice モードの強制設定:

  • オン: チャンネルを「タイムスライス」モードに強制
  • タイムスライス: 前回のクックフレームから現在のクックフレームまでの時間

Scope .scope 🎯

影響を受けるチャンネルの絞り込み:

  • Scope 文字列: 影響を受けるチャンネルを指定する文字列
  • パターンマッチング: *[1-10] 等のパターンが使用可能

Sample Rate Match .srselect

複数の入力 CHOP のサンプルレートが異なる場合の処理方法

項目 内部名 説明
Resample At First Input’s Rate .first 最初の入力のレートで他をリサンプル
Resample At Maximum Rate .max 最高サンプルレートでリサンプル
Resample At Minimum Rate .min 最低サンプルレートでリサンプル
Error If Rates Differ .err レート不一致でエラー

Export Method .exportmethod 📤

CHOP チャンネルをパラメータに接続する方法

項目 内部名 説明
DAT Table by Index .datindex DAT テーブルのインデックスでチャンネルとパラメータを対応付け
DAT Table by Name .datname DAT テーブルの行名でチャンネルとパラメータを対応付け
Channel Name is Path:Parameter .autoname チャンネル名を `path:parameter` 形式で記述し直接対応付け

Export Root .autoexportroot 🌳

Channel Name is Path:Parameter モード時のパス基点:

  • Export Root パス: autoname モードでチャンネル名のパス部分を相対化する基点 OP のパス

Export Table .exporttable 📋

DAT Table エクスポート方式での参照 DAT:

  • Export Table DAT: datindex / datname モード時に参照する DAT のパス

Rename from .commonrenamefrom 🔤

リネーム対象チャンネルのパターン:

  • Rename from パターン: リネーム対象とするチャンネル名のパターンマッチング文字列

Rename to .commonrenameto 🔁

リネーム後の置換パターン:

  • Rename to パターン: Rename from にマッチしたチャンネルの新しい名前パターン (デフォルトはリネームなし)

実践アイデア 💡

Example 1: HMD 姿勢を 3D シーンカメラに反映 🥽

OpenVR CHOP (Sensor) → Math CHOP (Unit Scale) → Camera COMP transform
  1. OpenVR CHOP の Output を「Sensor」、Orientation をオンに設定
  2. 出力の position / rotation チャンネルを Math CHOP で必要に応じてスケーリング
  3. Camera COMP の Translate / Rotate パラメータに Export で結線
  4. HMD の頭の動きと 3D ビューが同期する

Example 2: Vive Trackerの姿勢を転送 📍

OpenVR CHOP (Trackers, Max=2) → Select CHOP (tracker0:*) → Geometry COMP transform
  1. OpenVR CHOP の Output を「Trackers」、Max Trackers を必要数に設定
  2. First Tracker で開始番号を指定し、対象トラッカーだけに絞る
  3. Select CHOP で目的のトラッカーのチャンネルだけを抽出
  4. Geometry COMP の Transform に Export して実空間の動きを 3D オブジェクトに反映

Example 3: コントローラートリガーで Actions ベースのイベント発火 🎮

OpenVR CHOP (Actions) → Logic CHOP (threshold) → Trigger CHOP
  1. Output を「Actions」に設定し、必要なら Custom Actions と Action Manifest を有効化
  2. 出力チャンネルから Logic CHOP で閾値判定(例: トリガー > 0.5)
  3. Trigger CHOP で立ち上がり時にイベント信号を生成
  4. 演出パラメータ・SE 再生・ステートマシン遷移などに利用

Example 4: VR レンダリング用 Projection Matrix の取得 🖥️

OpenVR CHOP (Projection Matrices, Near/Far) → Render TOP camera projection
  1. Output を「Projection Matrices」に設定し、Near / Far を VR シーンに合わせて入力
  2. 左右目それぞれの 4×4 Matrix チャンネルが出力される
  3. Render TOP に紐づく Camera COMP の Custom Projection に Matrix を割り当て
  4. HMD 用の左右目別レンダリングが正しい視野で出力される

関連オペレータ 🔗

類似機能OP 🔍

  • Oculus Rift CHOP — Oculus SDK 直結の HMD/コントローラー入力(OpenVR を介さない)

組み合わせ推奨OP 🔄

  • Select CHOP — 膨大な OpenVR チャンネルから必要なトラッカー・関節だけを抜き出す
  • Math CHOP — Unit Scale 後段のスケーリング・座標系反転・オフセット適用
  • Logic CHOP — Actions のボタン・トリガー値を閾値判定して on/off 化
  • Trigger CHOP — 立ち上がりイベントから ADSR / SE / 状態遷移を起動
  • Filter CHOP — ヘッドセット・トラッカーの微振動を時間方向にスムージング

前処理・後処理CHOP 🎯


Info CHOP情報 📊

OpenVR CHOP は Info CHOP による詳細情報取得に対応しています。

CHOP固有情報 🎚️

  • start: CHOPインターバルの開始(サンプル単位)
  • length: CHOPのサンプル数
  • sample_rate: フレーム毎秒のサンプルレート
  • num_channels: CHOPのチャンネル数
  • time_slice: タイムスライス有効時は1、無効時は0
  • export_sernum: Export接続の更新回数

汎用オペレータ情報 🔄

  • total_cooks: プロセス開始からのクック回数
  • cook_time: 最後のクック時間(ミリ秒)
  • cook_frame: 最後にクックされたフレーム番号
  • warnings: 警告数
  • errors: エラー数

トラブルシューティング ⚠️

よくある問題と解決策 🔧

❌ Problem: OpenVR CHOP から値が出ない / すべて 0 になる
✅ Solution:

  • Active パラメータがオンになっているか確認(オフのときは OpenVR ランタイムへの問い合わせが行われない)
  • SteamVR が起動し HMD が認識されているか、SteamVR ステータスウィンドウで確認
  • Output モードが目的データ(Sensor / Trackers / Actions 等)に合っているかを再確認

❌ Problem: トラッカーのチャンネルが足りない / 想定したものと違う
✅ Solution:

  • Max Trackers を実際の接続数以上に設定し、出力対象を広げる
  • First Tracker を 0 から順に変えて、どの番号がどのデバイスに対応するか確認
  • 後段の Select CHOP で必要なチャンネル名パターンに絞り込む

❌ Problem: シーンの単位と HMD のスケールが合わず移動量が違和感のある大きさになる
✅ Solution:

  • Unit Scale でシーン側の単位に合わせる(OpenVR は既定で 1 unit = 1 meter)
  • 後段で Math CHOP による線形スケーリング(Multiply)で個別調整
  • Camera COMP / Geometry COMP 側の Scale パラメータと二重に係っていないか確認

❌ Problem: Actions の出力チャンネル名が想定と違う
✅ Solution:

  • Custom Actions をオンにして Action Manifest に正しい JSON パスを指定
  • Use Legacy Names が不要にオンになっていないか確認(既定オフ)
  • OpenVR Actions マニフェストの定義側で action set / action の命名を見直す

参考資料 📚

その他 🔗

公式リソース 📖

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