2017-09-06 7 views
0

土地の高さと水面の高さを含むダブル配列があり、この配列を変更して繰り返し呼び出すように関数move_water()を作成しようとしています機能の水は地形に沿って移動する模倣されます...ランドスケープで水を模倣する方法

私の最初の本能は:各ブロックの

  • 、近くの4つの他のブロックを見て、水のレベルを比較します。
  • 中間のブロックの水の1/2を他の4つのブロックに分けます(均等に分割しますが、それが低い場合のみ)。

これは本当に、けれども非常にうまく機能し、任意のブロックの水位が水のシミュレーションは完璧である必要はありません

2つの値の間で振動するようだといくつかの奇妙な波のパターンを作成していませんちょうどそれが最低点に流れるようにしたい

+0

水はある時点で流れなくなりますか?私は波が現実的だと思うが、あなたが望むかどうかわからない。 – anatolyg

+0

他の4つのブロックにmax(!)1/2の水を与えることで修正できますか? 'otherblocks.waterlevel + newWater> currentblock.waterlevel - newWater'がそれらの値と等しい場合。 – CFrei

+0

"現実的な"シミュレーションでは、水の速度*も考慮する必要があります(垂直のみと仮定して)。 – meowgoesthedog

答えて

1

あなたはそれが完璧である必要はないと言いますから、水の移動量に関して定義されたステップで更新することは問題ではないかもしれません。水の半分が動くのに要する時間は、勾配と水の量によって変わります。したがって、急な斜面にある大量の水の半分は、それほど急な斜面では少ない量の時間と同じ時間がかかるということは、まだ奇妙に見えるかもしれません。しかし、あなたの方法はまだ潜在的可能性があります。

move_waterの呼び出しごとに1ブロックまたはすべてのブロックを更新すると、それは奇妙に見えるので、私はその1つだけではないと仮定します。

すべてのブロックを処理すると仮定すると、ルールはブロックを処理する順序によって異なる結果になります。 x座標を大きくする順番で処理するだけで、なぜ不自然な波が表示されるのか想像することができます(下のブロックは別のブロックから取得し、次に別のブロックに与えて再び獲得することができます)。一方、最高点を最初に処理した場合、または最高の高さの差の順に処理した場合は、より良い結果を得ることができます。

土地と水を合わせた高さを考慮する必要があります。水の半分ではなく、高さの差の半分を動かしてみることをおすすめします。

これをまだ実行していない場合は、1次元、フラットな地形を考慮して、ブロック内のさまざまな水量を開始して、起こっていることを簡単に解決できるようにすることができます。

最後に、水を斜めに動かすことなく、上下左右を意味する場合、周りのブロックの4つに水を移動するだけで少し奇妙に見えます。一次元でうまく流れていれば、2Dの場合は近くにある8つのブロックに移動することを検討してください(ブロックが長方形のグリッド内にあると仮定して)。

0

侵食が心配されていない場合、あなたがあなたのlast questionから得たシンプルな解決策に行くと思います。あなたの風景から1次元配列を構築しなければならないし、新しい平均(そこに私の答えを参照してください)を取得した後、あなたの2次元配列を実行し、その平均値未満になる高さを調整します。

関連する問題