Luminids terrain generation preview

Procedural terrain often looks impressive from a distance and disappointing up close. Flat plateaus. Random noise. Mountains that look sprayed on rather than shaped.

I didn’t want that for Luminids. This dev log is about the layered system I ended up with instead, which I’ve taken to calling, slightly grandly, the Luminids Terrain Formula.

The rules I started with

Before any layers, noise or maths, I had four rules:

  • Worlds need silhouette. Shapes on the horizon that pull your eye, not just changes in height.
  • Mountains should look pulled, not sprayed. Stretching, curving and gathering mass instead of popping up at random.
  • Terrain should make you curious. A ridge, a valley or a shelf should make you ask “what’s over there?”
  • Caves should be carved into the land. Respecting the shape above them instead of punching through it.

The rules came first. The maths came later.

Six layers, each built on the last

Over time the terrain system settled into a fixed sequence, where each step depends on the one before it.

Terrain formula in action

The layers

  • Gradient - the base height and overall shape of the world
  • Ridge3D - the main sculptor of mountains
  • Domain Warp - curved, organic landforms
  • Strata - vertical banding and geological character
  • Cave Noise - controlled subtraction
  • Shelf / Slope / Erosion Bias - places to explore and build
The Luminids Terrain Formula (formal view)
Surface first, then carve
1) Surface height
H(x, z) = G(x, z) + R(x, z) + W(x, z) + S(x, z) + B(x, z)
  • G is the base gradient that defines world scale and elevation flow
  • R is Ridge3D, the primary sculptor of mountains and large landmass
  • W is DomainWarp3D, bending forms into natural, curved structures
  • S is Strata, adding vertical banding and geological character
  • B is shelf, slope, and erosion bias, shaping coasts, rivers, and plateaus
2) Volumetric carve (SDF)
ϕ(x, y, z) = y − H(x, z) − kc · C(x, y, z)
  • ϕ is the terrain signed distance field
  • Terrain is solid where ϕ ≤ 0
  • C is CaveNoise3D, a three dimensional subtractive field
  • kc controls cave strength and influence
Single-line form
ϕ(x, y, z) = y − (G + R + W + S + B) − kc · C

It’s closer to sculpting than stacking noise: get the mass in first, then shape it, then carve.

What each layer does to the landscape

Gradient Sets the overall rise and fall of the world. Without it, everything turns local and noisy.

Ridge3D This is where the world gets its backbone. Mountains come out as long, connected forms instead of isolated bumps.

Domain Warp Nothing stays straight. Warping bends ridges and valleys into natural curves.

Strata Vertical banding, so the land looks built up over time rather than made of one uniform material.

Cave Noise Subtractive, depth-aware and restrained. Caves sit inside the terrain instead of chewing through it.

Shelf / Slope / Erosion Bias The places players actually use: paths, plateaus, ledges and buildable ground.

Each layer is simple on its own. The character comes from the order.

Why the order matters

  • Ridges come before caves, because caves should respect the mass above them.
  • Warp happens early, because it shapes everything downstream.
  • Strata comes after form, so it follows the shape instead of fighting it.
  • Caves subtract last, so they’re carved out of land that already has its final shape.

Swap the order round and you get exactly what I was trying to avoid: caves punched through mountains and banding that fights the land. Get it right and the terrain looks shaped on purpose.

What it means for players

In practice, the layers give you:

  • Natural paths and sightlines without hand-placed guidance
  • Biome transitions that blend gradually instead of looking tiled
  • Buildable shelves instead of random sheer cliffs
  • Caves that are worth finding, instead of holes everywhere

The point is that you can read the land without ever thinking about why.

Still changing

None of this is final. It keeps changing as the game does.

Having it written down has already changed how I work, though. Instead of asking “does this look okay?”, I now ask whether a change respects the formula.

Later note: in August 2026 the infinite world this was built for was replaced by a single island. More on that in Dev Log 18.

What’s next

With the terrain foundation in place, the focus now moves to:

  • deeper biome identity
  • more expressive erosion
  • tighter links between the shape of the world and how Luminids behave

Thanks for reading. More soon.

Nick