
概要 📖 – ボーンの逆運動学(IK)解析
Handle CHOPは、ボーンの逆運動学(IK)を解いて各ボーンの回転チャンネル(rx / ry / rz)を出力する CHOPです。Source に指定したボーンチェーンに対して目標位置への到達解を計算し、関節角度をリアルタイムに出力します。
主な用途 🎯
- ボーンチェーンの逆運動学(IK)ソルバとして関節角度を算出
- Source ボーンの末端位置を目標へ追従させる回転チャンネル(rx / ry / rz)の生成
- Fixed パラメータで複数ボーンを 1 ユニットとして扱う関節制御
- Iterations と Max Angle Change によるソルバ精度・安定性の調整
- Init Frame と Preroll を使ったキャラクタリグの初期姿勢リセット
データフロー 🔄
入力: ボーン階層・目標位置
↓
IK ソルバ(Iterations / Max Angle Change で収束)
↓
Source / Fixed の解釈
↓
Init Frame / Preroll で初期化
↓
出力: 各ボーンの rx / ry / rz チャンネル
Tips
初心者の方は、以下日本語書籍も手元にあると安心です。
リンク
リンク

まる。
実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Handle Page 📋
Source .source 🦴
IK ソルバの対象ボーン指定:
- Source ボーン: リストアップした各ボーンに対して
rx/ry/rzチャンネルを生成
Fixed .fixed 🔗
ユニットとして扱うボーン群の指定:
- Fixed ボーン: 肩で 2 本に分岐するようなボーン構造で、分岐元を 1 ユニットとして回転させたい場合に指定
Iterations .iterations 🔁
ソルバ反復回数(精度 vs クック時間):
- 反復回数: 値を増やすとより正確な解が得られるが、クック時間も増加する
Init Frame .init ⏮️
デフォルト姿勢へのリセットフレーム:
- 初期化フレーム: 指定フレームでボーンがデフォルト rest 角度に戻る
Preroll .preroll ⏪
初期化フレームでの事前反復回数:
- Preroll 回数: Init Frame において事前に解く反復回数。初期姿勢を安定させたいときに増やす
Max Angle Change .delta 📐
1 フレームあたりの最大回転角度(解の暴れ抑制):
- 最大角度変化: 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: ボーンチェーンを目標位置に追従させる IK 制御 🎯
Bone COMP(階層)→ Handle CHOP(Source 指定)→ Bone の回転パラメータへ Export
- Bone COMP を親子階層で構築(例: 肩 → 肘 → 手首)
- Handle CHOP の Source に末端ボーン(手首)までのチェーンを指定
- 目標位置を Bone の Translate に与え、Handle CHOP 出力の rx / ry / rz を各 Bone の回転に Export
- 目標位置を動かすと、関節角度がリアルタイムに解かれ末端が追従する
Example 2: 腕の関節を Fixed 指定で 1 ユニット回転させる 🦾
Bone 階層 → Handle CHOP(Source + Fixed)→ Bone 回転チャンネル
- 肩から枝分かれする腕構造で、肩関節を Source、上腕を Fixed に指定
- Iterations を 10 程度に設定して解の精度を確保
- Max Angle Change を 5 度程度に絞り、急激な振動を抑制
- 肩のひねりが上腕全体を 1 ユニットとして駆動する自然な動作になる
Example 3: Init Frame と Preroll で初期姿勢をリセット ⏮️
Handle CHOP(Init Frame / Preroll 設定)→ Bone 回転 → 安定した初期姿勢
- Init Frame を 1 に設定し、フレーム 1 でボーンが rest 角度に戻るようにする
- Preroll を 20 程度に設定し、初期化フレームで事前にソルバを 20 回反復
- Max Angle Change で過度な角度変化を制限し、起動直後の暴れを防止
- シーン再生開始時に常に同じ姿勢から始まるリグが得られる
関連オペレータ 🔗
類似機能OP 🔍
- Kinect CHOP — Kinect センサー由来の骨格データから関節回転を取得(外部入力ベースの IK 代替)
組み合わせ推奨OP 🔄
- Filter CHOP — Handle 出力の rx / ry / rz をスムージングして急峻な角度変化を抑える
- Lag CHOP — 目標位置や出力角度に遅延を加えて自然な追従感を出す
- Math CHOP — 出力角度のスケーリング・オフセット・範囲変換
- Limit CHOP — 関節角度の可動域に上限・下限を設けて破綻を防ぐ
- Trail CHOP — 出力角度の時間履歴を可視化してデバッグ
前処理・後処理CHOP 🎯
Info CHOP情報 📊
Handle 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: ボーンが目標位置に届かない / 解が収束しない
✅ Solution:
- Iterations の値を増やしてソルバの反復回数を上げる(精度とクック時間のトレードオフ)
- Source に指定したボーンチェーンの長さに対して目標位置が遠すぎないか確認
- Max Angle Change を一時的に大きくして 1 フレームの可動範囲を広げる
❌ Problem: ボーンが急激に振動・痙攣する
✅ Solution:
- Max Angle Change を小さくして 1 フレームあたりの回転角度を制限
- 後段に Filter CHOP を入れて出力角度をスムージング
- 目標位置の変動が激しい場合は前段に Lag CHOP を入れて入力をなだらかにする
❌ Problem: シーン再生開始時の初期姿勢が安定しない
✅ Solution:
- Init Frame を再生開始フレームに設定してデフォルト rest 角度から始める
- Preroll を 20〜50 程度に増やして初期化フレームで事前反復を行う
- Source / Fixed の指定ボーン階層がリグの構造と一致しているか確認
❌ Problem: 分岐するボーン構造で関節がねじれる
✅ Solution:
- Fixed パラメータに分岐元のボーン(肩・腰など)を指定し、ユニットとして扱う
- Source の順序が階層順(親 → 子)に並んでいるか確認
- 後段で Math CHOP を使って軸ごとの符号や範囲を補正
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

