Як особистий проект, я намагаюся зробити генератор рельєфу, який створить рельєф місцевості, схожий на рівну місцевість 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);
}
}
Можливо, я підходжу до цього неправильно, використовуючи "справжнє" значення шуму перлін?
Будь-яка допомога буде дуже вдячна!