2D水シミュレーションのアイデア


18

私は、2Dで水をシミュレートするために、かなり大きい(それを呼び出す)ブロックされた/ブロックされていないアレイ(側面から見た)に対する入力を探しています。次のアイデアを思いつきました。

セルオートマトン

セルオートマトンを使用して、CPUで大規模な並列シミュレーションを実行します。次のような簡単なルールで

  • 下部に開いているセルがある場合は、そこに移動します。
  • 左右のセルを確認し、2つからランダムに1つを選択して移動します。

長所

  • 実装が簡単。
  • マルチプレイヤーシステムでの意味のある/決定論的。

短所

  • おそらく本当に遅いです。
  • 納得できません。

GPUの流体力学

次のようなテクスチャに対してGPUで流体力学の大まかな近似を実行します。

+------+-----+-----+-------+
|R     |G    |B    |A      |
+------+-----+-----+-------+
|vX    |vY   |NULL |Density|
+------+-----+-----+-------+

長所

  • おそらく本当に速いです。
  • かなり説得力があります。
  • さらにピクセルシェーダーを使用すると、直接レンダリングできます。

短所

  • 実装が難しい。
  • 微調整が難しい。
  • レベルのサイズのテクスチャを1つ割り当てることはできません。
    • グリッド領域を重ねることもできますが、これによりさらに複雑になります。

粒子

粒子を使用して水をシミュレートします。加算ブレンディングを使用したレンダリング中に、アルファチャネルに乗算関数を適用して、水の鮮明なエッジを与えます。

長所

  • おそらく素敵になります。
  • 実装が簡単。
  • レンダリングが簡単。
  • マルチプレイヤーシステムでは意味がありますが、転送にはかなりの帯域幅が必要になります。

短所

  • 粒子間効果はおそらく遅いでしょう(近傍検索)。
  • 固体空間から水が「漏れる」可能性があります(固体空間が小さいため、たとえば1px)。
  • 粒子のサイズによっては、水に奇妙な穴が開く可能性があります。
  • 上記の両方は、粒子を実際のサイズよりも近くにドリフトさせることで緩和できますが、粒子間および粒子/ランドスケープのパフォーマンスに問題が発生します。

さらにアイデアはありますか?

注:これは概算であり、ここでは物理的に正しい水を探しているわけではありません-「十分」なもの(迅速で汚れた場合のボーナスポイント)だけです。ゲームはマルチプレイヤーなので、残念ながらレベル全体を継続的にシミュレートする必要があります。

回答:


12

水をシミュレートしようとするたびに、水位を表すテクスチャにローパスフィルターを適用しました。実装は非常に簡単ですが、大きな波を生成する可能性のある水位の大きな変化を取得するたびに失敗します。この方法では、川の端など、水が常に一定のレベルになる場所がいくつかあります。そのような場合、その特定のピクセルに対してちょうどいい色を使います。

長所:

  • 実装が簡単
  • 穏やかな海の場合の現実的な結果
  • GPUを使用した高速計算
  • 静的な水位または水源を簡単に定義できます

短所:

  • 波をシミュレートできない

波状の水については、セルオートマタアルゴリズムに似た方法を使用しますが、シェーダーを使用して現在の状況から次のステップを計算できるように少し変更しました。ここに、sudoコードがあります。ピクセルカラー:

foreach (pixel p) in oldTexture
{
    newtexture.pixels[p.x,p.y]    += p.color / 5;
    newtexture.pixels[p.x+1,p.y]  += p.color / 5;
    newtexture.pixels[p.x-1,p.y]  += p.color / 5;
    newtexture.pixels[p.x,p.y+1]  += p.color / 5;
    newtexture.pixels[p.x,p.y-1]  += p.color / 5;
}

このアルゴリズムは、以前のものとすべて似た機能を備えていますが、穏やかな水よりも波状の水でより良く機能します。どちらを使用するかをシミュレートする海に基づいて選択します。

最終的には、各位置の水位を示すテクスチャがあります。次のステップでは、何らかの方法で結果を描画する必要があります。最も簡単な方法は、水位データに基づいてメッシュを生成することです。


ありがとう、それは素晴らしい答えだ。質問はもう少し開いたままにします。しかし、私はここの周りに1つの答えの質問をするコツを持っているようです:)。
ジョナサンディキンソン

これらのアルゴリズムを組み合わせて、より良い結果を得ることができます。
Ali1S232

スクリーンショットはどうですか?
ashes999

@ ashes999スクリーンショットはありませんが、ここでは同じアルゴリズムが実装されています!youtube.com/watch?v=avJPrL9UJ28
Ali1S232
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.