Physics & constraints

Mass–Spring System

質点ばねモデル

点をばねでつないで柔らかな物体を作る。

7 / 10

Interactive demo

Preparing the demo…

Mass–Spring System

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

This explanation is currently available in Japanese.

ひとことで

物体を質量を持った点(質点)の集まりとし、点同士をばねでつないで、ばねの伸び縮みから力を計算して動かす方法です。仕組みが分かりやすく、ばねのつなぎ方を変えるだけで、布、ロープ、ゼリー、タイヤ、車体のへこみまで作れる、柔らかい物体の最も基本的なモデルです。

ゲームでの使いどころ

  • ゼリーやスライム:『JellyCar』のような、ぷるぷる弾む柔らかいキャラクターや足場。
  • 車体の変形:『BeamNG.drive』は、車体を質点とばね(ビーム)の網で表し、衝突でリアルにへこむ車を実現しています。
  • 布・髪・ロープ:古くからある布のシミュレーションは、格子状の質点とばねでした。
  • 揺れもの:キャラクターの胸、お腹、アクセサリーなどの二次的な揺れ(ばね・ダンパーの集まり)。

しくみ

  1. ばねの力:2 つの点 aa, bb をつなぐ、自然長 LL、ばね定数 kk のばねは、両端の点を次の力で引き合います(フックの法則)。
Fa=k (∣xb−xa∣−L) n+c ((vb−va)⋅n) n,n=xb−xa∣xb−xa∣,Fb=−Fa\mathbf{F}_a = k\,\big(|\mathbf{x}_b - \mathbf{x}_a| - L\big)\,\mathbf{n} + c\,\big((\mathbf{v}_b - \mathbf{v}_a)\cdot\mathbf{n}\big)\,\mathbf{n}, \qquad \mathbf{n} = \frac{\mathbf{x}_b - \mathbf{x}_a}{|\mathbf{x}_b - \mathbf{x}_a|}, \qquad \mathbf{F}_b = -\mathbf{F}_a

2 項目は、ばねの方向に伸びる速さに比例する減衰です。これがないと、いつまでも振動が止まりません。

  1. 力を集めて動かす:すべてのばねの力と重力を点ごとに足し合わせ、半陰的オイラー法で速度、位置の順に更新します。

  2. 衝突:床や障害物にめり込んだ点は押し戻し、めり込む向きの速度を消します。

ばねのつなぎ方

立方体の格子を例にすると、3 種類のばねを使います。

  • 構造のばね:上下左右前後の隣同士。形の骨組みです。
  • せん断のばね:斜めの対角線。これがないと、四角形は平行四辺形に簡単にひしゃげます(四角形の辺の長さを保っても、角度は自由に変わるため)。
  • 曲げのばね:1 つ飛ばしの点同士。面が折れ曲がりにくくなり、形が保たれます。

実装のポイント

  • 時間刻みを小さく:ばねが硬いほど、細かい時間刻みが必要です。目安は Δt<2m/k\Delta t < 2\sqrt{m/k} で、硬いばねでは 1 フレームを 10〜30 のサブステップに分けます。
  • 見た目のメッシュと分ける:質点の数は少なめ(数十〜数百)にしておき、表示用の細かいメッシュの頂点を、近くの質点の位置から補間して動かします。
  • ばねの長さの上限:衝撃で極端に伸びたばねを切る、または長さを強制的に戻すと、爆発を防げます。

つまずきやすい点

  • 硬いばねで発散する:ばねを硬くしたいのに、硬くすると爆発する、というのが質点ばねモデルの最大の弱点です。十分なサブステップを取るか、硬さを位置の補正で扱う位置ベース物理や拡張位置ベース物理を使います。
  • 裏返り:強くつぶれると、立方体が裏返ったまま戻らなくなることがあります。体積を保つ力や、シェイプマッチングのような元の形へ戻す力を加えます。
  • ばねの配置で性質が偏る:格子に沿ったばねだけだと、格子の方向には硬く、斜めには柔らかい、という偏りが出ます。

デモで試すこと

  1. 「落とす」を押すと、2 つのゼリーが床と出っ張りにぶつかって、つぶれ、弾み、元の形に戻ります。
  2. 「斜め(せん断)のばね」をオフにしてから落とすと、立方体はひしゃげたまま、横からの力で簡単につぶれてしまいます。
  3. 「ばね定数」を上げると硬いゼリーに、下げるとゆるいゼリーになります。「ばねの減衰」を 0 に近づけると、いつまでもぷるぷる揺れ続けます。
  4. 「ばねを表示」をオンにすると、構造(黄)・せん断(青)・曲げ(紫)の 3 種類のばねの網が見えます。1 個の立方体に 1,000 本以上のばねがあります。

References

Gaffer On Games — Integration Basics ↗

A general reference for this subcategory.