
概要 📖 – バネ・減衰モデルの物理シミュレーション
Spring CHOPは、入力チャンネルにバネ・質量・減衰モデルを適用し、物理的な振動・追従運動を生成する CHOPです。入力値を「目標位置」または「印加する力」として解釈し、バネ定数・質量・減衰量から運動方程式を解いて出力します。
主な用途 🎯
- 入力値に対するバネ・減衰モデルでの追従アニメーション生成
- UI ノブやスライダーの自然な揺り戻し・オーバーシュート表現
- オブジェクト位置・回転の物理的な慣性付与
- 値の急激な変化を質量と減衰で滑らかに緩衝するスムージング
- 入力を力として与える Force モードでの揺動・振動シミュレーション
データフロー 🔄
入力: チャンネル値(位置 または 力)
↓
Input Effect 判定(Position / Force)
↓
バネ運動方程式(Spring Constant / Mass / Damping)
↓
Reset 制御
↓
出力: 振動・追従値
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Spring Page 🌀
バネ運動パラメータ 🧮
Spring Constant .springk 🌀
– バネの強さ(剛性)を決める係数
– 値が大きいほど高周波の振動を生成
Mass .mass 🏋️
– バネの先端に取り付けられた物体の質量
– 質量が大きいほど低周波・大振幅・減衰に強い挙動になる
Damping Constant .dampingk 🛑
– バネ運動に加わる減衰(抵抗)量
– 値が大きいほど振動が速く収束する
Input Effect .method 🎛️
入力チャンネルを「位置」として扱うか「力」として扱うかを切り替える
| 項目 | 内部名 | 説明 |
|---|---|---|
| Position | .disp |
入力値を「バネの目標位置」として扱い、その位置へ追従する |
| Force | .force |
入力値を「物体に印加する力」として扱い、力学的に揺動させる |
初期条件 🎬
Intial Conditions from Channel .condfromchan 📥
– オン: チャンネル先頭の値から初期位置と初期速度を自動算出
– オフ: 下記 Initial Position / Initial Speed を手動指定
Initial Position .initpos 📍
– バネに取り付けられた物体の初期位置
– Intial Conditions from Channel がオフのときに参照される
Initial Speed .initspeed 💨
– バネに取り付けられた物体の初期速度
– Intial Conditions from Channel がオフのときに参照される
Reset 制御 🔄
Reset .reset ⏹️
– オンの間、Spring CHOP の振動状態を初期化し続ける
– オフに戻したタイミングからシミュレーションが再開される
Reset Pulse .resetpulse ⚡
– パルス入力で一瞬だけ振動状態を初期化する
– ボタン的に「いまリセット」を一度だけ発火させたい時に使用
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: UI ノブの自然な揺り戻し演出 🎚️
Slider COMP → Spring CHOP (Position) → Geometry tx
- Slider COMP の出力 CHOP を Spring CHOP に接続
- Input Effect を「Position」に設定
- Spring Constant を高め・Damping を中程度に調整
- スライダーを動かすと目標値に向かってバネのように揺り戻しながら追従する
Example 2: オブジェクト位置の慣性付き追従 🎯
Mouse In CHOP → Spring CHOP (Position) → Geometry tx/ty
- Mouse In CHOP でカーソル座標を取得
- Spring CHOP の Input Effect を「Position」、Mass を大きめに設定
- 出力をジオメトリの tx / ty に Export
- カーソルにバネで引っ張られるような慣性付きの追従モーションが得られる
Example 3: 衝撃から減衰振動する物理シミュレーション 💥
Trigger CHOP → Spring CHOP (Force) → Output
- Trigger CHOP で短いパルス信号を生成
- Spring CHOP の Input Effect を「Force」に切替
- Damping Constant を低めにして余韻を残す
- パルスを与えるたびにバネが叩かれて減衰しながら振動する波形が得られる
Example 4: 急変する制御信号のスムージング 📈
Serial CHOP → Spring CHOP (Position) → Light Intensity
- センサー値などステップ的に変化する制御信号を入力
- Input Effect を「Position」、Mass と Damping を高めに設定
- 急激な変化が物理モデルで緩衝され、滑らかに目標値へ収束する
- Filter CHOP では出せない「オーバーシュート + 揺り戻し」のニュアンスが付与できる
関連オペレータ 🔗
類似機能OP 🔍
- Filter CHOP — 時間方向の平滑化(移動平均・指数)に特化、バネ的な揺り戻しは生成しない
- Lag CHOP — 立ち上がり / 立ち下がり時間でのスムージング、振動成分なし
- LFO CHOP — 周期的な振動信号を独立生成(入力追従ではない)
組み合わせ推奨OP 🔄
- Math CHOP — Spring 後段で値域変換・スケーリング
- Filter CHOP — Spring 入力前のノイズ除去・前処理
- Trigger CHOP — Force モードでパルス入力源として組み合わせ
- Constant CHOP — 目標位置を固定値として供給
- Analyze CHOP — Spring 出力の振幅・ピークを解析
前処理・後処理CHOP 🎯
- 前処理: Filter CHOP、Math CHOP、Trigger CHOP、Constant CHOP
- 後処理: Math CHOP、Analyze CHOP、Limit CHOP、Logic CHOP
Info CHOP情報 📊
Spring 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:
- Spring Constant が大きすぎると数値積分が不安定になりやすい、まず中程度から調整
- Damping Constant を上げて減衰を強める
- Mass を大きくして振動応答を遅くする
❌ Problem: 振動が全く出ずに直線的にしか追従しない
✅ Solution:
- Damping Constant が高すぎると過減衰になり振動成分が消える、値を下げる
- Spring Constant を上げてバネの剛性を強める
- Input Effect が「Force」の場合は短いパルス入力でないと揺れが見えにくいので入力波形を確認
❌ Problem: 入力を変えても挙動が変わらない / 初期値のままになる
✅ Solution:
- Reset がオンのままだとシミュレーションが進まないため、Reset を必ずオフにする
- Intial Conditions from Channel をオフにして Initial Position / Initial Speed の手動指定を見直す
- 前段に Math CHOP を入れて入力スケールが Spring の反応域に収まっているか確認
❌ Problem: Position モードと Force モードの違いが分からない
✅ Solution:
- Position は「入力を目標位置とみなしてそこへ追従」、Force は「入力を加える力とみなして揺動」
- UI 追従や慣性付き移動は Position、衝撃・打撃・振動演出は Force を選ぶ
- Force モードでは短いパルス入力(Trigger CHOP 等)と組み合わせると分かりやすい
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

