
概要 📖 – ゲームコントローラ・ジョイスティック入力
Joystick CHOPは、ゲームコントローラやジョイスティックから軸・ボタン・POV ハット・スライダーを読み取りチャンネル化する CHOPです。最大 4 個の Player(コントローラ)に対応し、軸範囲・デッドゾーン・反転設定をパラメータで一元管理できます。
主な用途 🎯
- ゲームパッド・ジョイスティックの軸入力(X / Y / Z 軸)の取得
- 回転軸入力(X Rotation / Y Rotation / Z Rotation)の取得
- ボタン入力(最大 32 ボタン)のチャンネル化
- POV ハット(最大 4 個)の方向入力取得
- スライダー入力(Slider 1 / Slider 2)と接続状態(Connected)の監視
データフロー 🔄
入力: 物理ゲームコントローラ(USB / Bluetooth)
↓
OS に認識された Player 1〜4
↓
Joystick CHOP(軸・ボタン・POV・スライダーをチャンネル化)
↓
Axis Dead Zone 適用
↓
出力: 軸・回転・ボタン・POV・スライダーチャンネル
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Control Page 🎮
Active .active 🔌
コントローラ入力の取り込みを有効化するスイッチ:
- オン: ジョイスティック・ゲームパッドからの情報を CHOP が受信
- オフ: 更新を停止し、最後の値を保持
Joystick Source .source 🕹️
OS が認識している Player 1〜4 の中から読み取り対象とするコントローラを選択:
- Default: 最初に検出されたコントローラを自動採用
- Player 1〜4: OS に提示された 4 台までの中から明示的に選択
Axis Range .axisrange 📐
軸入力の出力レンジを切り替えるメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| [-1, 1] | .negoneone |
中心 0、左/下が -1、右/上が +1(DirectInput / XInput 標準形) |
| [0, 1] | .zeroone |
中心 0.5、左/下が 0、右/上が 1 に正規化 |
軸チャンネル名 .axis_names 📛
X / Y / Z 軸および回転軸として出力するチャンネル名と反転設定
X Axis .xaxis ↔️
– X 軸位置を記録するチャンネルの名前
– 通常は左右スティックの水平方向
Y Axis .yaxis ↕️
– Y 軸位置を記録するチャンネルの名前
– 通常は左右スティックの垂直方向
Invert Y Axis .yaxisinvert 🔃
– Y 軸の符号を反転
– 上を正にしたい / フライトシム的操作にしたいときに使用
Z Axis .zaxis 🎚️
– Z 軸位置(スロットルやトリガーに割り当てられる軸)を記録するチャンネル名
X Rotation .xrot 🔄
– X 軸まわりの回転入力を記録するチャンネル名
– 一般的には右スティック水平が割り当てられる
Y Rotation .yrot 🔄
– Y 軸まわりの回転入力を記録するチャンネル名
– 一般的には右スティック垂直が割り当てられる
Invert Y Rotation .yrotinvert 🔃
– Y 回転軸の方向を反転
Z Rotation .zrot 🔄
– Z 軸まわりの回転入力を記録するチャンネル名
スライダー / ボタン / POV .slider_button_pov 🎛️
スライダー、ボタン配列、POV ハット配列のチャンネル名設定
Slider 1 .slider0 🎚️
– コントローラ上の 1 番目のスライダー位置を記録するチャンネル名
Slider 2 .slider1 🎚️
– コントローラ上の 2 番目のスライダー位置を記録するチャンネル名
Button Array .buttonarray 🔘
– ボタンチャンネル名のベース名
– 最大 32 ボタンまで取り扱い可能
POV Hat Array .povarrray 🧭
– POV ハットのチャンネル名のベース名
– 最大 4 個の POV ハットに対応
– 各 POV ハットは POVHatName_X と POVHatName_Y の 2 チャンネルに分割
POV Hat State Array .povstatearray 🧭
– POV ハットの状態(押下方向の数値表現)を記録するチャンネル名のベース名
Connected / Dead Zone .connected_deadzone 🔍
コントローラの接続状態と軸のデッドゾーン
Connected .connected 🟢
– コントローラの接続状態をレポートするチャンネルを生成
– 抜き差し検出やフェイルセーフ判定に利用
Axis Dead Zone .axisdeadzone 🛑
– スティック中央付近をデッドゾーン(中心扱い)とする範囲
– 全ての通常軸・回転軸に適用される割合(デフォルト 7%)
Channel Page 📈
Sample Rate .rate ⏲️
出力チャンネルのサンプルレート(samples / second):
- Sample Rate: チャンネルのサンプルレート(毎秒のサンプル数)
Extend Left .left ⬅️
範囲の左側(開始前)における値の補外条件
| 項目 | 内部名 | 説明 |
|---|---|---|
| Hold | .hold |
現在のチャンネル値を保持 |
| Slope | .slope |
チャンネル開始前の傾きを継続 |
| Cycle | .cycle |
チャンネルを繰り返しサイクルさせる |
| Mirror | .mirror |
1 サイクルおきに反転させて繰り返し |
| Default Value | .default |
Default Value パラメータの定数値を使用 |
Extend Right .right ➡️
範囲の右側(終了後)における値の補外条件
| 項目 | 内部名 | 説明 |
|---|---|---|
| Hold | .hold |
現在のチャンネル値を保持 |
| Slope | .slope |
チャンネル終了後の傾きを継続 |
| Cycle | .cycle |
チャンネルを繰り返しサイクルさせる |
| Mirror | .mirror |
1 サイクルおきに反転させて繰り返し |
| Default Value | .default |
Default Value パラメータの定数値を使用 |
Default Value .defval 🔢
Extend が Default Value のときに使用される定数:
- Default Value: Default Value 補外条件で使用される定数値
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: ゲームパッドで 3D カメラを操作 🎮
Joystick CHOP → Math CHOP (Range mapping) → Camera COMP (tx, ty, tz)
- Joystick CHOP の Active をオンにし、Joystick Source を Default に設定
- X Axis / Y Axis / Z Axis チャンネルを Math CHOP で適切なレンジへスケーリング
- Math CHOP の出力をカメラ COMP の tx / ty / tz に Export
- Axis Dead Zone を 7% 程度に設定して微小なドリフトを抑制
Example 2: ボタン入力でシーン切り替え 🔘
Joystick CHOP → Select CHOP (button1) → Trigger CHOP → Switch TOP
- Joystick CHOP の Button Array でボタンチャンネルを生成
- Select CHOP で目的のボタン(例: button1)のみ取り出し
- Trigger CHOP でボタン押下時のイベントを発火
- Switch TOP の index に接続して、押すたびに表示シーンを切り替える
Example 3: POV ハットで方向入力をマッピング 🧭
Joystick CHOP → POV Hat (X, Y) → Math CHOP → UI Element 移動
- Joystick CHOP の POV Hat Array に名前を設定し、
pov1_X/pov1_Yの 2 チャンネルを得る - Math CHOP で UI 要素の移動量にレンジ変換
- UI コンポーネントの translate パラメータへ Export して、十字キー的操作を実現
関連オペレータ 🔗
類似機能OP 🔍
- Mouse In CHOP — マウスの軸とボタンを CHOP 化、入力デバイスとしての位置付けが近い
- Keyboard In CHOP — キーボード押下を CHOP 化、ボタン入力の代替手段として併用される
- MIDI In CHOP — MIDI コントローラからのフェーダ・ノブ入力を CHOP 化
組み合わせ推奨OP 🔄
- Math CHOP — 軸入力のレンジ変換・スケーリングに最適
- Filter CHOP — 軸の振動やマイクロぶれを時間方向で平滑化
- Logic CHOP — ボタン同時押し判定や閾値判定に組み合わせる
- Trigger CHOP — ボタン押下のエッジ検出からエンベロープを起動
- Select CHOP — 必要なボタン・軸チャンネルだけを抜き出して扱う
前処理・後処理CHOP 🎯
- 前処理: Mouse In CHOP、Keyboard In CHOP、MIDI In CHOP、OSC In CHOP
- 後処理: Math CHOP、Filter CHOP、Logic CHOP、Trigger CHOP、Select CHOP
Info CHOP情報 📊
Joystick 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: コントローラの値が更新されない / チャンネルが 0 のまま
✅ Solution:
- Active パラメータがオンになっているかを確認
- Joystick Source が Default のとき、別のアプリ(ゲームランチャー等)が排他的にデバイスを掴んでいないかを確認
- Connected チャンネルを生成して接続状態を可視化し、抜き差しを検出
❌ Problem: スティック中央でも値が微妙に揺れる(ドリフト)
✅ Solution:
- Axis Dead Zone を増やす(デフォルト 7%、必要に応じて 10〜15% 程度に調整)
- 後段に Filter CHOP を入れて時間方向のスムージングを掛ける
- Axis Range を
[0, 1]ではなく[-1, 1]にして中心を 0 にし、Math CHOP で閾値処理しやすくする
❌ Problem: Y 軸の方向が想定と逆になる(フライトシム / FPS の感覚と合わない)
✅ Solution:
- Invert Y Axis または Invert Y Rotation をオンにする
- 後段の Math CHOP で Pre-Add や Multiply を使い、必要なら符号を反転
- 用途別(カメラ操作 / UI 操作)にプリセットを切り替えるなら Switch CHOP で複数構成を持たせる
❌ Problem: ボタンや POV ハットの数が足りない / チャンネルが見えない
✅ Solution:
- Button Array は最大 32 ボタン、POV Hat Array は最大 4 個までという CHOP の上限を確認
- Button Array / POV Hat Array のチャンネル名(ベース名)が空欄だとチャンネルが生成されないため、必ず名前を設定
- POV ハットは
POVHatName_X/POVHatName_Yの 2 チャンネルに分割される点を踏まえて Select CHOP でアクセス
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

