How to Generate Realistic Random Terrain in Python Using Perlin Noise

Generating realistic terrain is a common requirement in games and simulations. One popular method for achieving this is Perlin noise, which creates smooth, natural-looking patterns. In this article, we’ll walk through how to generate and visualize terrain using Perlin noise in Python with the help of the noise and matplotlib libraries. 1. Installing Required Packages First, install the dependencies: pip install noise matplotlib 2. Generating Perlin Noise We’ll use the noise module to generate 2D Perlin noise over a grid and scale the values to represent terrain heights. import numpy as np from noise import pnoise2 import matplotlib.pyplot as plt width = 200 height = 200 scale = 100.0 octaves = 6 persistence = 0.5 lacunarity = 2.0 terrain = np.zeros((height, width)) for i in range(height): for j in range(width): terrain[i][j] = pnoise2(i / scale, j / scale, octaves=octaves, persistence=persistence, lacunarity=lacunarity, repeatx=width, repeaty=height, base=42) 3. Visualizing the Terrain We’ll use matplotlib to show the terrain as a grayscale heightmap and a colored elevation map. # Normalize terrain values to 0–1 normalized_terrain = (terrain - terrain.min()) / (terrain.max() - terrain.min()) # Grayscale heightmap plt.imshow(normalized_terrain, cmap='gray') plt.title("Grayscale Heightmap") plt.colorbar() plt.show() # Colored elevation map plt.imshow(normalized_terrain, cmap='terrain') plt.title("Colored Terrain Elevation") plt.colorbar() plt.show() 4. Tweaking for Realism Adjusting octaves, persistence, and lacunarity lets you control the roughness and features of the terrain. You can also simulate biomes by applying thresholds to different ranges of elevation (e.g., snow on high elevations, grass on mid, water on low). 5. Saving the Terrain You can export the terrain as an image or save it to a file for use in a game or simulation: plt.imsave("generated_terrain.png", normalized_terrain, cmap='terrain') Conclusion Perlin noise is a versatile tool for generating natural-looking procedural terrain. With Python and a few simple libraries, you can create detailed environments ready to be used in simulations or games. This technique can be extended to 3D terrain and dynamic map generation with elevation and biome mapping. If you found this useful, consider supporting my work: buymeacoffee.com/hexshift

Apr 20, 2025 - 04:59
 0
How to Generate Realistic Random Terrain in Python Using Perlin Noise

Generating realistic terrain is a common requirement in games and simulations. One popular method for achieving this is Perlin noise, which creates smooth, natural-looking patterns. In this article, we’ll walk through how to generate and visualize terrain using Perlin noise in Python with the help of the noise and matplotlib libraries.

1. Installing Required Packages

First, install the dependencies:

pip install noise matplotlib

2. Generating Perlin Noise

We’ll use the noise module to generate 2D Perlin noise over a grid and scale the values to represent terrain heights.

import numpy as np
from noise import pnoise2
import matplotlib.pyplot as plt

width = 200
height = 200
scale = 100.0
octaves = 6
persistence = 0.5
lacunarity = 2.0

terrain = np.zeros((height, width))

for i in range(height):
    for j in range(width):
        terrain[i][j] = pnoise2(i / scale,
                                j / scale,
                                octaves=octaves,
                                persistence=persistence,
                                lacunarity=lacunarity,
                                repeatx=width,
                                repeaty=height,
                                base=42)

3. Visualizing the Terrain

We’ll use matplotlib to show the terrain as a grayscale heightmap and a colored elevation map.

# Normalize terrain values to 0–1
normalized_terrain = (terrain - terrain.min()) / (terrain.max() - terrain.min())

# Grayscale heightmap
plt.imshow(normalized_terrain, cmap='gray')
plt.title("Grayscale Heightmap")
plt.colorbar()
plt.show()

# Colored elevation map
plt.imshow(normalized_terrain, cmap='terrain')
plt.title("Colored Terrain Elevation")
plt.colorbar()
plt.show()

4. Tweaking for Realism

Adjusting octaves, persistence, and lacunarity lets you control the roughness and features of the terrain. You can also simulate biomes by applying thresholds to different ranges of elevation (e.g., snow on high elevations, grass on mid, water on low).

5. Saving the Terrain

You can export the terrain as an image or save it to a file for use in a game or simulation:

plt.imsave("generated_terrain.png", normalized_terrain, cmap='terrain')

Conclusion

Perlin noise is a versatile tool for generating natural-looking procedural terrain. With Python and a few simple libraries, you can create detailed environments ready to be used in simulations or games. This technique can be extended to 3D terrain and dynamic map generation with elevation and biome mapping.

If you found this useful, consider supporting my work: buymeacoffee.com/hexshift