Random scatter is the enemy of believable environments. Drop 10,000 trees randomly across a landscape and you'll get a surface that looks like someone sneezed a forest onto a heightmap. Real environments don't work this way. Nature follows rules — and your procedural placement should too.
This post covers the theory behind why some procedural environments look natural while others look artificial, and how to apply those principles in practice using rule-based scatter systems.
Why Random Placement Looks Wrong
The human eye is remarkably good at detecting artificial patterns — or the absence of natural ones. When you place vegetation randomly:
- Trees grow on impossible slopes. Real trees don't root on 70° cliff faces. Your brain knows this even if you can't articulate it.
- Density is uniform. Real forests are patchy — dense in some areas, sparse in others, following soil quality, water access, and sunlight.
- Species don't mix realistically. Cacti next to ferns, marsh reeds on hilltops. Random scatter ignores ecological rules.
- There's no clustering. Real plants spread from seed sources. You get clusters and gradients, not uniform distributions.
- Ground cover ignores canopy. Dense tree canopy blocks sunlight. Ground-level plants are sparse under thick forest and dense in clearings.
These aren't subtle issues. Players may not know why an environment feels "off," but they feel it. The uncanny valley isn't just for faces — it applies to landscapes too.
The Rules Real Ecosystems Follow
Before implementing rules in a game engine, it helps to understand the patterns they're based on.
Altitude Zonation
Mountain ecosystems organize by altitude. You see this everywhere in the real world:
- Valley floor (0–300m) — deciduous forest, rich undergrowth
- Lower slopes (300–800m) — mixed forest, transitioning species
- Upper slopes (800–1500m) — coniferous forest, sparse undergrowth
- Alpine zone (1500–2500m) — shrubs, grasses, hardy wildflowers
- Nival zone (2500m+) — bare rock, lichens, snow
Your procedural system should respect altitude bands. A pine tree above the treeline breaks immersion.
Slope Influence
Slope affects water retention, soil stability, and sunlight angle:
- Flat ground (0–10°) — supports all vegetation, water pools here
- Gentle slopes (10–30°) — good for most trees and ground cover
- Moderate slopes (30–50°) — only sturdy species, exposed rock appears
- Steep slopes (50–70°) — mostly bare rock, occasional hardy shrubs
- Cliffs (70°+) — bare stone, possibly moss or lichens
Moisture Gradients
Water flows downhill and collects in valleys:
- River banks and lake edges — reeds, willows, lush ground cover
- Valley floors — dense, tall vegetation
- Hilltops — sparser, wind-exposed species
- South-facing slopes (northern hemisphere) — drier, sun-exposed
- North-facing slopes — wetter, shadowed, different species mix
Clustering and Seed Spread
Trees don't distribute uniformly. They grow from seeds that fall near the parent tree. This creates:
- Dense clusters around parent trees
- Gradual density falloff from cluster centers
- Clear boundaries where clusters meet
- Empty patches where conditions don't support growth
Implementing Rules in Practice
The Procedural Placement Tool is designed around these ecological principles. Here's how to translate the theory into actual biome configuration.
Layer Architecture
Each actor type gets its own placement layer. For a temperate forest biome, you might have:
- Layer 1: Large conifers — tall pines and spruces, spaced 8–15m apart, slopes below 35°, altitude 200–1200m
- Layer 2: Deciduous trees — oaks and birches, spaced 6–12m apart, slopes below 30°, altitude 0–800m
- Layer 3: Undergrowth — ferns, small bushes, clustered, slopes below 40°, density reduced under tree canopy
- Layer 4: Ground cover — grass, moss, wildflowers, high density, slopes below 50°
- Layer 5: Rocks — boulders and stone, concentrated on steeper slopes, all altitudes
- Layer 6: Deadwood — fallen logs, stumps, scattered sparsely, flat areas
Each layer has independent rules for slope, altitude, density, spacing, and clustering. The tool evaluates all rules per-instance and only places actors where every condition is met.
Biome Blending
Where two biomes meet, you need a transition zone — not a hard edge. The biome zone system handles this with configurable blend widths.
A forest-to-desert transition might span 50–100m. Within the blend zone:
- Forest species density decreases linearly
- Desert species density increases linearly
- Transition species (scrub brush, dry grass) peak in the middle
The result is a gradual shift that mirrors how real biome boundaries work.
Exclusion Zones
Not every rule adds things — some prevent them. Exclusion zones remove vegetation from areas where it shouldn't exist:
- Within 3m of roads and paths
- Within 5m of buildings and structures
- Inside bodies of water
- On gameplay-critical sight lines
- Within designated combat areas (for readability)
Exclusion zones override placement rules. This ensures your carefully placed environments don't block gameplay.
Density: The Most Important Parameter
If you get only one thing right, get density right. Too sparse and the environment feels barren. Too dense and it feels claustrophobic (and tanks performance).
Real-world reference densities for temperate forest:
- Large trees — 100–400 per hectare (1 per 25–100m²)
- Small trees and saplings — 500–2000 per hectare
- Shrubs — 1000–5000 per hectare
- Ground cover — effectively continuous
In games, you'll typically use lower densities than reality for performance and gameplay reasons. A good starting point:
- Large trees — 1 per 50m² (half real density)
- Medium vegetation — 5 per 50m²
- Ground cover — 15–25 per 50m²
- Rocks and deadwood — 1–2 per 100m²
Profile early and adjust. It's easier to reduce density from a good-looking scene than to increase it from a sparse one.
Case Study: Four-Biome Landscape
We built a test landscape with four biomes to validate these rules. Here's what we configured:
Dense Forest
- 6 tree species, mixed conifer and deciduous
- Heavy undergrowth with ferns and bushes
- Moss ground cover under tree canopy
- Deadwood scattered at low density
- Altitude: 100–600m, slopes below 35°
Alpine Meadow
- No large trees (above treeline)
- Low shrubs and hardy grasses
- Wildflower clusters with color variation
- Exposed boulders on steeper areas
- Altitude: 600–1200m, slopes below 40°
Rocky Ridge
- Bare stone dominant
- Sparse, stunted vegetation in sheltered spots
- Lichen textures on north-facing rock
- No ground cover above 50° slope
- Altitude: 800–1500m, all slopes
Wetland
- Reeds and marsh grass near water
- Willows and alders on wet ground
- Dense low vegetation
- Standing water puddles
- Altitude: 0–150m, slopes below 10°
Each biome took about 15 minutes to configure. The full landscape with all four biomes and blend zones generated in under 2 seconds. The result looked hand-crafted because it followed the same rules that real landscapes follow.
Common Mistakes
Too many species per biome. Real biomes have dominant species with a few secondary ones. Using 15 different tree types in one biome looks artificial. Start with 2–3 dominant species and add 1–2 accent species.
Ignoring scale variation. Trees in nature aren't all the same height. Add 15–20% random scale variation to large vegetation. It makes a dramatic difference in realism.
Forgetting rotation randomization. All trees facing the same direction looks wrong. Full 360° random Y-axis rotation is the minimum. Add slight X/Z tilt (2–5°) for natural lean.
Uniform ground cover. Break up ground cover with density variation — patches of moss, clusters of wildflowers, bare soil between. Uniform green carpeting looks fake.
Start With Reality
The best procedural environments start with reference. Before configuring biomes, look at photographs or satellite imagery of the real ecosystem you're modeling. Count the species. Note the density. Observe the slope limits. Measure the clustering.
Then translate those observations into placement rules. The Procedural Placement Tool gives you the parameters — altitude ranges, slope constraints, density settings, cluster grouping, exclusion zones. The ecological knowledge is what makes those parameters produce believable results.
Check out the documentation for setup guides and the 10 themed presets that implement these principles out of the box.