В качестве личного проекта я пытаюсь создать генератор ландшафта, который создаст ландшафт, похожий на гладкий ландшафт Castle Story.
Если вы не видели этого раньше, здесь:
Как видите, это комбинация блоков и «гладких» блоков.
То, что я пытался сделать, чтобы подражать этому виду, это дать каждому блоку поверхности мини-карту высот. Обычно это работает, но есть некоторые проблемы, которые приводят к появлению ландшафта вроде этого:
Проблема в том, что каждый блок имеет размер 1x1x1, но иногда высота в определенном месте отрицательна или> 1. В этом случае я обрезаю его и устанавливаю высоту 0 или 1.
Чтобы лучше проиллюстрировать, что я имею в виду, вот схема:
Чтобы сгенерировать высоту, я в основном делаю:
genColumn(int x, int z)
{
int highestBlockY = (int)noise2d(x, z);
bool is_surface = true;
for(int y = max_height - 1; y >= 0; y--)
{
Block b;
if(is_surface)
{
b = Block.Grass;
b.HasHeightMap = true;
// generate heightmap
for(int ix = 0; ix < 5; ix++)
{
for(int iz = 0; iz < 5; iz++)
{
float heightHere = noise2d(x + ix / 4, z + iz / 4) - y;
// clip heights
if(heightHere > 1)
heightHere = 1;
if(heightHere < 0)
heightHere = 0;
b.HeightMap[ix][iz] = heightHere;
}
}
is_surface = false;
}
else
{
b = Block.Dirt;
}
setBlock(x, y, z, b);
}
}
Возможно, я неправильно подхожу к этому, используя «истинное» значение шума Перлина?
Любая помощь будет принята с благодарностью!
источник