ダイヤモンドスクエアアルゴリズムを使用してランダムな地形を生成しています。 これらの大きな円錐形を地形に突き刺すか、地形に突き刺す以外は問題ありません。 問題は、すべての時点でポイントがどちらかの方法が高すぎるか、あまりにも低く設定されているようです。ここでダイヤモンドスクエアアルゴリズムのスムージング問題
は、問題の絵
あり、より良い、私は滑らかさが本当に高く設定すると
そしてここでは私のコードで見ることができます -
private void CreateHeights()
{
if (cbUseLand.Checked == false)
return;
int
Size = Convert.ToInt32(System.Math.Pow(2, int.Parse(tbDetail.Text)) + 1),
SideLength = Size - 1,
d = 1025/(Size - 1),
HalfSide;
Heights = new Point3D[Size, Size];
float
r = float.Parse(tbHeight.Text),
Roughness = float.Parse(RoughnessBox.Text);
//seeding all the points
for (int x = 0; x < Size; x++)
for (int y = 0; y < Size; y++)
Heights[x, y] = Make3DPoint(x * d, 740, y * d);
while (SideLength >= 2)
{
HalfSide = SideLength/2;
for (int x = 0; x < Size - 1; x = x + SideLength)
{
for (int y = 0; y < Size - 1; y = y + SideLength)
{
Heights[x + HalfSide, y + HalfSide].y =
(Heights[x, y].y +
Heights[x + SideLength, y].y +
Heights[x, y + SideLength].y +
Heights[x + SideLength, y + SideLength].y)/4 - r + ((float)(random.NextDouble() * r) * 2);
}
}
for (int x = 0; x < Size - 1; x = x + SideLength)
{
for (int y = 0; y < Size - 1; y = y + SideLength)
{
if (y != 0)
Heights[x + HalfSide, y].y = (Heights[x, y].y + Heights[x + SideLength, y].y + Heights[x + HalfSide, y + HalfSide].y + Heights[x + HalfSide, y - HalfSide].y)/4 - r + ((float)(random.NextDouble() * r) * 2);
if (x != 0)
Heights[x, y + HalfSide].y = (Heights[x, y].y + Heights[x, y + SideLength].y + Heights[x + HalfSide, y + HalfSide].y + Heights[x - HalfSide, y + HalfSide].y)/4 - r + ((float)(random.NextDouble() * r) * 2);
}
}
SideLength = SideLength/2;
r = r/Roughness;
}
}
これは非常に面白いです...私はランダム性を完全に取り出したので、 4つの周辺ポイントの平均ですが、私はどこでもこれらの "ディンプル"を取得します。 – Frobot
両方のループでランダム性を取りましたか? –
はい私は完全に任意のランダム性を取り除きました。途中でポイントを盛り上げて、エッジの周りから真ん中にかけてスムーズに移行する必要がありますが、ポイントが乱れている部分はまだあります。 – Frobot