(EDIT:
First draft: Drive Link
Second Draft: Drive Link
Final uploaded version: Drive Link)
This is a rough sketch of what’s running in my mind about the terrain generation topic. Nothing is set in stone at this point, just me trying to articulate my thoughts, looking for feedback. This needs more elaborating, but this is the high level model I have in mind.
Current state of things:
From what I have gathered, currently terrain generation is done on a local per-block basis: a noise generator decides heightmap data for every (x, y) coordinate, and based on some threshold, block placement is decided. There is some complexity related to different noise generators for different biomes, but that in itself is decided on the basis of a Perlin noise generator, which decides temperature and humidity, which in turn decides the biome a particular block is in. All this makes the terrain look a bit wrong.
What I think would be better:
Terrain generation to be done in multiple passes. (As pointed out here: https://github.com/MovingBlocks/Terasology/issues/943)
First Pass:
A first high level pass which decides biome “nodes”: points representing a large span of area, like say a mountain range, or swamp area, or ocean. As new parts of the world are explored, the frontier of nodes expands, with biomes being designated according to a function(what kind?) of neighbouring biome nodes that are already generated.
(An implicit property would be that the world would be different for different order of exploration)
At this point we have a large scale view of the world:
All the different biomes have some parameters which are decided at “node” generation time:
General parameters like effective radius of biome, humidity; and specific parameters: Mountains might have max-height, flatness/pointy-ness, number of parallel ranges (read: strands of mountains)
(How to decide the location and shape of the boundary of biomes?)
Second pass: Based on the biome parameters we generated, generate a terrain heightmap (still not block-scale but maybe chunk-scale, or larger).
At this stage, we add secondary features like caves, overhangs, rivers, lakes.
(terrain deformation is the term that best describes this)
How to add caves and rivers? How do we make sure this propagates to the next phase?
Third pass: At this stage, the actual placement of blocks is done. We do some interpolation for intermediate positions between points we have heightmap values.
Surface features like flora placement can be done at this point.(need to elaborate on this)
I have collected some relevant forum threads, and also links from outside the forum while researching this (haven't digested the content of each properly):
First draft: Drive Link
Second Draft: Drive Link
Final uploaded version: Drive Link)
This is a rough sketch of what’s running in my mind about the terrain generation topic. Nothing is set in stone at this point, just me trying to articulate my thoughts, looking for feedback. This needs more elaborating, but this is the high level model I have in mind.
Current state of things:
From what I have gathered, currently terrain generation is done on a local per-block basis: a noise generator decides heightmap data for every (x, y) coordinate, and based on some threshold, block placement is decided. There is some complexity related to different noise generators for different biomes, but that in itself is decided on the basis of a Perlin noise generator, which decides temperature and humidity, which in turn decides the biome a particular block is in. All this makes the terrain look a bit wrong.
What I think would be better:
Terrain generation to be done in multiple passes. (As pointed out here: https://github.com/MovingBlocks/Terasology/issues/943)
First Pass:
A first high level pass which decides biome “nodes”: points representing a large span of area, like say a mountain range, or swamp area, or ocean. As new parts of the world are explored, the frontier of nodes expands, with biomes being designated according to a function(what kind?) of neighbouring biome nodes that are already generated.
(An implicit property would be that the world would be different for different order of exploration)
At this point we have a large scale view of the world:
All the different biomes have some parameters which are decided at “node” generation time:
General parameters like effective radius of biome, humidity; and specific parameters: Mountains might have max-height, flatness/pointy-ness, number of parallel ranges (read: strands of mountains)
(How to decide the location and shape of the boundary of biomes?)
Second pass: Based on the biome parameters we generated, generate a terrain heightmap (still not block-scale but maybe chunk-scale, or larger).
At this stage, we add secondary features like caves, overhangs, rivers, lakes.
(terrain deformation is the term that best describes this)
How to add caves and rivers? How do we make sure this propagates to the next phase?
Third pass: At this stage, the actual placement of blocks is done. We do some interpolation for intermediate positions between points we have heightmap values.
Surface features like flora placement can be done at this point.(need to elaborate on this)
I have collected some relevant forum threads, and also links from outside the forum while researching this (haven't digested the content of each properly):
Forum Threads:
Other places:
- Voxel Farm Dev Interview notes: https://forum.terasology.org/threads/fyi-procedural-world-developer-interview.697/
- Vizaxo’s Proposal Biome Based Generation: https://forum.terasology.org/threads/gsoc-project-biome-based-world-generator-and-earth-like-world.1833/#post-14828
- The all important sector thread: https://forum.terasology.org/threads/new-conceptual-layer-sector-plus-musings-on-multi-world-node.1420/
- Biome Hacking: https://forum.terasology.org/threads/biome-hacking-and-natural-evolution.2192/#post-16094
- Thread to reduce worldgen complexity: https://forum.terasology.org/threads/can-we-reduce-faceted-worldgen-api-complexity.1711/
- Perlin World Improvements: https://forum.terasology.org/threads/core-perlin-world-improvements.1093/
- Procedural Grammars: https://forum.terasology.org/threads/procedural-architecture-grammar.586/
- Terrain Generation proposal from 2016: https://forum.terasology.org/threads/hello-from-the-other-side-of-the-world.1472/#post-13033
- Terrain Deformers: https://forum.terasology.org/threads/terrain-deformers.1552/#post-13629
- Previous terrain generation proposal which from what I gather couldn’t get selected: https://docs.google.com/document/d/1x7rUzcejfusY-hHFuSPQRdLJTT76UA_L5K4TDU-RoQA/edit?copiedFromTrash
There’s also a lot of info in that student’s intro thread: https://forum.terasology.org/threads/hello-im-heroesgrave.2130/#post-15775 - Shattered Planes: https://forum.terasology.org/threads/shattered-planes.1492/
- 1:1 scale GB, has some info about how chunks are stored: https://forum.terasology.org/threads/really-really-big-worlds.1909/#post-15243
- Lakes implementation thread: https://forum.terasology.org/threads/lakes.1551/#post-13617
Other places:
- Very interesting way to generate large scale terrain features that look natural: http://procworld.blogspot.com/2016/04/geometry-is-destiny.html and
http://procworld.blogspot.com/2016/07/geometry-is-destiny-part-2.html - Lakes: http://procworld.blogspot.com/2014/01/leveling-lakes.html
- Is this what the admins had in mind when writing that idea? What modifications should I make?
- Is there more groundwork required before this can be done as proposed?
Last edited: