I'm trying to implement some source code I found online to generate a height map using Perlin Noise. I've successfully managed to get the height map using the noise3 function, with the third coordinate being a random "seed", to allow for random height maps.
My problem is that the terrain generated is rather dull - I want mountains and I'm getting rolling grassland. I've done some reading up on Perlin Noise (mostly here). Due to the source code I've found obviously not written with readability in mind and my weak grasp on the concept of Perlin Noise in general, I can't figure out what I need to tweak in the code (amplitude and frequency?) to create more drastic terrain.
Some more info on generating height maps using Perlin Noise, Perlin Noise in general, or even some more decipherable code would also be welcome.
EDIT: I understand (kind of) how Perlin Noise works, e.g., with respect to amplitude and frequency, I'm just wondering what variables to change in the code I linked above, which are used for these two aspects.
A friend just linked me to this question, and I thought I'd try and clear up a couple things that aren't addressed in the accepted answer.
Elias' interesting and helpful article uses "value noise" not "Perlin noise". Value noise involves curve-fitting of randomized points. Gradient noise (of which Perlin noise is a primary example) creates a lattice of 0-value points and gives each one a random gradient. They are frequently confused with one another!
http://en.wikipedia.org/wiki/Gradient_noise
Secondly, using a 3rd value as a seed is expensive. If you want random terrain, consider translating your origin a random amount instead. 3D calls are going to be more expensive than 2D calls. And all you are doing is using the z value to select a particular slice of 2D noise.
Thirdly, the straight function call is going to return values that are fairly smooth and rolling overall, not as craggy as real terrain, since it's randomness is limited to a single frequency. To get craggier terrain, a good technique is to sum together multiple calls that progress through the noise space at differing frequencies, usually set a "fractal" values.
Thus, for example, sum together
noise(x, y) + (1/2)(noise(x*2, y*2) + (1/4)(noise(x*4, y*4)
...The resulting sum will probably often be outside the range -1 to 1, so you will have to normalize the result before the values are useful. I'd like to suggest setting up the factor series (1, 1/2, 1/4, etc.) so that you are guaranteed to remain within [-1, 1] which can be done by progressive weighting depending upon how many 'octaves' you use. (But I don't know if this is truly the most efficient way to do this.)
Example with four octaves:
(1/15)(noise(x, y) + (2/15)(noise(2x, 2y) + (4/15)(noise(4x, 4y) + (8/15)(noise(8x, 8y)
Then, use the "turbulent noise" normalization of taking the sum and making it
= |sum|
(i.e., using the abs function). This will give the terrain definite angular valley ridges as opposed to being smoothly rolling.I'm working on a SimplexNoise visualizer, hope to open source it on GitHub eventually, as a Java project. A first draft of the visualizer can be found and run via this post at java-gaming.org: http://www.java-gaming.org/topics/simplex-noise-experiments-towards-procedural-generation/27163/view.html The emphasis on the first draft is more tutorial, with generated code examples (but they are in Java).
Great article on how SimplexNoise works (and Perlin vs Gradient background): http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
Stefan Gustavson did a really nice job of this!
Here's an example of surface generation I wrote a while ago in JavaScript using 3D Perlin Noise. Since in a surface voxels are either present or not I simply apply a threshold after calculating the Perlin Noise cube. In the example the noise probability is equal for all dimensions. You can get a more realistic landscape when you increase the random values towards the ground and reduce it towards the sky.
http://kirox.de/test/Surface.html
WebGL must be enabled. At the time of writing this I recommend to use Chrome for best performance.
Amplitude controls how high/low the terrain is, the frequency how flowing it is, with lower frequency being more flowing.
So if you want a jagged mountainous landscape you need to up both.
Perlin noise is completely controlled by the different variables you set, i.e. amplitude, frequency and persistance. The amount of octaves has a little change, but not much. In code that I have written in the past I have just played around with the order of magnitude of the frequency and persistance until I have gotten what I needed. I can try to find my old source if needed.
PerlinNoise.h
PerlinNoise.cpp