私は、2Dで水をシミュレートするために、かなり大きい(それを呼び出す)ブロックされた/ブロックされていないアレイ(側面から見た)に対する入力を探しています。次のアイデアを思いつきました。
セルオートマトン
セルオートマトンを使用して、CPUで大規模な並列シミュレーションを実行します。次のような簡単なルールで
- 下部に開いているセルがある場合は、そこに移動します。
- 左右のセルを確認し、2つからランダムに1つを選択して移動します。
長所
- 実装が簡単。
- マルチプレイヤーシステムでの意味のある/決定論的。
短所
- おそらく本当に遅いです。
- 納得できません。
GPUの流体力学
次のようなテクスチャに対してGPUで流体力学の大まかな近似を実行します。
+------+-----+-----+-------+
|R |G |B |A |
+------+-----+-----+-------+
|vX |vY |NULL |Density|
+------+-----+-----+-------+
長所
- おそらく本当に速いです。
- かなり説得力があります。
- さらにピクセルシェーダーを使用すると、直接レンダリングできます。
短所
- 実装が難しい。
- 微調整が難しい。
- レベルのサイズのテクスチャを1つ割り当てることはできません。
- グリッド領域を重ねることもできますが、これによりさらに複雑になります。
粒子
粒子を使用して水をシミュレートします。加算ブレンディングを使用したレンダリング中に、アルファチャネルに乗算関数を適用して、水の鮮明なエッジを与えます。
長所
- おそらく素敵になります。
- 実装が簡単。
- レンダリングが簡単。
- マルチプレイヤーシステムでは意味がありますが、転送にはかなりの帯域幅が必要になります。
短所
- 粒子間効果はおそらく遅いでしょう(近傍検索)。
- 固体空間から水が「漏れる」可能性があります(固体空間が小さいため、たとえば1px)。
- 粒子のサイズによっては、水に奇妙な穴が開く可能性があります。
- 上記の両方は、粒子を実際のサイズよりも近くにドリフトさせることで緩和できますが、粒子間および粒子/ランドスケープのパフォーマンスに問題が発生します。
さらにアイデアはありますか?
注:これは概算であり、ここでは物理的に正しい水を探しているわけではありません-「十分」なもの(迅速で汚れた場合のボーナスポイント)だけです。ゲームはマルチプレイヤーなので、残念ながらレベル全体を継続的にシミュレートする必要があります。