Como proyecto personal, estoy tratando de hacer un generador de terreno que cree un terreno parecido al terreno liso de Castle Story.
Si no lo has visto antes, aquí: 

Como puede ver, es una combinación de bloques y bloques "suaves".
Lo que he intentado hacer para emular este aspecto es dar a cada bloque de superficie un mini mapa de altura. Esto generalmente funciona, pero hay algunos problemas, produciendo un terreno como este:

El problema es que cada bloque es 1x1x1, pero a veces la altura en una ubicación particular es negativa o> 1. En ese caso, la recorto y establezco la altura en 0 o 1.
Para ilustrar mejor lo que quiero decir, aquí hay un diagrama:

Para generar la altura, básicamente hago:
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);
    }
}¿Quizás me estoy acercando a esto incorrectamente usando el valor de ruido perlin "verdadero"?
Cualquier ayuda sería muy apreciada!
fuente


