loading...
running...
How to use
What to try: press Drop base level and watch a knickpoint (waterfall) climb up the river. Harden the caprock and see the cliff stall; soften the shale and watch benches form. Use Mesa country for hoodoos. Change the slope exponent to n = 2 and the step smooths out. Move the cross-section slider to compare reaches. Hover or tap the terrain to probe the rock layer, its erodibility and the local slope.
Drag to orbit, wheel to zoom, right-drag to pan. First person: W A S D / arrows to walk, drag to look, Shift to run, E / Q to fly up / down, Esc to leave.
The science
The river sets the pace. Where bedrock is eroded by flowing water, the stream-power law says the bed lowers at a rate proportional to the power the water spends on it:
dz/dt = U - K A^m S^n
z bed elevation, A upstream drainage area, S = -dz/dx local bed slope, K erodibility of the rock the river is cutting into (it changes layer by layer), U rock uplift. Drainage area follows Hack's law, A = ka x^h with h = 1.67, measured from the divide.
Knickpoints. For n = 1 the equation is a pure advection equation: a step in the bed moves upstream at c = K A^m, x_k(t)^(1-hm) = x_0^(1-hm) - (1-hm) K k_a^m t The step does not smooth out; it travels intact and leaves a graded reach behind it. For n > 1 the step diffuses. The page solves the profile with an implicit upwind scheme (unconditionally stable) and checks it against this closed form.
Steady state. Setting dz/dt = 0 gives S = (U/K)^(1/n) A^(-m/n) a power-law profile with concavity theta = m/n. The page integrates a profile to steady state and regresses log S on log A to recover m/n.
Layers. Each layer has its own K, its own weathering rate and a critical slope. Hard caprock and cliff-forming limestone have low K and steep critical slopes (cliffs). Shales have high K and gentle slopes. When a soft layer under a hard one wears away faster, the hard layer is undermined and retreats in blocks: this is differential erosion, and where fractures isolate a block you get buttes and hoodoos.
Valley walls. The heightmap is evolved by exchanging material between neighbouring cells. For each pair the higher cell gives a flux made of three terms: weathering w s/s_c, linear diffusion D s/dx and, when the slope s exceeds the layer's critical slope sc, a slope-failure term proportional to the excess. Material reaching the channel is carried away by the river (the volume ledger is shown as a check).
Honest simplifications. The river is one channel with a fixed sinuous path; the layers are horizontal (a small regional tilt follows the plateau); there is no sediment-cover feedback, no lateral river migration, no overhangs (a heightmap cannot represent them) and no rockfall mechanics. K, w, D and critical slopes are plausible illustrative values for a dry plateau, not measurements of a real canyon; time is in model years and the time-lapse runs roughly a million years in ten seconds. The base-level drop is imposed instantly at the outlet; layer names are generic.
Live checks. (1) the numerical knickpoint position against the closed-form retreat integral, (2) the steady-state slope against (U/K)A^(-m), (3) the regressed concavity against m/n, (4) the live volume ledger: change of rock volume equals minus the exported sediment to 1e-6.
3D assets: Blender 5.2 props and baked PBR rock maps, Three.js r160.