Following, springs & flocks

Critical Damping

臨界減衰

線形ばね系で振動する設定としない設定の境界を選び、速く落ち着く追従を作る。

3 / 10

Interactive demo

Preparing the demo…

Critical Damping

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

This explanation is currently available in Japanese.

ひとことで

ばね・ダンパーの減衰比を ζ=1\zeta = 1 にした状態です。振動しない設定の中で最も速く目標に落ち着く、揺れと遅れのちょうど境界にあたります。照準やカメラのように「素早く、でも揺れずに」追従させたい場面の標準的な選択です。

ゲームでの使いどころ

  • 照準・レティクル:ターゲットを切り替えたときに、行き過ぎずにすっと収まる。
  • カメラの追従:Unity の SmoothDamp は臨界減衰ばねの近似で、多くのゲームのカメラに使われています。
  • UI のアニメーション:割り込みが入っても速度が連続するので、目標が途中で変わっても不自然になりません。
  • キャラクターの向き:振り向きを揺れなしで素早く完了させる。

しくみ

固有角振動数 ω\omega のばねで、減衰比を 1 にすると c=2ωc = 2\omega(m=1m = 1)となり、初期のずれ x0x_0、初速 0 からの解は

x(t)=x0 (1+ωt) e−ωtx(t) = x_0\,(1 + \omega t)\,e^{-\omega t}

になります。指数関数に 1 次式が掛かった形で、一度も 0 を横切らず(行き過ぎず)に減衰します。

  • ζ<1\zeta < 1:減衰が足りず、行き過ぎて振動する。最初の到達は速いが、収まるまでは長い。
  • ζ>1\zeta > 1:減衰が強すぎて、ゆっくりとしか戻らない。
  • ζ=1\zeta = 1:揺れない範囲で、最も速く 2% 以内に収まる。

右下のグラフは、この 3 つのステップ応答(目標が急に移ったときの進み具合)です。デモの数値では、不足減衰の方が最初は速く目標に届きますが、揺れが収まるまで(整定時間)は臨界減衰の約 2 倍かかっています。

「臨界減衰なら絶対に行き過ぎない」は初速が 0 の場合の話です。すでに目標から遠ざかる向き、あるいは目標を越える向きに速度を持っていれば、臨界減衰でも一度行き過ぎることがあります。

実装のポイント

  • smoothTime の意味:おおよそ「目標に着くまでの時間」の目安です。ω=2/T\omega = 2 / T と対応します。
  • 解析解で積分する:上のように解析解(あるいはその近似)でステップを進めると、Δt\Delta t が大きくても安定します。
  • 速度を状態として持つ:指数減衰と違い、速度を保持するため目標が動いても滑らかです。そのぶん「前フレームの速度」を保存する変数が必要です。

つまずきやすい点

  • 動く目標には遅れる:臨界減衰は「止まっている目標に最速で収まる」設定です。動き続ける目標には一定の遅れが残るので、予測を加えるか、PD 制御のようにゲインを調整します。
  • 揺れがほしいのに臨界減衰にしてしまう:UI に弾みを出したいなら、あえて ζ=0.5\zeta = 0.5 前後の不足減衰を選びます。
  • ζ = 1 付近の数値誤差:解析解を場合分けする実装では、ζ\zeta がちょうど 1 の近くで式が不安定になります。少し幅を持たせて臨界減衰の式に切り替えます。

デモで試すこと

  1. 3 つの照準の動きを見比べてください。赤(ζ = 0.35)は行き過ぎて円を描き、紫(ζ = 2.5)は遅れてじわじわ寄り、水色(ζ = 1)が最も早く標的に落ち着きます。
  2. 左下の整定時間(誤差が 2% 以内に収まるまでの時間)を比べると、臨界減衰が最短であることが数字で分かります。
  3. 「固有角振動数 ω」を上げると 3 つとも速くなりますが、揺れ方の性格(ζ)は変わりません。

References

The Orange Duck — Spring-It-On ↗