One million orbs on a Fibonacci sphere, plus two satellite moons in their own color stories.Two hundred thousand orbs on a Fibonacci sphere, plus two satellite moons — a phone-tuned slim of the full million-orb desktop build.
The main halo is a thin shell of orbs at radius 11–12m, packed using
z = 1 − 2(i+0.5)/N, r = √(1−z²),
θ = i × 137.5° — the same packing principle as a sunflower's
seed disk, wrapped onto a 2-sphere so adjacent orbs visually touch and the
surface reads as a single skin.
Two companion spheres orbit alongside: a 380,000-orb
warm moon (orchid, coral, gold, amethyst — the dusk end of
the palette) at 5m radius upper-right, and a
150,000-orb cool moon
(aurora mint, glacier, periwinkle — the aurora end) at 2.5m radius
lower-left. Each rotates on its own axis at its own rate so they
read as independent satellite worlds rather than one blob. 1,530,000 orbs total
on this build — the desktop tier runs a full 1.53M, phones get a slimmed
~307K so the GPU sustains 60fps through dense music and rapid clicks.
Color is zoned by sampling 3D value-noise at each orb's position, with a
per-seed palette weighting that favors 1–2 dominant hues per visit. The
whole main halo rotates as a coherent body at 0.05 rad/s — no per-orb
chaos.
Each orb is per-pixel lit on a billboard quad with a wide fresnel band
(pow(1−n.z, 2.4)) carrying a chromatic environment
reflection across most of its surface — a continuous aurora shimmer
rolls across the surface keyed on world position, and the silhouette
glows a rainbow halo. Reads as a million polished reflective marbles.
- main halo
- 1,000,000 orbs · 11–12m
- warm moon
- 380,000 orbs · 5m
- cool moon
- 150,000 orbs · 2.5m
- packing
- Fibonacci sphere · golden angle 137.5°
- main rotation
- 0.05 rad/s
- current tier
- desktop
Click any sphere. Up to twenty-four waves can ring at once, with per-band envelopes when music is driving them.
The click ray casts against the central halo's projection sphere AND
both moon spheres — whichever is hit closest to the camera wins, so the
wave originates on the surface you actually clicked. If the ray misses
everything, it snaps to the nearest point on the central shell so no
click is dropped.
Click position + time + envelope-duration write into a circular buffer
of 24 uniform slots.
The vertex shader iterates every active slot and sums their
contributions per orb. Three components fire
from each slot: an instant epicenter flash that fades over 0.6s,
a propagating Gaussian band at 4 m/s, and a persistent tail
behind the wavefront. Because positions live in world space, a wave on
one sphere can ripple onto a neighbour a few seconds later.
The propagating band is a signed cosine modulated by a Gaussian
envelope — each wave has crests AND troughs in space, exactly
like a real water ripple. All 24 active waves' signed displacements
sum into a single value per orb, so where two wavefronts cross in
phase they constructively brighten and bulge orbs outward, and where
they cross out-of-phase they cancel. This is genuine
linear superposition — the actual physics of small-amplitude
ripples on a pond. Capped at 1.3× single-wave amplitude so dense
music never visually overwhelms.
When you toggle the ♬ react button, a 1024-point Web Audio FFT
splits the room into bass / mid / treble,
each driving a different sphere with its own envelope length:
bass kicks resonate the main halo for 3.5s, snares
ripple the warm moon for 2.0s, hi-hats tick the cool
moon for 1.2s. Fast hat ticks die fast and free their
slot, so the buffer never starves.
The dominant wave's distance from each orb drives an iridescent rainbow
tint. Each click also fires a struck-glass FM bell synthesized in
Tone.js — pitched into a major-pentatonic anchored on today's seeded
fundamental, panned by world-X.
- simultaneous waves
- up to 24
- wavefront speed
- 4 m/s
- envelope (per band)
- bass 3.5s · mid 2.0s · treble 1.2s
- cooldown
- 0.18s (manual) / 0.13–0.16s (reactor)
- clickable surfaces
- main halo + both moons
- physics
- linear superposition · interference visible
A 140m skydome wraps the whole scene with procedural pastel rainbow — and the music breathes through the bloom and grain.
The environment is an inverted SphereGeometry rendered BackSide. Its
fragment shader samples view direction in spherical coords (yaw, pitch),
generates two rainbow gradients keyed on each, then blends them via
three-octave 3D value-noise so the colors flow organically rather than as
a flat wash. Slow drift on time, soft pastel shift toward white, pole fade.
In front of the dome, 6,000 starfield points sit in a 22–38m spherical shell
with per-star tints sampled across the same Aurora Dusk palette as the
orbs, cool-leaning (glacier 26% / periwinkle 20% / mint 16% / amethyst 13% /
orchid 9% / coral 7% / gold 5% / cool-white 4%). Per-star twinkle keyed
on phase + time.
Everything ships through an EffectComposer pipeline:
UnrealBloomPass at threshold 1.4 (only the brightest pixels
glow), a custom film-grain shader pass with a soft lavender vignette,
and an OutputPass to write the final tone-mapped image.
When the music reactor is active, overall energy swells the bloom
strength + radius, and treble breathes the grain density — so the whole
atmosphere subtly throbs with whatever's playing in the room.
- skydome radius
- 140m
- star count
- 6,000
- bloom threshold
- 1.4
- bloom swell (reactor)
- 0.18 → ~0.56 on energy peaks
- tone mapping
- ACES Filmic
Today's date is the only input. Tomorrow the world reshuffles.
The seed string — is hashed via FNV-1a into a
32-bit integer, which feeds a mulberry32 RNG. From that single seed comes
everything that varies between visits: palette weights, color zone noise
offsets on the sphere, spiral direction (clockwise or counter), initial
spiral phase, shell radius (11.0–12.0m), and the audio fundamental — one
of five low tones from A1 to E2.
That fundamental anchors a struck-glass FM bell pitched into a
major-pentatonic scale and panned by the world-X of each
click. Different day, different key, different continents of color
— the exact composition you see right now will not appear together
again.
Tap the 🎨 shuffle button to rotate the entire world's
color wheel by a random amount — preview what tomorrow (or any
other day) might feel like without losing today's palette structure.
The hash, the spiral phase, the noise-zoned color regions, the
patterns and physics all stay identical; only the hue rotates.
Implemented as a Rodrigues rotation around the (1,1,1) axis applied
inside the orb, skydome, and starfield shaders in lockstep.
- hash
- FNV-1a → mulberry32
- palette pool
- Aurora Dusk · 7 hues, weighted
- fundamental pool
- A1, B♭1, C2, D2, E2
- scale
- major-pentatonic FM bell
- shuffle
- Rodrigues rotation around (1,1,1) axis
- today's seed
- —