私は現在、3D環境で地形を生成するためにフラクタルブラウン運動と組み合わせて呼び出されると思われるバリューノイズを使用しています。-1 から +1 の範囲の値で、ノイズから 2D 高さマップを生成します。私は通常、その戻り値に 10 程度を掛けて高さを設定し、なだらかな丘を生成します。
私がやりたいことは、アルゴリズムへの呼び出しを何らかの形で組み合わせて、非常に丘陵の多い地域、非常に平らな地域、ほとんど山岳地帯のある地域を作成することです。エリア間のエッジが非常に明白になることなく、どのようにしてそのようなことを行うのですか (突き出た崖がそれらを分離するなど)?
編集:これは、無限に近い環境で完全に手続き型である必要があります。
ananthonline の回答に基づいて、ノイズ ジェネレーターへの低周波呼び出しをマスクとして使用しています。2 つのバイオーム タイプを使用して、バイオームの「影響」を取り、マスク値の絶対値からマスクの「場所」を引いて、その値全体を「影響」値で再度割ります。
(Impact- abs(Mask - Location)) / Impact
これにより、正の場合、特定の周波数、振幅など (なだらかな丘、山、海など) の特定のノイズ コールの戻り値に向かって乗算できる値が得られます。
ここでの主な問題は、例としてマスクが 0 から 1 の値を返した場合、(2 つのバイオームのシナリオで) 1 つのバイオームの位置を .25 に、もう 1 つのバイオームの位置を .75 に、強度を .5 に設定する必要があることです。それぞれが適切にブレンドされるようにします。少なくとも、各バイオーム タイプを均等に分散させ、それらを適切にブレンドしたい場合は. たとえば、なだらかな丘の 2 倍の頻度で山を表示したい場合、かなり苦労するでしょう。
それが理にかなっていることを願っています。数学は素晴らしくうまくいきますが、限られた数学のバックグラウンドと知識ではうまく説明できていないと思います. GetNoise2d が 0 から 1 の間の値を返すことに注意してください。
float GetHeight(float X, float Z)
{
float fRollingHills_Location = .25f, fRollingHills_Impact = .5f, fRollingHills = 0;
float fMountains_Location = .75f, fMountains_Impact = .5f, fMountains = 0;
float fMask = GetNoise2d(0, X, Z, 2, .01f, .5f, false, false);
float fRollingHills_Strength = (fRollingHills_Impact - Math.Abs(fMask - fRollingHills_Location)) / fRollingHills_Impact;
float fMountains_Strength = (fMountains_Impact - Math.Abs(fMask - fMountains_Location)) / fMountains_Impact;
if (fRollingHills_Strength > 0)
fRollingHills = fRollingHills_Strength * (GetNoise2d(0, X, Z, 2, .05f, .5f, false, false) * 10f + 25f);
if (fMountains_Strength > 0)
fMountains = fMountains_Strength * (GetNoise2d(0, X, Z, 2, .1f, .5f, false, false) * 25f + 10f);
return fRollingHills + fMountains;
}
上記のコードの問題を特定する必要がある場合、たとえば 10 の異なるバイオームでこれを行うには、正確な「場所」と「影響」の値に極端な考慮が必要になるため、ブレンドが完璧であることを確認してください。 . すでに処理されていることを確認するような方法でコーディングしたいと思います。