Lua_api.txt: Improve noise documentation

This commit is contained in:
Paramat 2018-03-22 02:36:52 +00:00 committed by GitHub
parent cd6bcef6d9
commit 5e2096e396
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1118,54 +1118,112 @@ A box of a regular node would look like:
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
Perlin noise
------------
Perlin noise creates a continuously-varying value depending on the input values.
Usually in Minetest the input values are either 2D or 3D co-ordinates in nodes.
The result is used during map generation to create the terrain shape, vary heat
and humidity to distribute biomes, vary the density of decorations or vary the
structure of ores.
### Structure of perlin noise
An 'octave' is a simple noise generator that outputs a value between -1 and 1.
The smooth wavy noise it generates has a single characteristic scale, almost
like a 'wavelength', so on its own does not create fine detail.
Due to this perlin noise combines several octaves to create variation on
multiple scales. Each additional octave has a smaller 'wavelength' than the
previous.
This combination results in noise varying very roughly between -2.0 and 2.0 and
with an average value of 0.0, so `scale` and `offset` are then used to multiply
and offset the noise variation.
The final perlin noise variation is created as follows:
noise = offset + scale * (octave1 +
octave2 * persistence +
octave3 * persistence ^ 2 +
octave4 * persistence ^ 3 +
...)
Noise Parameters Noise Parameters
---------------- ----------------
Noise Parameters, or commonly called "`NoiseParams`", define the properties of Noise Parameters are commonly called `NoiseParams`.
perlin noise.
### `offset` ### `offset`
Offset that the noise is translated by (i.e. added) after calculation. After the multiplication by `scale` this is added to the result and is the final
step in creating the noise value.
Can be positive or negative.
### `scale` ### `scale`
Factor that the noise is scaled by (i.e. multiplied) after calculation. Once all octaves have been combined, the result is multiplied by this.
Can be positive or negative.
### `spread` ### `spread`
Vector containing values by which each coordinate is divided by before For octave1, this is roughly the change of input value needed for a very large
calculation. variation in the noise value generated by octave1. It is almost like a
Higher spread values result in larger noise features. 'wavelength' for the wavy noise variation.
Each additional octave has a 'wavelength' that is smaller than the previous
octave, to create finer detail. `spread` will therefore roughly be the typical
size of the largest structures in the final noise variation.
A value of `{x=250, y=250, z=250}` is common. `spread` is a vector with values for x, y, z to allow the noise variation to be
stretched or compressed in the desired axes.
Values are positive numbers.
### `seed` ### `seed`
Random seed for the noise. Add the world seed to a seed offset for world-unique This is a whole number that determines the entire pattern of the noise
noise. In the case of `minetest.get_perlin()`, this value has the world seed variation. Altering it enables different noise patterns to be created.
automatically added. With other parameters equal, different seeds produce different noise patterns
and identical seeds produce identical noise patterns.
For this parameter you can randomly choose any whole number. Usually it is
preferable for this to be different from other seeds, but sometimes it is useful
to be able to create identical noise patterns.
When used in mapgen this is actually a 'seed offset', it is added to the
'world seed' to create the seed used by the noise, to ensure the noise has a
different pattern in different worlds.
### `octaves` ### `octaves`
Number of times the noise gradient is accumulated into the noise. The number of simple noise generators that are combined.
A whole number, 1 or more.
Each additional octave adds finer detail to the noise but also increases the
noise calculation load.
3 is a typical minimum for a high quality, complex and natural-looking noise
variation. 1 octave has a slight 'gridlike' appearence.
Increase this number to increase the amount of detail in the resulting noise. Choose the number of octaves according to the `spread` and `lacunarity`, and the
size of the finest detail you require. For example:
A value of `6` is common. if `spread` is 512 nodes, `lacunarity` is 2.0 and finest detail required is 16
nodes, octaves will be 6 because the 'wavelengths' of the octaves will be
512, 256, 128, 64, 32, 16 nodes.
### `persistence` ### `persistence`
Factor by which the effect of the noise gradient function changes with each Each additional octave has an amplitude that is the amplitude of the previous
successive octave. octave multiplied by `persistence`, to reduce the amplitude of finer details,
as is often helpful and natural to do so.
Since this controls the balance of fine detail to large-scale detail
`persistence` can be thought of as the 'roughness' of the noise.
Values less than `1` make the details of successive octaves' noise diminish, A positive or negative non-zero number, often between 0.3 and 1.0.
while values greater than `1` make successive octaves stronger. A common medium value is 0.5, such that each octave has half the amplitude of
the previous octave.
A value of `0.6` is common. This may need to be tuned when altering `lacunarity`; when doing so consider
that a common medium value is 1 / lacunarity.
### `lacunarity` ### `lacunarity`
Factor by which the noise feature sizes change with each successive octave. Each additional octave has a 'wavelength' that is the 'wavelength' of the
previous octave multiplied by 1 / lacunarity, to create finer detail.
'lacunarity' is often 2.0 so 'wavelength' often halves per octave.
A value of `2.0` is common. A positive number no smaller than 1.0.
Values below 2.0 create higher quality noise at the expense of requiring more
octaves to cover a paticular range of 'wavelengths'.
### `flags` ### `flags`
Leave this field unset for no special handling. Leave this field unset for no special handling.
Currently supported are `defaults`, `eased` and `absvalue`:
Currently supported are `defaults`, `eased` and `absvalue`.
#### `defaults` #### `defaults`
Specify this if you would like to keep auto-selection of eased/not-eased while Specify this if you would like to keep auto-selection of eased/not-eased while
@ -1174,28 +1232,39 @@ specifying some other flags.
#### `eased` #### `eased`
Maps noise gradient values onto a quintic S-curve before performing Maps noise gradient values onto a quintic S-curve before performing
interpolation. This results in smooth, rolling noise. interpolation. This results in smooth, rolling noise.
Disable this (`noeased`) for sharp-looking noise. Disable this (`noeased`) for sharp-looking noise with a slightly gridded
appearence.
If no flags are specified (or defaults is), 2D noise is eased and 3D noise is If no flags are specified (or defaults is), 2D noise is eased and 3D noise is
not eased. not eased.
Easing a 3D noise significantly increases the noise calculation load, so use
with restraint.
#### `absvalue` #### `absvalue`
Accumulates the absolute value of each noise gradient result. The absolute value of each octave's noise variation is used when combining the
octaves. The final perlin noise variation is created as follows:
Noise parameters format example for 2D or 3D perlin noise or perlin noise maps: noise = offset + scale * (abs(octave1) +
abs(octave2) * persistence +
abs(octave3) * persistence ^ 2 +
abs(octave4) * persistence ^ 3 +
...)
###Format example
For 2D or 3D perlin noise or perlin noise maps:
np_terrain = { np_terrain = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=500, y=500, z=500}, spread = {x = 500, y = 500, z = 500},
seed = 571347, seed = 571347,
octaves = 5, octaves = 5,
persist = 0.63, persist = 0.63,
lacunarity = 2.0, lacunarity = 2.0,
flags = "defaults, absvalue" flags = "defaults, absvalue",
} }
^ A single noise parameter table can be used to get 2D or 3D noise,
when getting 2D noise spread.z is ignored.
For 2D noise the Z component of `spread` is still defined but is ignored.
A single noise parameter table can be used for 2D or 3D noise.
Ore types Ore types
--------- ---------
@ -1268,6 +1337,7 @@ The following is a decent set of parameters to work from:
seed = 5390, seed = 5390,
octaves = 4, octaves = 4,
persist = 0.5, persist = 0.5,
lacunarity = 2.0,
flags = "eased", flags = "eased",
}, },
noise_threshold = 1.6 noise_threshold = 1.6