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

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

Joystick CHOP のゲームコントローラ入力を示す図

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

概要 📖 – ゲームコントローラ・ジョイスティック入力

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・スライダーチャンネル

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

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_XPOVHatName_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)
  1. Joystick CHOP の Active をオンにし、Joystick Source を Default に設定
  2. X Axis / Y Axis / Z Axis チャンネルを Math CHOP で適切なレンジへスケーリング
  3. Math CHOP の出力をカメラ COMP の tx / ty / tz に Export
  4. Axis Dead Zone を 7% 程度に設定して微小なドリフトを抑制

Example 2: ボタン入力でシーン切り替え 🔘

Joystick CHOP → Select CHOP (button1) → Trigger CHOP → Switch TOP
  1. Joystick CHOP の Button Array でボタンチャンネルを生成
  2. Select CHOP で目的のボタン(例: button1)のみ取り出し
  3. Trigger CHOP でボタン押下時のイベントを発火
  4. Switch TOP の index に接続して、押すたびに表示シーンを切り替える

Example 3: POV ハットで方向入力をマッピング 🧭

Joystick CHOP → POV Hat (X, Y) → Math CHOP → UI Element 移動
  1. Joystick CHOP の POV Hat Array に名前を設定し、pov1_X / pov1_Y の 2 チャンネルを得る
  2. Math CHOP で UI 要素の移動量にレンジ変換
  3. 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 🎯


Info CHOP情報 📊

Joystick 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: コントローラの値が更新されない / チャンネルが 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 でアクセス

参考資料 📚

その他 🔗

公式リソース 📖

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