2 ポイント 投稿者 GN⁺ 2025-02-08 | 1件のコメント | WhatsAppで共有

水の問題点

  • ほとんどのゲームでは地形の変更ができず、それは妥当である。すべてのゲームがそれを必要とするわけではない。
  • 水があるゲームでは、水の流れをどう扱うかを考える必要がある。
  • 既存の単純なモデルでは満足できず、より良いモデルを見つけるために研究が必要である。

設定

  • シミュレーションはグリッド上で動作する必要があり、地形と同じグリッドを使うのが望ましい。
  • シミュレーションの平均スケールはおよそ1メートル程度であるべきだ。
  • 水は地形上の高さフィールドとみなすことができ、垂直には流れない。
  • 水は流れることができる必要があり、シミュレーション誤差によって魔法のように消えてはならない。
  • シミュレーションは制御可能な安定性を持ち、高速に動作する必要がある。

解決にならないもの

  • Smoothed Particle Hydrodynamicsは非常に印象的な結果をもたらすが、別の問題を解いている。
  • Jos StamのStable Fluidsは流体全体の体積を扱うため、高速ではない。

浅水方程式

  • 浅水方程式は垂直方向を平均化し、2Dの方程式だけを残す。
  • 「浅い」という部分は、水柱の典型的な垂直サイズが水平スケールよりはるかに小さいことを仮定している。

格子

  • 流体力学では格子が重要で、一般的にはstaggered gridsを使う。
  • staggered gridsでは、水位や密度などを四角形セルに保存し、速度はセル間の辺に保存する。

仮想パイプ法

  • 水セルが仮想的なパイプで接続されていると仮定して、水の流れをシミュレートする。
  • 流れの加速、流出スケーリング、水柱更新の3段階で構成される。

流れの加速

  • 隣接する水セルの水位差に応じて流れを加速する。
  • 摩擦を加えて、シミュレーションが安定した状態に収束するようにする。

水柱更新

  • 各水セルについて、隣接する流れに応じて水を追加または除去する。

流出スケーリング

  • セル内の水量が負にならないよう、流出の流れを調整する。

地形の標高

  • 水が地形に沿って移動するよう、地形の標高を追加する。

境界条件

  • シミュレーションの境界で何が起こるかを考慮する必要がある。
  • 境界の流量値を設定して、壁、流入、流出などの条件を定義する。

粘性

  • 粘性を追加して、薄い水の層が移動しにくくなるようにする。

シミュレーション全体のコード

  • シミュレーションコードは、いくつかの2D配列に対する4つのforループで構成される。

モデルの欠点

  • 慣性と速度拡散がなく、速い水流が湖に入ると全方向に広がる。

ボーナス: 六角形/三角形格子

  • 三角形格子を使って水をシミュレートでき、これは六角形格子の双対とみなせる。

1件のコメント

 
GN⁺ 2025-02-08
Hacker Newsの意見
  • 流体シミュレーションでは、水が蓄積して隣接セルに影響を与える問題があることに言及。これは、手続き型生成ゲームで並列化が難しい理由の1つでもある

    • 手続き型生成は並列化に向いているが、無限ドメインでは並列化が難しい
    • このテーマについてはあまり探究されていないと指摘
    • Nick McDの仕事を称賛しつつ、彼の仕事もシミュレーション設計のためにドメインに制約があると述べる
    • 水系境界を手続き的に生成して、並列化しつつ水系全体を一度にシミュレーションする方法を提案
  • 流体シミュレーション開発では、美しい結果を眺めて時間を浪費してしまう危険が大きいと言及

    • 2011年の自身のGPUベース流体力学実装の経験を共有
    • 流体(血液)を表面(組織)上で2Dとしてシミュレーションし、重力と表面の傾きを考慮してメッシュに投影したと説明
  • Animal Crossingの資源収集方式は、地形操作なしでも効率的だと言及

    • 木を切って丸太を得るが、一定量の後はクールダウンが必要
    • 地形操作が不要なゲームでは、この方法のほうがよい可能性があると提案
  • Timberbornでは水の物理がゲームの重要要素であり、おすすめだと言及

    • 水をせき止めてエンジンや畑に使う方法を見つけることが、ゲームプレイの不可欠な部分
  • o3-mini-highを使って3Dで実装されたアルゴリズムを試した経験を共有

    • Perlin noiseを一から実装して地形生成に使ったと言及
  • 教育用の洪水シミュレーションを紹介し、WebGLを使って隣接セルベースでセル値を計算していると説明

    • モデル値を変更することで大きな効果が見られると説明
  • 水シミュレーションで慣性や速度拡散が不足する問題を解決する方法を提案

    • 流れ矢印の値を隣接する矢印と平均化することで解決できると説明
  • 個人プロジェクトとして始めた侵食シミュレーションへの好奇心を共有

    • 侵食を理解できず、プロジェクトが中断したと述べる
  • Creeper Worldで水をシミュレーションした後に爆弾を投下するアイデアに言及