The World Node has three distinct types of distribution.
- Clusters – where points are placed in clusters around other points.
- Map based – where points are distributed according to a density in a map.
- Terrestrial ecosystems – where an ecosystem is simulated.
I’ve been asked a number of times which paper I based the terrestrial ecosystems simulations on, so this post will look into that. The truth is that I read around 20 papers when creating this node (23 to be exact!), but one in particular kicked it all off.
Where it started
It all started when Andrew Camenisch, of Mudbox fame, sent me this paper: Guided Ecological Simulation For Artistic Editing. It’s a great document that talks about the implementation of cutting edge ecosystem simulation algorithms. The algorithms mentioned in that paper can be found here: Ground Cover and Vegetation in Level Editors. This really is an excellent, clear and complete paper which can be summarised, haphazardly, like so:
- Put some seeds on the ground.
- These seeds grow up over time.
- At a certain age they start dropping their own seeds.
- These seeds may or may not survive depending on where they land/ what resources are available.
- The surviving seeds grow up, and at a certain point drop their own seeds.
- Plants can die if they are starved of resources.
- Plants die when they get too old.
This is a major over simplification, but you get the picture. I decided to start doing some experiments on implementing these ideas — done on my commute to work of course — and these produced some really cool results, so I decided to just go ahead and turn it into a fully fledged MASH node.
In order to provide artistic control over the simulation, and to make it production worthy, it needed a few extra controls, these included:
- Avoidance meshes and curves.
- Id maps – for dictating what type of seed was planted where.
- Maps for soil conditions (such as moisture and soil quality).
- Mesh normal sampling for slope awareness (some genotypes might not like ground that is too steep).
- Sparcity controls.
- Sun/ shade controls.
On top of those there were a few additions that resulted in more realistic outcomes, including using sigmoidal curves for the growth rate and various quadratic curves for resilience and other genotype characteristics.
Almost everything in the above list is optional, meaning you can go from an empty scene to a basic forest in about 30 seconds. All the advanced stuff needs turning on.
Faster, faster, faster
There was however a problem; once you enabled all these things, everything started taking a bit more time then I deemed acceptable – and once I’d optimised all the additional features as much as possible, there was only one place to go, the algorithm itself. So I started experimenting with which bits of the simulation I could approximate, or what, given certain circumstances, could be skipped. The result is what we’ve ended up with in the shipping product, which gives a result of virtually the same quality and is about 2.5x faster then the original algorithm, so while it isn’t an exact implementation of the above paper, you shouldn’t really notice the difference.
To anyone who’s interested in this topic, content in these papers also resulted in code additions/ changes:
Effects of size, competition and altitude on tree growth
David A. Coomes and Robert B. Allen
Extended Competition Rules for Interacting Plants
Generating Spatial Distributions for Multilevel Models of Plant Communities
Brendan Lane and Przemyslaw Prusinkiewicz