2

Minecraft風のチャンクを使用する地形エンジンをプログラミングしています。チャンクは、Diamond-squareアルゴリズムを使用して個別に生成されます。

問題は、これらのチャンクが整列しておらず、完全に分離していることです。私はそれらをそうさせるために多くのことを試みました、しかし今のところそれがそうするべきであるように何もうまくいきませんでした。

編集:また、私が作成しようとしている世界は無限ではありません。33x33のチャンクの配列を生成し、それぞれに別のダイアモンドスクエアジェネレーターによって割り当てられたグローバルな高さの値があります。

ダイアモンドスクエアエンジンを変更してチャンクを整列させる(簡単な、できれば)方法はありますか?

4

2 に答える 2

0

では、ダイアモンドスクエアアルゴリズムの各トップレベルのスクエアを個別のチャンクとして生成しますか?

そのチャンクの4つのコーナーポイントを周囲のチャンクと共有する必要があります。

これを行うには非常に簡単な方法があります。2つのパラメーター(2Dで地形を生成していると仮定)を持つノイズ関数が必要です。同じシードに対して常に同じ疑似乱数を返す関数(マップ全体で一定のまま)と2つのパラメーターです。したがって、座標[-100、500]の値を関数に要求すると、常に同じ数値が得られます(これにより、周囲のチャンクが確実に整列します)。

このような関数の例は次のとおりです。

function Noise1(integer x, integer y)
    n = x + y * 57
    n = (n<<13) ^ n;
    return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    
end function

ソース

編集:

私の悪い点-パラメータ化されたノイズ関数は、4つのコーナーポイントだけに依存するべきではありません。ダイヤモンド二乗アルゴリズム内で生成されるすべての乱数に使用する必要があります。

これがうまくいかない場合、あなたはあなたの側で何か間違ったことをしています。

于 2012-04-16T20:55:59.890 に答える
0

この答えを参照してください: ダイヤモンドスクエアフラクタルアルゴリズムを無限にする

あなたのより良い賭けは、完全にノイズを出すか、私の気の利いた無限のダイヤモンド二乗アルゴリズムを使用することです。そして、あなたの端で、それを切り捨てるだけです。ある地域をチャンクと呼びたいのなら、そうしてください。そのような無限のフィールド内の任意のポイントを簡単に検索できます。

または、ここでの私の説明と実装例:http: //godsnotwheregodsnot.blogspot.com/2013/11/field-diamond-squared-fractal-terrain.html

于 2013-11-09T17:11:19.810 に答える