水の問題点
- ほとんどのゲームでは地形の変更ができず、それは妥当である。すべてのゲームがそれを必要とするわけではない。
- 水があるゲームでは、水の流れをどう扱うかを考える必要がある。
- 既存の単純なモデルでは満足できず、より良いモデルを見つけるために研究が必要である。
設定
- シミュレーションはグリッド上で動作する必要があり、地形と同じグリッドを使うのが望ましい。
- シミュレーションの平均スケールはおよそ1メートル程度であるべきだ。
- 水は地形上の高さフィールドとみなすことができ、垂直には流れない。
- 水は流れることができる必要があり、シミュレーション誤差によって魔法のように消えてはならない。
- シミュレーションは制御可能な安定性を持ち、高速に動作する必要がある。
解決にならないもの
- Smoothed Particle Hydrodynamicsは非常に印象的な結果をもたらすが、別の問題を解いている。
- Jos StamのStable Fluidsは流体全体の体積を扱うため、高速ではない。
浅水方程式
- 浅水方程式は垂直方向を平均化し、2Dの方程式だけを残す。
- 「浅い」という部分は、水柱の典型的な垂直サイズが水平スケールよりはるかに小さいことを仮定している。
格子
- 流体力学では格子が重要で、一般的にはstaggered gridsを使う。
- staggered gridsでは、水位や密度などを四角形セルに保存し、速度はセル間の辺に保存する。
仮想パイプ法
- 水セルが仮想的なパイプで接続されていると仮定して、水の流れをシミュレートする。
- 流れの加速、流出スケーリング、水柱更新の3段階で構成される。
流れの加速
- 隣接する水セルの水位差に応じて流れを加速する。
- 摩擦を加えて、シミュレーションが安定した状態に収束するようにする。
水柱更新
- 各水セルについて、隣接する流れに応じて水を追加または除去する。
流出スケーリング
- セル内の水量が負にならないよう、流出の流れを調整する。
地形の標高
- 水が地形に沿って移動するよう、地形の標高を追加する。
境界条件
- シミュレーションの境界で何が起こるかを考慮する必要がある。
- 境界の流量値を設定して、壁、流入、流出などの条件を定義する。
粘性
- 粘性を追加して、薄い水の層が移動しにくくなるようにする。
シミュレーション全体のコード
- シミュレーションコードは、いくつかの2D配列に対する4つのforループで構成される。
モデルの欠点
- 慣性と速度拡散がなく、速い水流が湖に入ると全方向に広がる。
ボーナス: 六角形/三角形格子
- 三角形格子を使って水をシミュレートでき、これは六角形格子の双対とみなせる。
1件のコメント
Hacker Newsの意見
流体シミュレーションでは、水が蓄積して隣接セルに影響を与える問題があることに言及。これは、手続き型生成ゲームで並列化が難しい理由の1つでもある
流体シミュレーション開発では、美しい結果を眺めて時間を浪費してしまう危険が大きいと言及
Animal Crossingの資源収集方式は、地形操作なしでも効率的だと言及
Timberbornでは水の物理がゲームの重要要素であり、おすすめだと言及
o3-mini-highを使って3Dで実装されたアルゴリズムを試した経験を共有
教育用の洪水シミュレーションを紹介し、WebGLを使って隣接セルベースでセル値を計算していると説明
水シミュレーションで慣性や速度拡散が不足する問題を解決する方法を提案
個人プロジェクトとして始めた侵食シミュレーションへの好奇心を共有
Creeper Worldで水をシミュレーションした後に爆弾を投下するアイデアに言及