Fluids & reaction

Material Point Method

MPM

粒子と格子で砂や雪の変形を計算する。

9 / 10

Interactive demo

Preparing the demo…

Material Point Method

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

This explanation is currently available in Japanese.

ひとことで

材料を粒子(物質点)で表し、粒子ごとに「どれだけ変形したか」を覚えておき、力の計算を格子の上で行う方法です。応力の決め方を変えるだけで、水、ゼリー、砂、雪、泥、布まで、同じ仕組みで扱えます。ディズニーの映画『アナと雪の女王』(2013)の雪のシミュレーションで一躍有名になりました。

ゲームでの使いどころ

  • 雪・砂・泥:足跡が残る雪原、崩れる砂山、ぬかるみに沈む車輪。固まったり崩れたりする粉体は、MPM の最も得意な分野です。
  • 異なる材料の混在:水とゼリー、砂と水(泥)など、性質の違う材料が同じ場面でぶつかり合う表現。
  • 破壊と変形:粘土のようにちぎれる、ゼリーのように弾んで戻る、といった大変形。
  • リアルタイム化:MLS-MPM(2018)と GPU の発展で、数十万粒子をリアルタイムで動かすデモやゲームも出てきています(Taichi の「88 行の MPM」が有名な入門例)。

しくみ

MPM は、PIC・FLIP と同じく粒子と格子を行き来しますが、粒子が変形勾配 F\mathbf{F}(元の形からどれだけ伸び・縮み・ねじれたかを表す行列)を持つのが特徴です。

  1. 粒子 → 格子(P2G):各粒子の質量と運動量を、周りの格子点に配ります。このとき、粒子の変形から求めた応力(内部の力)も、格子点への力として一緒に配ります。受け渡しには APIC の方式がよく使われます。
  2. 格子で動かす:各格子点で、運動量を質量で割って速度にし、重力を加え、壁や地面との衝突を処理します。
  3. 格子 → 粒子(G2P):格子の速度と、その傾き C\mathbf{C} を粒子へ戻し、粒子を動かします。
  4. 変形を更新する:粒子の変形勾配を、周りの速度の傾きで更新します。
Fp←(I+Δt Cp) Fp\mathbf{F}_p \leftarrow (\mathbf{I} + \Delta t\,\mathbf{C}_p)\,\mathbf{F}_p

材料による違い

応力は F\mathbf{F} から計算します。例えば固定共回転モデルでは、F\mathbf{F} から回転 R\mathbf{R} を取り除いた「純粋な変形」に比例した力が働きます。

σ∝2μ (F−R) F⊤+λ J(J−1) I,J=det⁡F\boldsymbol{\sigma} \propto 2\mu\,(\mathbf{F} - \mathbf{R})\,\mathbf{F}^{\top} + \lambda\,J(J - 1)\,\mathbf{I}, \qquad J = \det\mathbf{F}
  • ゼリー(弾性体):F\mathbf{F} をそのまま覚えるので、変形すると元に戻ろうとします。
  • 水:形を覚えず(μ=0\mu = 0)、体積の変化 JJ だけに反応します。F\mathbf{F} を毎回 J I\sqrt{J}\,\mathbf{I} にリセットします。
  • 雪(弾塑性体):F\mathbf{F} の伸び縮み(特異値)を一定の範囲に制限し、範囲を超えた分は「元に戻らない変形」(塑性)として捨てます。押し固められた雪ほど硬くなるよう、捨てた分に応じて硬さを上げます。
  • 砂:摩擦角に基づいて、せん断の限界を超えた変形を捨てます(ドラッカー・プラガー塑性)。

実装のポイント

  • 2 次の B スプラインの重み:粒子は周りの 3×3(3 次元は 3×3×3)の格子点とやり取りします。この重みを使うと APIC の傾き C\mathbf{C} が簡単に求まり、MLS-MPM では応力の計算と P2G を 1 つにまとめられます。
  • 特異値分解(SVD):F\mathbf{F} から回転を取り出す、伸び縮みを制限する、といった処理に 2×2 または 3×3 の SVD を使います。2×2 なら閉じた式で求まります。
  • 時間刻み:固い材料ほど細かい時間刻みが必要です(音速の条件)。1 フレームを数十のサブステップに分けるのが普通です。
  • GPU 向き:P2G の書き込みが衝突する(同じ格子点に複数の粒子が書く)ので、アトミック加算や、粒子をセル順に並べ替える工夫をします。

つまずきやすい点

  • 固い材料は重い:ヤング率を上げると、必要な時間刻みがどんどん小さくなります。ゲームでは、見た目が破綻しない範囲で柔らかめにします。
  • 格子より細かい部分は表現できない:薄い布や細い棒は格子の解像度に依存するので、粒子と格子の細かさの釣り合いが大切です。
  • 材料のパラメータ:雪の圧縮・伸びの限界や固まりやすさは、少し変えるだけで粉雪から湿った雪まで性質が大きく変わります。

デモで試すこと

  1. 左から水(青)、ゼリー(ピンク)、雪(白)のかたまりが落ちてきます。水は流れて広がり、ゼリーは弾んで形を保ち、雪はつぶれて固まりながら崩れます。すべて同じ計算で、応力の決め方だけが違います。
  2. 「硬さ(ヤング率)」を上げると、ゼリーと雪がより硬く、変形しにくくなります。
  3. 「雪の固まりやすさ」を 0 にすると、雪は押されてもあまり固まらず、崩れやすくなります。上げると、押し固められた部分が硬い塊になります(暗く見える粒子ほど押し固められています)。
  4. 「落とす」で何度でもやり直せます。

References

GPU Gems — Fast Fluid Dynamics Simulation on the GPU ↗

A general reference for this subcategory.