Como projeto pessoal, estou tentando criar um gerador de terreno que crie um terreno parecido com o terreno liso do Castle Story.
Se você nunca viu isso antes, aqui:
Então, como você pode ver, é uma combinação de blocos e blocos "suaves".
O que tentei fazer para imitar esse visual é fornecer a cada bloco de superfície um mini mapa de altura. Isso geralmente funciona, mas existem alguns problemas, resultando em um terreno como este:
O problema é que cada bloco é 1x1x1, mas às vezes a altura em um local específico é negativa ou> 1. Nesse caso, eu o recorte e defino a altura como 0 ou 1.
Para ilustrar melhor o que quero dizer, aqui está um diagrama:
Para gerar a altura, eu basicamente faço:
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);
}
}
Talvez eu esteja abordando isso incorretamente usando o valor de ruído perlin "verdadeiro"?
Qualquer ajuda seria muito apreciada!
fonte