A moving source emits circular wavefronts that expand at a fixed wave speed. That's the whole machine — and Speed decides everything you see.
I · Sound. The source accelerates toward Mach 1. Wavefronts pile up in front of it (Doppler compression) and stretch out behind. At Mach 1 the pile-up becomes the sound barrier; past it, the rings form a Mach cone — nobody modeled the cone, it appears on its own as the envelope of the circles (sin μ = 1/M).
II · Light. Same machine, wave speed = c. The source goes 0.9 c, 0.99 c … 0.9999999 c. However hard it pushes, it never gets out: the wall in front just gets thinner, the colors blueshift ahead and redshift behind, the source flattens by length contraction — and in the final top view every wavefront it ever emitted touches it at a single point. Still 30 m/s short.
You can outrun your own sound. You can never outrun your own light.
How it was made (procedural / programmatic): the entire film is one Blender Python (bpy) script run headless in Blender 5.2.2 — no hand-placed objects, no imported assets.
- Geometry Nodes wavefronts: each emission event is a point (attributes: emission frame, speed). A node tree instances a 512-segment circle on every point with radius = wave speed × (scene frame − emission frame), converts it to a tube of constant thickness, and computes per-vertex Doppler shift from the ring's direction cosine: sound
1/|1 − M cos θ|, light1/(γ(1 − β cos θ)). The material maps log₂ of that ratio to color and brightness, so the shock edge glows white exactly where the math diverges (cos θ = 1/M). - Motion from physics curves: Mach number and "number of nines" (β = 1 − 10⁻ⁿ) are F-curves; the script integrates them to get the source position for every frame, and emission points sit exactly on that path.
- Everything else in code: two cameras with smoothed tracking and a seeded, decaying shake at the barrier; length contraction 1/γ on the source (clamped at 8% so it stays visible); a camera-attached vignette; HUD text updated per frame from the same curves (m/s, Mach, c); exposure fades; compositor bloom; Cycles with true motion blur.
- Constant mesh topology (unemitted rings are parked below the floor) keeps Cycles deformation motion blur valid on every frame.
Simplifications, stated honestly: rings are emitted at a fixed lab-frame rate (time dilation is applied to color, not to emission rate), and the contraction is clamped for visibility.
AI and third-party asset disclosure
AI disclosure: The Blender Python generator script (scene construction, Geometry Nodes setup, animation, cameras, render settings) was written with the help of Claude (Anthropic), an AI coding assistant, under my direction; I chose the concept, reviewed the renders and directed the revisions. All visuals were rendered in Blender 5.2.2 (Cycles) from that script — no AI image or video generation was used for any frame. Music: an original instrumental cue generated with ElevenLabs Music (AI music model) on my paid ElevenLabs plan, which grants commercial use; trimmed and loudness-normalized by me. No sound effects. Font: Bahnschrift (Microsoft, bundled with Windows) for on-screen text. No other third-party assets.
Log in or sign up for Devpost to join the conversation.