Files
settled-reach/docs/design/planetary-terrain-generation.md
T
jpmschweitzerandClaude Opus 4.6 ce0ea1cd83 data(atlas): hop-3 batch 1 — 7 systems + corporations + terrain design
Systems: Travessia/Euripos+Ostia (commercial translation),
Kensho/Enso+Mokurai (research consortium), Okafor/Onitsha+Timbuktu
Orbital Exchange (Nigerian trading hub), Lu Ban/Gongshu+Humen (Chinese
bazaar manufacturing), Arbour (garden world, the real capital),
Tanegashima/Kanashiro+Tsurumi (Japanese guild fabrication),
Yongjin/Shin Incheon+Cheongmun (Korean transit gateway),
Wolf 359 (12 named platforms + Lalo Watch, 15 stations total).

New: corporations table + 20 records (13 from wiki + DSMC + 7 Cygni B
combines). Planetary terrain generation design doc (tectonic-first
tile pipeline, PerfectWorld/PlaTec research). Atlas CLI planet count
defaults fixed (6-8 minimum).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 11:41:21 +01:00

6.4 KiB

Planetary Terrain Generation — Design Reference

Status: Research complete, spike proposed Date: 2026-03-25 Source: Tyre feasibility assessment + PO direction

Approach

Tile-first generation using tectonic simulation. The pipeline outputs a tile grid with terrain type per cell, not a heightmap that needs post-processing. The heightmap is an intermediate artifact inside the simulation; the deliverable is classified terrain tiles at the resolution the game consumes.

This follows the PerfectWorld (Civ 4) philosophy: each cell IS a game tile with a terrain type, produced by geological process rather than noise functions.

Pipeline Architecture

Input:  PlanetProfile (from wiki/LocationProfile)
        → planet_type, tectonic_activity, atmosphere, age, gravity, water_coverage

Stage 1: Base terrain (tectonic simulation)
        → IF tectonic_activity > 0: run PlaTec simulation
           Parameters: plate_count (3-30), simulation_steps (50-500),
                      sea_level, folding_ratio, erosion_period
        → IF dead/cratered: Poisson-disk crater field + fractal base
        → IF volcanic: hotspot placement + shield volcano profiles

Stage 2: Erosion passes (parameterized by planet type)
        → Hydraulic erosion (rain worlds, Earth-like)
        → Thermal erosion (all rocky bodies)
        → Glacial erosion (cold worlds, optional)
        → Aeolian erosion (thin atmosphere + wind, optional)
        → Passes = f(planet_age, atmosphere_density)

Stage 3: Climate / biome (habitable worlds only)
        → Geostrophic wind model (latitude bands + Coriolis)
        → Moisture transport from bodies of water
        → Temperature from latitude + altitude + stellar distance
        → Biome classification (Holdridge or simplified Koppen)

Stage 4: Hydrology (worlds with liquid water)
        → Flow accumulation from elevation grid
        → River network extraction
        → Lake filling at local minima
        → Coastline extraction from sea_level threshold

Stage 5: Tile classification
        → Each cell gets a terrain type: ocean, coast, shelf, plains, hills,
          mountains, desert, tundra, forest, jungle, ice, volcanic, crater, etc.
        → This IS the output — a tile grid the game reads directly

Stage 6: Export
        → tiles.json or tiles.bin (terrain type per cell, game-consumable)
        → heightmap.png (16-bit grayscale, for world map viewer)
        → rivers.png (binary overlay)
        → coastlines.png (binary overlay)
        → biome_zones.json (polygon regions + biome type)
        → settlements.json (candidate settlement points)

Planet Type Profiles

Tectonic worlds (atmosphere, liquid water possible)

Planet Type Plates Activity Erosion Mix Result
Earth-like 8-15 High Hydraulic + thermal Continents, mountain chains, river basins
Young volcanic 3-6 Very high, short sim Minimal erosion Sharp rifts, volcanic plains, calderas
Ice world 5-10 Moderate Glacial dominant U-valleys, fjords, ice caps, tundra
Desert/wind 5-10 Low Aeolian dominant Eroded plateaus, sand seas, mesas
Ocean world 5-10 High Hydraulic + volcanic Archipelagos, mid-ocean ridges, island chains
Tidally locked 5-10 Moderate Hydraulic on day side Twilight habitable band, ice cap dark side, scorched light side

Non-tectonic bodies (no/thin atmosphere, no liquid surface water)

Body Type Generation Method Tile Types Examples
Cratered lunar Poisson-disk impact craters + fractal base elevation, crater size distribution follows power law, regolith plains between craters crater_floor, crater_rim, crater_wall, regolith_plain, highland, basin Luna, Callisto, Ganymede, most moons
Volcanic dead Lava flow simulation from vent points, shield volcano height profiles, collapsed caldera basins, mare (flood basalt plains) mare_plain, shield_slope, caldera_floor, caldera_rim, lava_channel, highland Mercury-analog, dead volcanic moons
Active volcanic Tidal heating driven, continuous resurfacing, minimal cratering, sulfur/silicate deposits lava_field, active_vent, sulfur_deposit, cooling_crust, plume_deposit Io-analog
Aeolian sculpted Prevailing wind direction + erosion passes on fractal base, dune field formation, yardang carving, ventifact plains dune_field, yardang_ridge, ventifact_plain, dust_basin, mesa, canyon Mars-analog, thin-atmosphere worlds
Ice shell Fractal base with crack propagation (tidal stress), cryovolcanic vent placement, tiger stripe lineae, smooth refrozen plains ice_plain, crack_ridge, cryovent, refrozen_smooth, chaotic_terrain, crater (sparse) Europa, Enceladus-analog
Barren rock Minimal processing — fractal base + sparse cratering + thermal erosion only, no atmosphere effects rock_plain, ridge, crater, scarp, dust_plain Airless small bodies, dead worlds

Gas giants and belts (no surface tiles)

Gas giants and asteroid belts do not generate terrain tiles. They exist as orbital entries in the atlas with atmospheric/compositional metadata only.

Key Libraries

Performance

  • PlaTec at 1024x512: ~2-10 seconds per planet
  • Erosion passes: ~5-30 seconds
  • Climate + hydrology: <2 seconds
  • Total per planet: ~10-45 seconds
  • 1000 planets: 3-12 hours (offline batch)

Proposed Spike

Stand up pyplatec, generate 5 tile grids with different planet profiles (Earth-like, volcanic, dead, ice, desert), render as preview images, evaluate geological variety. Half a day.

References

  • PerfectWorld 1+2 (CivFanatics, Python) — midpoint displacement + plate boundary elevation
  • PerfectWorld 3 (Civ5, Lua) — layered Perlin, dropped tectonics, kept climate
  • PlaTec thesis: Lauri Viitanen "Physically Based Terrain Generation" (2012)
  • SimpleTectonics: clustered convection approach (weigert/SimpleTectonics)
  • World Orogen (orogen.studio) — browser-based, strong algorithm design
  • Nixis (MightyBOBcnc/nixis) — spherical planet generation