Method / Generative Assets · Wave VII — Chance
How Brownian was made
A GPU field of 65,536 pollen motes, each kicked by independent Gaussian noise every frame. One mote is traced in gold; a side plot measures the crowd's mean-square displacement rising in a straight line — the moment randomness turns into the law that weighed the atom.
Robert Brown's 1827 puzzle — pollen that jitters in still water for no visible reason — is the seed of the atomic theory. Einstein's 1905 paper showed the jitter is water molecules bombarding the grain at random, and that the grain's mean-square displacement must grow linearly with time, ⟨r²⟩ ∝ t. The site's single job is to let a viewer see both halves at once: the incomprehensible chaos of one grain, and the ruler-straight law hiding in the average. The audience is anyone who likes the idea that panic, repeated enough, becomes physics.
Argued from the subject: dark water, pale motes, one gold thread. The mote colour is a line/mark token; body copy uses a dedicated high-contrast ink so nothing small ever sits on the bright accent.
- Sora
Display and body. A geometric sans with an even, technical texture — light weights at large sizes give the headline a clean, instrument-panel calm that suits a physics demo.
- Space Mono
All readouts, labels and figures. The fixed-width digits make the ⟨r²⟩ counter and step tally read as live measurement, not decoration — the typographic conceit that the page is an instrument.
- GPGPU sim
three.js
GPUComputationRendererping-pongs a 256×256 float texture — 65,536 mote positions — through a Langevin step shader. Each texel draws two Gaussian kicks (Box–Muller from hashed noise) per frame and wraps toroidally, so the field stays uniformly dense and shimmering with no CPU cost. - Render
A
Pointscloud whose vertex shader samples the computed position texture; additive blending on dark water gives the storm its glow. Orthographic camera sized to the viewport aspect. - Traced walk
One reflecting-boundary walker recorded into a 1,500-point ring buffer, drawn as a vertex-coloured
Linethat fades from deep to bright gold, with a soft head dot at the live position — the signature tangle. - MSD plot
A canvas-2D ensemble of 520 free walkers computes ⟨r²⟩ each step and plots it against the analytic line ⟨r²⟩ = 2·s²·n. Single walks are noise; the average is dead straight — the whole point, made measurable.
Hardening throughout: DPR capped at 2, sized to the container, resize-debounced, rAF paused on document.hidden with a clamped delta on resume, a WebGL context-loss fallback (static gradient + a still MSD plot), and a reduced-motion path that primes one settled frame and never starts the loop.
Pass 1 — Craft
Found: the storm read as flat static; motes were uniform size and opacity, so the field had no depth. The MSD plot's theoretical line and measured line were the same weight, so you couldn't tell which was the law and which the measurement. Hero lede wrapped to six lines on desktop.
Changed: gave each mote a per-instance size/alpha from a hashed random for a granular shimmer; made the analytic line a thin dashed pale-blue and the measured MSD a solid gold with a head dot so the story is legible at a glance; tightened the lede to 34ch and re-set the type scale.
Pass 2 — Depth
Found: the traced walk was a single flat gold colour — no sense of time in the tangle. The plot reset was an abrupt jump. No second-read reward.
Changed: added a per-vertex fade along the trail (old strokes dim, recent strokes bright) so the eye can read the walk's direction; let the MSD loop refill smoothly from zero so it visibly re-derives the same straight line every cycle — the second-read detail is realising the line is inevitable, not lucky; added the live head dot pulsing at the walk's tip.
Pass 3 — Hardening
Found: at 375px the instrument card crowded the hero and the two nav links plus wordmark were tight; DPR wasn't clamped on the head-dot sprite; reduced-motion still spun up the loop briefly.
Changed: single-column hero under 860px with the card capped at 440px, hid the "Method" nav link under 480px (it survives in the footer), clamped every pixel-size uniform to DPR≤2, and gated the animation start behind the reduced-motion check so it renders exactly one primed frame. Removed one ornament — a decorative corner tick on the card — per the Chanel rule.