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

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

Spring SOP のバネ物理シミュレーション機能を示す図

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

概要 📖 – バネで頂点を揺らす物理シミュレーション

Spring SOPは、入力ジオメトリの頂点をバネとしてシミュレートし、力や衝突に反応して揺れ動く形状を出力する SOPです。頂点同士のエッジをバネとみなし、外力・風・乱流・衝突を加味してフレームごとに位置を更新します。

主な用途 🎯

  • ジオメトリの頂点をバネのように揺らす物理アニメーション
  • 布や柔らかい物体の揺れ表現(風・重力に反応する変形)
  • 頂点同士をエッジで結んだ構造体のしなり・振動
  • 固定点を起点にした振り子・吊り下げのような動き
  • 衝突面でのバウンドを伴う動的な変形シミュレーション

データフロー 🔄

入力: ソースジオメトリ(頂点とエッジ)

バネ・力・衝突の物理計算(フレームごとに積分)

出力: 変形・揺動したジオメトリ

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

State Page 📋

シミュレーション制御 .state ⏱️

Preroll Time .timepreroll
Preroll Time (事前計算秒数) — リセット時刻に達した後、何秒分のシミュレーションを先送りして表示するかを指定します。
– 例えば 33 を入力するとフレーム 1 で 33 秒経過時点の状態が表示されます。先送りした秒数も内部では計算されるため、リセット直後に遅延が発生します。

Time Inc .timeinc 🕒
Time Inc (計算間隔) — SOP をどれくらいの頻度でクックするかを決めます。既定値は 1/$FPS で、1 フレームにつき 1 回クックします。
– 複雑な動きで精度が足りないときは 0.5/$FPS など小さくして 1 フレームに複数回クックさせます。1/$FPS より大きく設定してはいけません。

Accurate Moves .accurate 🎯
Accurate Moves (高精度移動) — フレーム間の軌道を小数フレーム単位で計算し、頂点の移動をより正確にします。

Reset .reset 🔁
Reset (リセット) — オンの間、この SOP のバネ効果をリセットし続けます。

Reset Pulse .resetpulse
Reset Pulse (即時リセット) — バネ効果を即座にリセットします。

アトラクタ割り当て .attractmode 🧲

Attractor Use (アトラクタの使い方) — アトラクタ(吸引点)を各パーティクルにどう割り当てるかを選びます。

項目 内部名 説明
All Points .all すべてのアトラクタ点がすべてのパーティクル(点)に影響します。
Single Point per Particle .single 各パーティクルに 1 つのアトラクタ点だけを割り当て、その点だけが影響します。割り当ては点番号をアトラクタ点総数で割った余りで決定されます。

Forces Page 💨

外力と風 .external 🌬️

External Force .external ⬇️
External Force (外力) — 点に働く重力のような力です。X (externalx) / Y (externaly) / Z (externalz) の 3 軸で指定します。
Drag (抵抗) が 0 のとき、点は速度の上限なく加速し続けます。

Wind .wind 🍃
Wind (風) — 点に働く風の力で、X (windx) / Y (windy) / Z (windz) の 3 軸で指定します。外力と似ています。
– 風だけを使い乱流などの他の力がない場合、点は風の速度を超えて移動しません。

Turbulence .turb 🌀
Turbulence (乱流) — 各軸に沿った乱雑な力の振幅で、X (turbx) / Y (turby) / Z (turbz) で指定します。
– 値は正の数を使います。

Turb Period .period 📏
Turb Period (乱流の周期) — 小さい値だと狭い範囲で乱流が速く変化し、大きい値だと近くにある点同士が似た影響を受けます。

Seed .seed 🎲
Seed (乱数シード) — シミュレーション用の乱数の種です。


Nodes Page 🔗

固定点とグループ .fixed 📌

Fixed Points .fixed 📌
Fixed Points (固定点) — ポイントグループを指定します。このグループ内のすべての点は力の影響を受けず固定されます。
– 点の範囲指定の書き方は Group SOP の解説を参照してください。

Fixed Points go to Source Positions .revertfixed ↩️
Fixed Points go to Source Positions (固定点を元の位置へ) — 固定点グループ内の点を、ソースジオメトリの対応する点の位置へ移動させるかどうかを決めます。

Copy Groups from Source .copygroups 🔄
Copy Groups from Source (ソースからグループをコピー) — Spring SOP が毎フレーム、ソースジオメトリからグループをコピーするかどうかを決めます。
– アニメーションするグループ名を固定点フィールドに指定でき、そのグループの内容が最新に保たれます。

質量と抵抗 .mass ⚖️

Add Mass Attribute .domass
Add Mass Attribute (質量属性を追加) — 選択すると、変形するジオメトリに対して質量が計算されます。

Mass .mass ⚖️
Mass (質量) — 各点の質量です。重い点ほど動き出すまで時間がかかり、止まるまでにも時間がかかります。

Add Drag Attribute .dodrag
Add Drag Attribute (抵抗属性を追加) — 選択すると、ジオメトリが抵抗 (Drag) 属性によって変形されます。

Drag .drag 🛑
Drag (抵抗) — 各点の抵抗です。

バネの挙動 .springbehavior 🧵

Spring Behavior (バネの挙動) — バネがどのように振る舞うかを選びます。

項目 内部名 説明
Hooke’s Law .hooke フックの法則に従ってバネが働きます。一般に Normalize Displacement より安定します。
Normalize Displacement .normalize フックの法則に似ていますが、変位がバネの元の長さで正規化されます。

バネ定数 .springk 🔧

Spring Constant .springk 🔧
Spring Constant (バネ定数) — バネの硬さです。値を大きくするとバネが硬くなり、物体がより剛性を持ちます。
– 値が高くなりすぎるとバネが制御不能に振動します。その場合は Time Inc を小さくしてください。

Initial Tension .tension 🪢
Initial Tension (初期張力) — バネ演算で変形される前の、ジオメトリの初期の k 定数です。


Limits Page 🚧

境界面と衝突 .limit 📦

+ Limit Plane .limitpos 📦
+ Limit Plane (プラス側の境界面) — 点が境界面に達すると跳ね返ります。X (limitposx) / Y (limitposy) / Z (limitposz) の 6 つの境界面で立方体を定義します。
– 既定は 1000 単位先と非常に大きいため、効果を見るには 1 程度まで値を小さくします。

– Limit Plane .limitneg 📦
- Limit Plane (マイナス側の境界面) — 点が境界面に達すると跳ね返ります。X (limitnegx) / Y (limitnegy) / Z (limitnegz) で立方体の境界を定義します。
– 既定は 1000 単位先と非常に大きいため、効果を見るには値を小さくします。

衝突時の挙動 .hit 💥

Hit Behavior (衝突時の挙動) — 6 つの衝突面または衝突オブジェクトにジオメトリが当たったときの動作を選びます。

項目 内部名 説明
Bounce on Contact .bounce 衝突入力に接触するとジオメトリが跳ね返ります。
Stick on Contact .stick 衝突入力に接触するとジオメトリがそこに張り付きます。

摩擦ゲイン .gain 🪙

Gain Tangent .gaintan ↔️
Gain Tangent (接線方向ゲイン) — 衝突時のエネルギー損失(摩擦)に関わる値です。表面に対して接線方向のエネルギーの増減を制御します。

Gain Normal .gainnorm ↕️
Gain Normal (法線方向ゲイン) — 衝突時のエネルギー損失(摩擦)に関わる値です。表面に垂直な方向のエネルギーの増減を制御します。
– 0 は速度がすべて失われ、1 は表面に垂直な方向のエネルギーが失われないことを意味します。


実践アイデア 💡

Example 1: 風で揺れる旗 🚩

Grid SOP → Spring SOP (Fixed Points + Wind) → Geometry COMP

Grid SOP で作った平面の片端を固定点に指定し、Spring SOP の風 (Wind) と乱流 (Turbulence) を加えることで、旗が風になびくような揺れをリアルタイムに表現するフローです。

  1. Grid SOP で分割数の多い平面ポリゴンを生成
  2. Group SOP で片端の列をポイントグループ化し固定点に指定
  3. Spring SOP の Fixed Points にそのグループ名を設定
  4. Wind と Turbulence に値を入れて風の揺らぎを加える

Example 2: 吊り下げた振り子の動き 🎯

Line SOP → Spring SOP (Fixed Points + External Force) → Wireframe SOP

Line SOP で一直線に並んだ頂点列を作り、上端だけを固定点にして External Force に重力を与えると、バネで連結された頂点が振り子のようにしなりながら揺れる動きが得られます。

  1. Line SOP で頂点を縦に連ねたエッジを生成
  2. 最上点だけを固定点グループに指定
  3. Spring SOP の External Force の Y にマイナス値を入れて重力を再現

Example 3: 床でバウンドする変形体 💥

Sphere SOP → Spring SOP (External Force + Limit Plane + Bounce) → Geometry COMP

Sphere SOP の球に重力をかけて落下させ、Limit Plane で床面を定義し Hit Behavior を Bounce on Contact にすると、柔らかく変形しながら床で跳ね返るシミュレーションになります。

  • Sphere SOP でポリゴン球を生成
  • Spring SOP の External Force で下方向の重力をかける
  • – Limit Plane の Y を小さくして床面を定義し Hit Behavior を Bounce に設定

関連オペレータ 🔗

類似機能OP 🔍

  • Particle SOP — 力や衝突に反応する点群シミュレーションに特化した SOP
  • Force SOP — パーティクルやバネ系へ与える力場を定義する SOP

組み合わせ推奨OP 🔄

  • Group SOP — 固定点に指定するポイントグループを前段で作成
  • Wireframe SOP — 揺れるエッジ構造を線材として可視化
  • Copy SOP — 揺動するジオメトリをテンプレートに沿って複製
  • Geometry COMP — シミュレーション結果をレンダリングパイプラインへ投入

前処理・後処理SOP 🎯


Info CHOP情報 📊

Spring SOP は Info CHOP による詳細情報取得に対応しています。

ジオメトリ統計 📐

  • num_points: この SOP に含まれるポイント数
  • num_prims: この SOP に含まれるプリミティブ数
  • num_particles: この SOP に含まれるパーティクル数

GPU 転送タイミング 🎮

  • last_vbo_update_time: 別スレッドで SOP の CPU データを GPU 上のジオメトリデータに更新するのにかかった時間 (フレーム時間外)
  • last_meta_vbo_update_time: 別スレッドで metaball や NURBS のようなメタサーフェスジオメトリデータを GPU に更新するのにかかった時間 (フレーム時間外)

汎用オペレータ情報 🔄

  • total_cooks: プロセス開始以降にこのオペレータがクックされた合計回数
  • cook_time: 直近のクック所要時間 (ミリ秒)
  • cook_frame: このオペレータが最後にクックされたフレーム番号
  • warnings: このオペレータの警告数
  • errors: このオペレータのエラー数

クック統計 ⏱️

  • total_cooks: total_cooks — プロセス開始以降にこのオペレータがクックされた合計回数
  • cook_time: cook_time — 直近のクック所要時間 (ミリ秒)
  • cook_frame: cook_frame — このオペレータが最後にクックされたフレーム番号

トラブルシューティング ⚠️

よくある問題と解決策 🔧

❌ Problem: バネが制御不能に振動・爆発する
✅ Solution:

  • Spring Constant の値を下げてバネを柔らかくする
  • Time Inc0.5/$FPS など小さくして計算頻度を上げる
  • Spring Behavior を Hooke’s Law に切り替えて安定性を上げる

❌ Problem: 頂点が止まらず無限に加速する
✅ Solution:

  • Drag (抵抗) に正の値を入れて速度を減衰させる
  • External ForceWind が過大でないか確認する
  • 前段で Transform SOP でスケールを見直し、極端に大きい座標値を避ける

❌ Problem: 固定したい頂点が動いてしまう
✅ Solution:

  • Fixed Points に正しいポイントグループ名が指定されているか確認する
  • 前段の Group SOP で固定したい点が確実にグループ化されているか確認する
  • Copy Groups from Source をオンにしてアニメーションするグループ名を最新に保つ

❌ Problem: リセット直後に動作が遅れる
✅ Solution:

  • Preroll Time が大きい場合、先送り分も内部計算されるため遅延が発生する仕様を理解する
  • 事前計算が不要なら Preroll Time を 0 に近づける
  • Accurate Moves をオフにして計算負荷を下げる

参考資料 📚

その他 🔗

公式リソース 📖

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