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

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

Spring CHOP のバネ運動シミュレーションを示す図

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

概要 📖 – バネ・減衰モデルの物理シミュレーション

Spring CHOPは、入力チャンネルにバネ・質量・減衰モデルを適用し、物理的な振動・追従運動を生成する CHOPです。入力値を「目標位置」または「印加する力」として解釈し、バネ定数・質量・減衰量から運動方程式を解いて出力します。

主な用途 🎯

  • 入力値に対するバネ・減衰モデルでの追従アニメーション生成
  • UI ノブやスライダーの自然な揺り戻し・オーバーシュート表現
  • オブジェクト位置・回転の物理的な慣性付与
  • 値の急激な変化を質量と減衰で滑らかに緩衝するスムージング
  • 入力を力として与える Force モードでの揺動・振動シミュレーション

データフロー 🔄

入力: チャンネル値(位置 または 力)

Input Effect 判定(Position / Force)

バネ運動方程式(Spring Constant / Mass / Damping)

Reset 制御

出力: 振動・追従値

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

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
  1. Slider COMP の出力 CHOP を Spring CHOP に接続
  2. Input Effect を「Position」に設定
  3. Spring Constant を高め・Damping を中程度に調整
  4. スライダーを動かすと目標値に向かってバネのように揺り戻しながら追従する

Example 2: オブジェクト位置の慣性付き追従 🎯

Mouse In CHOP → Spring CHOP (Position) → Geometry tx/ty
  1. Mouse In CHOP でカーソル座標を取得
  2. Spring CHOP の Input Effect を「Position」、Mass を大きめに設定
  3. 出力をジオメトリの tx / ty に Export
  4. カーソルにバネで引っ張られるような慣性付きの追従モーションが得られる

Example 3: 衝撃から減衰振動する物理シミュレーション 💥

Trigger CHOP → Spring CHOP (Force) → Output
  1. Trigger CHOP で短いパルス信号を生成
  2. Spring CHOP の Input Effect を「Force」に切替
  3. Damping Constant を低めにして余韻を残す
  4. パルスを与えるたびにバネが叩かれて減衰しながら振動する波形が得られる

Example 4: 急変する制御信号のスムージング 📈

Serial CHOP → Spring CHOP (Position) → Light Intensity
  1. センサー値などステップ的に変化する制御信号を入力
  2. Input Effect を「Position」、Mass と Damping を高めに設定
  3. 急激な変化が物理モデルで緩衝され、滑らかに目標値へ収束する
  4. 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 🎯


Info CHOP情報 📊

Spring 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: 振動が発散して値が爆発する
✅ 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 等)と組み合わせると分かりやすい

参考資料 📚

その他 🔗

公式リソース 📖

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