流体・反応シミュレーション

PIC・FLIP

Particle-in-Cell / Fluid-Implicit-Particle

粒子と格子の間で速度を受け渡す。

7 / 10

インタラクティブデモ

デモを準備しています…

PIC・FLIP

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

水を粒子で運び、圧力は格子で解く、両方のいいとこ取りの方法です。粒子は水そのもので、ぼやけずに流れに乗って移動します。一方、縮まない流れにする圧力投影は格子の上で効率よく解きます。毎ステップ、粒子の速度を格子に集め、格子で直し、また粒子に戻します。粒子に戻すときに格子の速度をそのまま写すのが PIC、変化分だけを足すのが FLIP です。

ゲームでの使いどころ

  • 映画やゲームの水:Houdini の FLIP ソルバーは、映画やゲームのプリレンダー映像で水を作る標準的な道具です。波、しぶき、泡の多い水が得意です。
  • リアルタイムの液体:数千〜数万粒子なら CPU でも動き、GPU なら数十万粒子まで扱えます。Matthias Müller の「Ten Minute Physics」の FLIP デモが、分かりやすい実装例として有名です。
  • 水しぶきの元:粒子の速度が分かるので、速い所からホワイトウォーターを生みやすい。

しくみ

1 ステップは次のとおりです。

  1. 粒子を動かす:各粒子を、自分の速度と重力で動かします。
  2. 粒子 → 格子(P2G):各格子点に、近くの粒子の速度を距離に応じた重みで平均して集めます。
ui=∑pwip vp∑pwip\mathbf{u}_i = \frac{\sum_p w_{ip}\,\mathbf{v}_p}{\sum_p w_{ip}}
  1. 格子で圧力を解く:粒子があるマスを「水」、ないマスを「空気」として、水のマスだけで圧力投影を行い、縮まない速度場に直します。
  2. 格子 → 粒子(G2P):粒子の位置で格子の速度を補間し、粒子へ戻します。ここで 2 つの方式があります。
PIC:vp←∑iwip ui新FLIP:vp←vp+∑iwip (ui新−ui旧)\text{PIC:}\quad \mathbf{v}_p \leftarrow \sum_i w_{ip}\,\mathbf{u}_i^{\text{新}} \qquad \text{FLIP:}\quad \mathbf{v}_p \leftarrow \mathbf{v}_p + \sum_i w_{ip}\,(\mathbf{u}_i^{\text{新}} - \mathbf{u}_i^{\text{旧}})
  • PIC(Particle-in-Cell)は、格子の速度そのものを写します。2 と 4 で 2 回平均をとるので、細かい速度の違いがならされ、水が水あめのように粘ります(数値粘性)。その代わり、とても安定です。
  • FLIP(Fluid-Implicit-Particle)は、格子で起きた速度の変化分だけを粒子の速度に足します。粒子が持っていた細かい動きが残り、生き生きとした水になりますが、粒子の速度がばらついてノイズが出やすくなります。

実用上は、FLIP 95〜99%、PIC 1〜5% を混ぜて使うのが定番です。

実装のポイント

  • MAC 格子:速度の横成分をマスの左右の辺に、縦成分を上下の辺に置くと、圧力投影が正確になります。P2G・G2P は成分ごとに、ずれた位置で重みを計算します。
  • 粒子の密集の補正:数値誤差で粒子が 1 か所に集まると、水の体積が変わって見えます。マスごとの粒子の密度を測り、基準より混んでいる所では、圧力投影で押し広げる量を増やします(ドリフト補正)。
  • 粒子の数:1 マスあたり 4〜8 個(2 次元なら 2×2)が目安です。
  • 水面の描画:粒子から距離場を作り、マーチングキューブで表面を作るか、スクリーンスペースで滑らかに描きます。

つまずきやすい点

  • FLIP 100% のノイズ:純粋な FLIP は、粒子の速度にノイズがたまり、水面がざわつきます。少しだけ PIC を混ぜると落ち着きます。
  • PIC は角運動量を失う:渦や回転がすぐに止まってしまいます。回転を保ちながら安定させたい場合は APIC を使います。
  • 粒子が空気のマスに取り残される:水から離れた粒子のマスは「水」と判定されるので、1 粒だけのマスで圧力が解かれて不自然な動きをすることがあります。孤立した粒子を消すか、しぶきとして別扱いにします。

デモで試すこと

  1. 左の水の柱が崩れ、右の壁にぶつかって跳ね返ります。「ダムを崩す」でくり返せます。
  2. 「FLIP の割合」を 0(純粋な PIC)にすると、水が粘って、ゆっくりのっぺりと広がります。1 に近づけると、しぶきが上がる生き生きとした水になります。
  3. 「水のあるセルを表示」をオンにすると、粒子がいるマス(青)だけで圧力が解かれていることが分かります。
  4. 水槽の中をドラッグすると、棒で水をかき混ぜられます。PIC と FLIP で、かき混ぜたあとの渦の残り方を比べてください。

参考資料

GPU Gems — Fast Fluid Dynamics Simulation on the GPU ↗

分野全体の資料で、この項目を直接扱っているとは限りません。