This explanation is currently available in Japanese.
ひとことで
物体を質量を持った点(質点)の集まりとし、点同士をばねでつないで、ばねの伸び縮みから力を計算して動かす方法です。仕組みが分かりやすく、ばねのつなぎ方を変えるだけで、布、ロープ、ゼリー、タイヤ、車体のへこみまで作れる、柔らかい物体の最も基本的なモデルです。
ゲームでの使いどころ
- ゼリーやスライム:『JellyCar』のような、ぷるぷる弾む柔らかいキャラクターや足場。
- 車体の変形:『BeamNG.drive』は、車体を質点とばね(ビーム)の網で表し、衝突でリアルにへこむ車を実現しています。
- 布・髪・ロープ:古くからある布のシミュレーションは、格子状の質点とばねでした。
- 揺れもの:キャラクターの胸、お腹、アクセサリーなどの二次的な揺れ(ばね・ダンパーの集まり)。
しくみ
- ばねの力:2 つの点 , をつなぐ、自然長 、ばね定数 のばねは、両端の点を次の力で引き合います(フックの法則)。
2 項目は、ばねの方向に伸びる速さに比例する減衰です。これがないと、いつまでも振動が止まりません。
-
力を集めて動かす:すべてのばねの力と重力を点ごとに足し合わせ、半陰的オイラー法で速度、位置の順に更新します。
-
衝突:床や障害物にめり込んだ点は押し戻し、めり込む向きの速度を消します。
ばねのつなぎ方
立方体の格子を例にすると、3 種類のばねを使います。
- 構造のばね:上下左右前後の隣同士。形の骨組みです。
- せん断のばね:斜めの対角線。これがないと、四角形は平行四辺形に簡単にひしゃげます(四角形の辺の長さを保っても、角度は自由に変わるため)。
- 曲げのばね:1 つ飛ばしの点同士。面が折れ曲がりにくくなり、形が保たれます。
実装のポイント
- 時間刻みを小さく:ばねが硬いほど、細かい時間刻みが必要です。目安は で、硬いばねでは 1 フレームを 10〜30 のサブステップに分けます。
- 見た目のメッシュと分ける:質点の数は少なめ(数十〜数百)にしておき、表示用の細かいメッシュの頂点を、近くの質点の位置から補間して動かします。
- ばねの長さの上限:衝撃で極端に伸びたばねを切る、または長さを強制的に戻すと、爆発を防げます。
つまずきやすい点
- 硬いばねで発散する:ばねを硬くしたいのに、硬くすると爆発する、というのが質点ばねモデルの最大の弱点です。十分なサブステップを取るか、硬さを位置の補正で扱う位置ベース物理や拡張位置ベース物理を使います。
- 裏返り:強くつぶれると、立方体が裏返ったまま戻らなくなることがあります。体積を保つ力や、シェイプマッチングのような元の形へ戻す力を加えます。
- ばねの配置で性質が偏る:格子に沿ったばねだけだと、格子の方向には硬く、斜めには柔らかい、という偏りが出ます。
デモで試すこと
- 「落とす」を押すと、2 つのゼリーが床と出っ張りにぶつかって、つぶれ、弾み、元の形に戻ります。
- 「斜め(せん断)のばね」をオフにしてから落とすと、立方体はひしゃげたまま、横からの力で簡単につぶれてしまいます。
- 「ばね定数」を上げると硬いゼリーに、下げるとゆるいゼリーになります。「ばねの減衰」を 0 に近づけると、いつまでもぷるぷる揺れ続けます。
- 「ばねを表示」をオンにすると、構造(黄)・せん断(青)・曲げ(紫)の 3 種類のばねの網が見えます。1 個の立方体に 1,000 本以上のばねがあります。