Posted 04 February 2011 - 04:29 PM
I just noticed this thread, skimmed through it quickly, and have a couple comments to make. Hopefully I'm not repeating or contradicting other advice that I may have missed in my skim. BTW, I am creating a 3D simulation/graphics/game engine with a top priority to support "procedurally generated content". This includes creation, assembly, manipulation and destruction of pretty much everything, including shape, object, sound, voice, etc. If anyone is interested in joining such a project, especially to take on research and implementation of one or more subsystems, please contact me via gamedev personal messages and then we can switch to private email and/or messengers.
First, regarding issues like the intersection of things like "mountains, rivers and cities", the approach I decided to take (still entirely on paper) is to consider (and follow) the natural flow of processes. In other words, galaxies come first (if relevant), then solar systems, then planets, then continents (sorta), then mountains, then rivers that erode the mountains and create, then etch, then partially fill the valleys, then cities, etc.
By following the natural order entities form, you never run into wacky situations... like having a city and then trying to run a river through it.
Another observation. It seems best to literally design the algorithms and code for each kind of object (office buildings, homes, roads, cars, tables, chairs, windows, etc). There is just too much "historical accident" involved in every kind of existent to have a generalized routine that invents whole new worlds and devices and processes from scratch (without even knowing the characteristics of real, existing materials they must be made from). Once you do this in a general way... meaning the functions that create the objects take lots of arguments to hint or specify many different characteristics of the existent... you find that many fundamental and general support functions become necessary to serve those specific-purpose functions.
Someone asked about noise-like randomizing functions (that generate values between -1.000 and +1.000). I wrote 1D, 2D, 3D, 4D versions of functions like that, which I'm willing to share for research, learning and experimentation. They are akin to "simplex" noise, which is somewhat similar to perlin noise except also has a continuous second derivative whereas perlin is continuous only in the first derivative. Like all similar functions that are useful for procedurally generated content, these are repeatable functions.