Following, springs & flocks

Spring–Damper

ばね・ダンパー

復元力と減衰で反動や尻尾の弾みを作る。

2 / 10

Interactive demo

Preparing the demo…

Spring–Damper

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

目標からのずれに比例して引き戻すばねと、速度に比例してブレーキをかけるダンパー(減衰器)を組み合わせた運動モデルです。行き過ぎて揺り戻す「弾み」や、ぷるんと揺れて収まる動きを、たった 2 つのパラメータで作れます。

ゲームでの使いどころ

  • 揺れもの:髪、しっぽ、アクセサリー、アンテナ、ぶら下がった看板。
  • UI の弾み:ボタンを押したときのへこみと戻り、ドラッグを離したカードが所定位置へ戻る動き。
  • ヒットリアクション:攻撃を受けた敵や的がぶるっと揺れる。
  • カメラ:衝撃でずれたカメラが揺れながら戻る、乗り物のサスペンション表現。

しくみ

質量 mm の物体の、目標位置からのずれを xx、速度を vv とすると、ばね定数 kk、減衰係数 cc の力は

F=−k x−c v,m d2xdt2=−k x−c dxdtF = -k\,x - c\,v, \qquad m\,\frac{d^2x}{dt^2} = -k\,x - c\,\frac{dx}{dt}

となります。この運動の性格は、減衰比 ζ\zeta で決まります。

ζ=c2k m,ω0=km\zeta = \frac{c}{2\sqrt{k\,m}}, \qquad \omega_0 = \sqrt{\frac{k}{m}}
減衰比名前動き
ζ<1\zeta < 1不足減衰行き過ぎて振動しながら収まる(弾む)
ζ=1\zeta = 1臨界減衰振動せず、最短で収まる
ζ>1\zeta > 1過減衰振動しないが、ゆっくり戻る

ω0\omega_0(固有角振動数)は揺れの速さを、ζ\zeta は揺れの収まり方を決めます。kk と cc を直接いじるより、ω0\omega_0(または周波数)と ζ\zeta で調整するほうが、アーティストにとって直感的です。

実装のポイント

  • サブステップ:kk が大きい(硬いばね)と、1 フレームの Δt\Delta t では数値的に発散します。デモのように 1 フレームを数回に分けて積分するか、解析解を使う方法(Daniel Holden の "Spring-It-On" など)を検討します。
  • 親の動きを入力にする:揺れものは「親が動いた分だけ、ばねの先端が相対的に取り残される」と考えます。デモでも台座の移動量をずれに加えています。
  • 軸ごとに独立:x, y, z を独立なばねとして扱っても、多くの場合は十分自然です。

つまずきやすい点

  • 陽的オイラー法で発散する:位置を先に更新する素朴な積分では、減衰なしでも振幅が増えていきます。半陰的オイラー法を使います。
  • フレームレート依存:可変の Δt\Delta t で積分すると、フレームが落ちたときに挙動が変わります。固定の小さなステップで回すのが安全です。
  • 揺れすぎ:ζ\zeta が小さすぎる揺れものは、いつまでも揺れ続けて落ち着きのない画面になります。0.3〜0.6 程度から調整を始めると扱いやすいです。

デモで試すこと

  1. 「減衰係数 c」を 0 にすると、標的はいつまでも揺れ続けます。そこから少しずつ上げて、右下のグラフの揺れが収まる速さの変化を見てください。
  2. 「ばね定数 k」を上げると揺れが速く(周波数が高く)なり、下げるとゆったりした揺れになります。左下の減衰比 ζ も同時に変わる点に注目してください。
  3. 「叩く」で瞬間的な速度を与えると、ヒットリアクションとしての見え方が確認できます。

References

Spring-It-On ↗

A general reference for this subcategory.