Jump to content

  • Log In with Google      Sign In   
  • Create Account

Smooth Voxel Terrain Generation


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 tb2009   Members   -  Reputation: 128

Like
0Likes
Like

Posted 27 December 2012 - 08:55 PM

As a personal project, I'm trying to make a terrain generator that will create terrain looking something like the Castle Story smooth terrain.
 
zFzVX.jpg
 
 
The terrain is essentially cubes, but the top layer is smoothed out.
 
What I've tried to do to emulate this look is to give each surface block a mini heightmap.  This generally works, but there are some issues, yielding a terrain like this:
 
7MIZT.png
 
 
 
The problem is that sometimes, the height is out of the bounds of the 1x1x1 cubes in my world, in which case I clip the heights to 0 or 1.:
y2uGf.png
 
Here's my terrain generation code:
 
noise2d(float x, float z); // uses simplex noise to determine the height of a column

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);
    }
}

 

 

 

 
Is my method incorrect in any way?  Is there any way I could make the noise function not as steep?

Edited by tb2009, 27 December 2012 - 10:17 PM.


Sponsor:

#2 Suspense   Members   -  Reputation: 449

Like
1Likes
Like

Posted 28 December 2012 - 10:04 AM

Changing the noise function won't do anything to solve the problem.  It may or may not make it less noticeable, but the actual problem will still be there.  What does it look like without clamping the values to [0, 1]?  I expect it would smooth out the terrain, but then some of the blocks would extend a bit past their grid spot.  But is that really a problem?

 

The other suggestion I can make is to look into an algorithm like marching cubes.  This lets you extract a polygonal mesh that describes the surface defined by your noise function.  A little extra work will make it generate the cubed pieces you're looking for.



#3 tb2009   Members   -  Reputation: 128

Like
0Likes
Like

Posted 28 December 2012 - 04:38 PM

Without clamping the range to [0, 1], collision detection becomes extremely complicated, as an extreme slope could cut through potentially all the blocks in a column.



#4 Suspense   Members   -  Reputation: 449

Like
1Likes
Like

Posted 31 December 2012 - 09:10 AM

That's a good point.  Have you looked at marching cubes?  The algorithm will help you generate just the smooth parts of the actual terrain, then you'd have to add the flat sides of the cubes yourself.  It isn't too hard, but it can be slow for large terrains.






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS