
概要 📖 – 3D 座標・ベクトルの変換
Transform XYZ CHOPは、入力されたチャンネル値を 3D 座標またはベクトルとして解釈し、Translate / Rotate / Scale / Pivot 変換を適用する CHOPです。Transform Order と Rotate Order を明示的に指定でき、入力 1 から行列を受け取って合成することも可能です。
主な用途 🎯
- 3D 座標値(tx, ty, tz チャンネル)の Translate / Rotate / Scale 変換
- ベクトル値の回転・スケーリング(Translate は適用せず方向のみ変換)
- Transform Order と Rotate Order による行列乗算順序の明示的制御
- Pivot 指定による任意点を中心とした回転・スケール
- 入力 1 の Transform を変換ソースに使用し、Pre Operation(Invert / Transpose)で行列を加工
データフロー 🔄
入力 0: 座標 / ベクトルチャンネル(tx, ty, tz など)
↓
Normalize(ベクトル時の事前正規化)
↓
入力 1 の Transform Matrix と合成(Pre Operation: Invert / Transpose)
↓
Transform Page の Translate / Rotate / Scale / Pivot 適用
↓
Multiply Order で乗算順序を確定
↓
Output Page の Normalize / Un-matched Channels 処理
↓
出力: 変換後の座標 / ベクトル
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Input Page 📥
Input 0 Type .input0type 🔀
入力 0 のチャンネル値を座標として扱うかベクトルとして扱うかを決定するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Position | .position |
入力 0 の値を座標として扱う(Translate も適用される) |
| Vector | .vector |
入力 0 の値をベクトルとして扱う(Translate は適用されず、回転・スケールのみ) |
Normalize (入力側) .innormalize 📐
入力 0 がベクトルのときの事前正規化:
- Normalize: オンにすると、入力 0 がベクトルの場合に変換前に長さ 1 に正規化
Custom Input Order .custinputorder 🎛️
入力 1 の Transform/Rotate Order を Custom で上書き:
- Custom Input Order: オンにすると、入力 1 の順序を Input Page の Transform Order / Rotate Order で上書き
Transform Order (入力 1) .inxord 🔢
入力 1 の Transform を解釈するときの Translate / Rotate / Scale 適用順序
| 項目 | 内部名 | 説明 |
|---|---|---|
| Scale Rotate Translate | .srt |
T * R * S * Position(最も一般的) |
| Scale Translate Rotate | .str |
R * T * S * Position |
| Rotate Scale Translate | .rst |
T * S * R * Position |
| Rotate Translate Scale | .rts |
S * T * R * Position |
| Translate Scale Rotate | .tsr |
R * S * T * Position |
| Translate Rotate Scale | .trs |
S * R * T * Position |
Rotate Order (入力 1) .inrord 🔁
入力 1 の回転を解釈するときの X / Y / Z 軸回転の適用順序
| 項目 | 内部名 | 説明 |
|---|---|---|
| Rx Ry Rz | .xyz |
Rz * Ry * Rx の順で回転行列を合成 |
| Rx Rz Ry | .xzy |
Ry * Rz * Rx の順 |
| Ry Rx Rz | .yxz |
Rz * Rx * Ry の順 |
| Ry Rz Rx | .yzx |
Rx * Rz * Ry の順 |
| Rz Rx Ry | .zxy |
Ry * Rx * Rz の順 |
| Rz Ry Rx | .zyx |
Rx * Ry * Rz の順 |
Input 1 Pre Operation .input1preop 🔄
入力 1 の Transform を、他の Transform と合成する前に加工する単項演算
| 項目 | 内部名 | 説明 |
|---|---|---|
| None | .none |
何もしない(パススルー) |
| Invert | .invert |
Transform を逆行列に置換 |
| Transpose | .transpose |
Transform を転置(行列形式の Transform のみ有効) |
| Invert Transpose | .inverttranspose |
Invert と Transpose を同時に適用(行列形式の Transform のみ Transpose が有効) |
Transform Page 🔧
Transform Order .xord 🔢
Transform Page の Translate / Rotate / Scale を適用する順序を決定するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| Scale Rotate Translate | .srt |
T * R * S * Position(最も一般的) |
| Scale Translate Rotate | .str |
R * T * S * Position |
| Rotate Scale Translate | .rst |
T * S * R * Position |
| Rotate Translate Scale | .rts |
S * T * R * Position |
| Translate Scale Rotate | .tsr |
R * S * T * Position |
| Translate Rotate Scale | .trs |
S * R * T * Position |
Rotate Order .rord 🔁
X / Y / Z の各軸回転を合成するときの順序
| 項目 | 内部名 | 説明 |
|---|---|---|
| Rx Ry Rz | .xyz |
Rz * Ry * Rx の順で回転行列を合成 |
| Rx Rz Ry | .xzy |
Ry * Rz * Rx の順 |
| Ry Rx Rz | .yxz |
Rz * Rx * Ry の順 |
| Ry Rz Rx | .yzx |
Rx * Rz * Ry の順 |
| Rz Rx Ry | .zxy |
Ry * Rx * Rz の順 |
| Rz Ry Rx | .zyx |
Rx * Ry * Rz の順 |
Translate / Rotate / Scale / Pivot 🧮
Translate .t ➡️
– 入力座標に加算する XYZ 方向の平行移動量
– 入力 0 が Vector 型のときは適用されない
tx: X 軸方向の平行移動ty: Y 軸方向の平行移動tz: Z 軸方向の平行移動
Rotate .r 🔄
– 各軸まわりの回転角(度数法)
– 適用順序は Rotate Order パラメータで決定
rx: X 軸まわりの回転(度)ry: Y 軸まわりの回転(度)rz: Z 軸まわりの回転(度)
Scale .s 🔍
– 各軸方向のスケーリング係数
– 負の値で反転、0 で潰れる
sx: X 軸方向のスケール係数sy: Y 軸方向のスケール係数sz: Z 軸方向のスケール係数
Pivot .p 📍
– Rotate / Scale を行う基準点(XYZ 座標)
– デフォルトは原点(0, 0, 0)
px: ピボットの X 座標py: ピボットの Y 座標pz: ピボットの Z 座標
Pre Operation .preop ♻️
Transform Page 行列の Invert オプション:
- Pre Operation: オンにすると、Transform Page の行列を Invert(逆行列)してから合成
Multiply Order .multiplyorder ✖️
入力側 Transform と Transform Page 側 Transform をどの順序で乗算するか
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input, then Transform Page | .inputxformpage |
Transform Page * Input の順(入力を先に Transform Page で変換) |
| Transform Page, then Input | .xformpageinput |
Input * Transform Page の順(Transform Page を先に Input で変換) |
Output Page 📤
Un-matched Channels .unmatchedchans ❓
Transform 形式の命名規則(tx / ty / tz / rx / ry / rz / sx / sy / sz など)に一致しないチャンネルの扱い
| 項目 | 内部名 | 説明 |
|---|---|---|
| Warn | .warn |
命名規則に合わないチャンネルが見つかったら警告を出す |
| Ignore | .ignore |
命名規則に合わないチャンネルを警告なしで無視 |
| Delete | .delete |
命名規則に合わないチャンネルを削除 |
Normalize (出力側) .normalize 📐
変換後ベクトルの再正規化:
- Normalize: オンにすると、変換後のベクトルを長さ 1 に再正規化
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: オブジェクトの軌道アニメーション 🛰️
LFO CHOP (rx, ry, rz) → Transform XYZ CHOP (Pivot=原点) → Geometry COMP
LFO CHOP で生成した角度を Transform XYZ CHOP に流し、Pivot を原点に設定して任意点を中心に周回させる基本パターン。Pivot を被写体側に移すと自転、原点側に置けば公転になります。
- LFO CHOP を 3 個(rx / ry / rz)または 3 チャンネル CHOP として用意
- Transform XYZ CHOP の Rotate(r)に LFO の値を Export
- Pivot を
(0, 0, 0)に設定し原点中心の回転を有効化 - 出力チャンネル(tx, ty, tz)を Geometry COMP の Transform へ接続
- Rotate Order を
xyzからzyxへ変えてジンバルロック挙動の違いを確認
Example 2: センサー姿勢ベクトルの座標系変換 📡
Serial CHOP (acc_x, acc_y, acc_z) → Transform XYZ CHOP (Input 0 Type=Vector) → Render TOP
IMU センサーから取得した加速度ベクトルを、TouchDesigner のワールド座標系に合わせて回転変換するパターン。Vector モードでは Translate が適用されず方向のみが変換されるため、姿勢ベクトルの取扱いに適しています。
- Serial CHOP で
acc_x/acc_y/acc_zの 3 チャンネルを取得 - Transform XYZ CHOP の Input 0 Type を
Vectorに設定 - Rotate(r)でセンサー → ワールド座標系のオフセット角を設定
- Output Page の Normalize をオンにして長さを 1 に再正規化
- 得られた単位ベクトルを Render TOP のライト方向や法線として参照
Example 3: Pivot を移動させた回転スケーリング 🎯
Constant CHOP (tx, ty, tz) → Transform XYZ CHOP (Pivot=対象点, Scale=0.5) → Instancing
オブジェクト群を「ある特定の点」を基準に縮小・回転させたいときの典型パターン。Pivot を対象点に置き、Scale で縮小、Rotate で回転を加えると、Pivot を中心とした収束・拡散アニメーションが作れます。
- Constant CHOP で初期座標
tx/ty/tzを用意 - Transform XYZ CHOP の Pivot を対象点(例:
(5, 0, 0))に設定 - Scale を
(0.5, 0.5, 0.5)にして Pivot 中心に縮小 - Rotate に LFO CHOP を Export して Pivot 中心の回転を加算
- 出力を Instancing の Translate チャンネルとして Geometry COMP に接続
Example 4: 入力 1 の Transform を逆行列化して座標系を戻す ♻️
入力 CHOP → Transform XYZ CHOP (入力 1=Object CHOP, Input 1 Pre Operation=Invert) → 元座標系
Object CHOP から取得した別オブジェクトの Transform を逆行列化し、その座標系で表現された値をワールド座標系に戻すパターン。Input 1 Pre Operation の Invert / Transpose を組み合わせると、座標系の前後変換が 1 ノードで完結します。
- Object CHOP で参照対象 Geometry の Transform を取得し入力 1 に接続
- Transform XYZ CHOP の Input 1 Pre Operation を
Invertに設定 - Multiply Order を
Input, then Transform Pageに設定 - 入力 0 にローカル座標で表現された値を流し込む
- 出力にワールド座標系へ戻された値が得られる
関連オペレータ 🔗
類似機能OP 🔍
- Object CHOP — Geometry COMP 等の Transform をチャンネル化して取得(Transform XYZ の入力 1 ソース用途で多用)
- Lookup CHOP — 値域変換に特化(座標変換ではなくテーブル参照)
- Math CHOP — チャンネル単位の四則演算・Range 変換(行列変換は不可)
組み合わせ推奨OP 🔄
- LFO CHOP — Rotate に流し込む角度生成ソースとして定番
- Object CHOP — 他オブジェクトの Transform を入力 1 として受け取る
- Constant CHOP — Translate / Pivot 等の固定値ソースに使用
- Filter CHOP — Rotate / Translate に流す前にスムージング
- Trail CHOP — 変換後の軌跡を時系列で記録
前処理・後処理CHOP 🎯
Info CHOP情報 📊
Transform XYZ 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: Translate を設定しているのに位置が変わらない
✅ Solution:
- Input 0 Type が
Vectorになっていないか確認(Vector の場合 Translate は無視される) - Position として扱いたい場合は Input 0 Type を
Positionに変更 - 前段で Math CHOP 等で値域が 0 倍されていないか確認
❌ Problem: Rotate Order を変えると結果が大きく変わる / ジンバルロックが発生する
✅ Solution:
- Rotate Order は X / Y / Z の合成順序を決めるため、最終姿勢が変わるのは正常動作
- 3 軸のうち 2 軸が重なるジンバルロック回避には、Object CHOP の Quaternion 経由など別アプローチを検討
- 用途で最も自然な順序(多くは
xyz)を 1 つ選んで固定し、上流で角度を生成する側に責任を寄せる
❌ Problem: Pivot を変えても回転中心が変わらない
✅ Solution:
- Rotate / Scale が
0のままだと Pivot の効果が見えないので、まず Rotate に値を入れて確認 - Transform Order が
srt以外の場合、Pivot の影響タイミングが変わるので順序も併せて確認 - Pivot は Transform Page 内のみ有効。入力 1 側の Pivot 効果は Object CHOP 側で吸収される
❌ Problem: Un-matched Channels の警告が大量に出る
✅ Solution:
- 入力チャンネル名が
tx/ty/tz/rx等の Transform 命名規則と一致しているか確認 - Rename CHOP で命名を
tx系に揃えるか、Un-matched Channels をIgnore/Deleteに変更 - 前段の Math CHOP / Rename CHOP の出力チャンネル名を確認
❌ Problem: 入力 1 の Transform が想定外に作用する
✅ Solution:
- Multiply Order が
Input, then Transform PageとTransform Page, then Inputどちらかで合成順が変わる - Input 1 Pre Operation を
Invert/Transposeに切替えて意図と一致するか確認 - 入力 1 の Transform Order / Rotate Order が想定と違う場合は Custom Input Order を有効化して上書き
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

