Randomness and Noise - TheShubham99/Terasology GitHub Wiki
Randomness and Noise
Random numbers play a major role in procedural terrain generation and many other dynamically created content in the game. There are different random number generators and different types of noise.
Random Numbers
There are two implementations of the Random
interface: FastRandom
and MersenneRandom
. As you might expect, the first one is rather simplistic, which makes it very fast. In some cases, the quality is not sufficient though and we recommend the implementation that is based on the Mersenne prime number twister. It is very close to real noise, but more expensive to compute.
Rule of thumb: Use MersenneRandom
when looking at very small value ranges (e.g. floats between 0 and 0.000001 or boolean values), FastRandom otherwise.
Noise
Noise generators are similar to random number generators, but provide a deterministic value per coordinate in space.
The PerlinNoise
and SimplexNoise
classes assign random gradient in a regular grid (Perlin uses squares/cubes, Simplex uses triangles/tetrahedrons) and interpolate in between. Simplex is a bit faster than Perlin, in particular for higher dimensions at comparable noise quality. Noise is isotropic (looks the same independent from direction or position).
The BrownianNoise
class integrates values from other noise implementations. This allows for adjustment of noise frequencies. For example, different layers of Perlin noise can be put on top of each other at different spatial scales and at different amplitudes. This gives the prominent Perlin noise textures.
The FastNoise
class is a bit different as it works on discrete numbers. This is good enough for per-block noise values. It is about 2x faster than SimplexNoise and 5x faster than PerlinNoise. Noise values repeat after 256, i.e. noise(256) is equal to noise(0).
Rule of thumb: Use SimplexNoise
whenever possible. Noise that is required per block can also be computed using FastNoise
.