Every planet in our universe has a unique landscape at very fine detail. While some look rather repetitive, some planets (as our earth-like planet) have a very heterogenous landscape that you can spend hours exploring. To compute our terrain functions, we use fractal sums of one or more basis functions. Spectral synthesis has the advantage of allowing for full control over the level of detail, provided that the used basis function has a known frequency bound. Using fractal sums, it is possible to generate highly complex patterns out of arbitrary simple basis functions. Both the basis function and the fractal sum can be exchanged, and both have a set of intuitive parameters that can be tweaked to get the desired result. In this section, we describe the basis functions, as well as the fractal combination function that we use to compute terrain, texture and other procedural elements.
Fractal terrains and textures can be constructed from arbitrary basis functions. The most commonly used basis function is Perlin's noise function, which we also used for our planets. It is also known as gradient noise to distinguish it from other noise functions which generate noise in a different way. We use Perlin's gradient noise because it seems to be most efficient to compute. Better quality can be archieved by adding gradient noise with value noise, or by using a convolution filters to perform the interpolation between the lattice points. Finally, sparse convolution interpolates between isotropically distributed points of random numbers rather than lattice points. While sparse convolution noise looks best, it is also expensive to calculate. The noise functions mentioned here are described in detail in TexturingAndModeling
We use three different kinds of fractal functions to generate our textures and height maps. The most simple one is fBm, which is simply a weighted sum of multiple scales of an arbitrary basis function, such as noise. The scales of the basis functions are also called octaves. fBm produces height fields similiar to those obtained by midpoint displacement. Its main advantage is simplicity. However it is not very suitable for creating realistic and heterogenous terrains.
The first variation of fBm that we used is the hybrid multifractal function presented in TexturingAndModeling. Like fBM, it is a fractal sum of octaves of some basis function. However, each octave is also weighted by the value of the previous octave. This results in a mix between a sum and a product of octaves, which is why it is a hybrid. A true multifractal is constructed by multiplying octaves together. The reason we don't use pure multifractals is that they produce values in very unstable ranges, and the level of detail is hard to control. Our earth-like planet uses a hybrid multifractal for the base terrain height.
Also interesting for creating realistic terrain is the ridged multifractal, also presented in TexturingAndModeling. It produces an output similiar to fBM but with sharp ridges everywhere and at all scales. It is very suitable for creating high mountains, sand dunes and other ridged shapes. We blend a ridged multifractal over the base fractal of our earth-planet to give our mountains a more realistic appearance. We also use ridged multifractals to create our moons. We found that perturbing the input coordinates of a ridged multifractal using simple fBM, interesting textures and terrain structures arise that occasionaly form structures that look like craters. They can be seen on our "Toon Moon" and on the small moon which doesn't have the "artificial" craters described in the next subsection.
We also use fractals to generate the textures of our planets. Our earth-like planet has a texture which resembles climate zones, where the climate depends on lattitude and height. The climate coordinate is perturbed by simple fBM. We also perturb the final output color to archieve an "impressionistic" effect.
In order to create realistic looking craters, the fractal generation is insufficient, or generates only ugly landscapes. For this, additional craters are added on some place by multiplying the heightvalues at some area of a heihgtmap with a factor, calculated depending on their distances to the crater-center and some variables set within the Crater-class.