
概要 📖 – 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)
↓
出力: 各カテゴリのチャンネル群(姿勢・位置・トリガー値・関節角度 等)
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
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
- OpenVR CHOP の Output を「Sensor」、Orientation をオンに設定
- 出力の position / rotation チャンネルを Math CHOP で必要に応じてスケーリング
- Camera COMP の Translate / Rotate パラメータに Export で結線
- HMD の頭の動きと 3D ビューが同期する
Example 2: Vive Trackerの姿勢を転送 📍
OpenVR CHOP (Trackers, Max=2) → Select CHOP (tracker0:*) → Geometry COMP transform
- OpenVR CHOP の Output を「Trackers」、Max Trackers を必要数に設定
- First Tracker で開始番号を指定し、対象トラッカーだけに絞る
- Select CHOP で目的のトラッカーのチャンネルだけを抽出
- Geometry COMP の Transform に Export して実空間の動きを 3D オブジェクトに反映
Example 3: コントローラートリガーで Actions ベースのイベント発火 🎮
OpenVR CHOP (Actions) → Logic CHOP (threshold) → Trigger CHOP
- Output を「Actions」に設定し、必要なら Custom Actions と Action Manifest を有効化
- 出力チャンネルから Logic CHOP で閾値判定(例: トリガー > 0.5)
- Trigger CHOP で立ち上がり時にイベント信号を生成
- 演出パラメータ・SE 再生・ステートマシン遷移などに利用
Example 4: VR レンダリング用 Projection Matrix の取得 🖥️
OpenVR CHOP (Projection Matrices, Near/Far) → Render TOP camera projection
- Output を「Projection Matrices」に設定し、Near / Far を VR シーンに合わせて入力
- 左右目それぞれの 4×4 Matrix チャンネルが出力される
- Render TOP に紐づく Camera COMP の Custom Projection に Matrix を割り当て
- 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 🎯
- 前処理: Constant CHOP、Null CHOP
- 後処理: Select CHOP、Math CHOP、Filter CHOP、Logic CHOP、Trigger CHOP、Lag CHOP
Info CHOP情報 📊
OpenVR CHOP は Info CHOP による詳細情報取得に対応しています。
CHOP固有情報 🎚️
start: CHOPインターバルの開始(サンプル単位)length: CHOPのサンプル数sample_rate: フレーム毎秒のサンプルレートnum_channels: CHOPのチャンネル数time_slice: タイムスライス有効時は1、無効時は0export_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 の命名を見直す
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

