What it is

A 28 second film about speed. Every tracked piece of space debris and every spent rocket stage is put on its real orbit around Earth. Then qualifying heats raise the speed limit and knock out the slow ones, until five remain. The five race 100 m against the ISS and world record pace.

Everything is made in Blender 5.2 by Python. One script builds the whole film from an empty scene. There is no modelling, no sculpting and no hand keyframing. The globe, the 12,379 objects, the track, the rocket stages, the ISS, the sprinter, the text and the sound are all generated. The orbits come from real data, the public satellite catalogue (US Space Force, published by CelesTrak).

Why

My previous attempt for this contest was a bullet seen from five reference frames. It was good looking, but boring and confusing. So I made a more fun one, and reused as much as I could from it (globe, HUD, materials, render pipeline).

How I interpreted Speed

In a circular orbit speed depends only on altitude. Everything in low orbit, the ISS included, goes 7.3 to 7.9 km/s. So if you race low orbit junk, it is a tie and nobody cares.

The fast ones come from elsewhere. Upper stages left on geostationary transfer orbits fly long ellipses, from a few hundred km up to 40,000 km and more. At the bottom of the ellipse (perigee) they go about 10.4 km/s. In the film this shows up in the qualifying: when the limit goes over the ISS speed, the whole cloud around Earth disappears, and what is left is a few hundred thin ellipses that were hidden in the noise.

Speed for each object is the perigee speed, two-body:

$$ v_p = \sqrt{\mu \left( \frac{2}{r_p} - \frac{1}{a} \right)}, \quad \mu = 398600.4418 \ \text{km}^3/\text{s}^2 $$

The heats, from the data:

  • Heat 1, v > 7.00 km/s: geostationary and navigation orbits are out. 11,635 remain.
  • Heat 2, v > 7.66 km/s, which is the ISS speed: most of low orbit is out. 2,069 remain.
  • Heat 3, v > 10.00 km/s: the rest of low orbit is out. 270 remain, all upper stages on transfer ellipses.
  • Final: the five fastest. Four Falcon 9 second stages and one Delta 4 stage.

The winner is a Falcon 9 second stage launched in January 2021 (2021-001B, the Turksat 5A launch), perigee 170 km, apogee 47,173 km, 10.42 km/s.

At that speed 100 m takes 9.60 ms. The race runs at 469x slow motion so it lasts 4.5 seconds on screen. When the winner crosses the line:

  • the other Falcons are 0.1 to 0.9 m behind (photo finish)
  • the ISS, at 7.66 km/s, is 26.4 m behind
  • the sound of the starter's pistol has gone 3.3 m (343 m/s), lane 7 is 7.9 m away, so the world record pace runner has not heard the gun yet. Reaction time (about 0.15 s) would not have run out either.

The last card says the winner was launched in 2021 and nobody is steering it.

How I built it

  • fetch.py downloads three CelesTrak queries (debris, rocket bodies, stations), once, and caches them.
  • rank.py (plain Python) filters the catalogue, computes perigee speed for every object, picks the heats, the finalists and the race table, and writes JSON. Every number on screen comes from these files or a constant listed in sources.md, and the build fails if a number has no source.
  • build.py runs inside Blender (bpy). It builds everything from an empty scene: camera moves, globe, track, tokens, HUD text, and bakes every animated value from a function of the frame number. No keyframes set by hand.
  • The 12,379 objects are one mesh, one vertex per object, with the orbit elements as attributes. A Geometry Nodes tree, generated by the script, solves Kepler's equation for every object every frame (10 Newton iterations, unrolled into nodes), and handles the elimination: grey, then shrink to nothing. Orbit trails use the same tree.
  • A time-lapse clock is set so that the winner hits perigee on the exact frame the camera dives in. Then a white flash cut to the track.
  • Rocket stages, ISS and sprinter are built from lathe profiles, boxes and curves in code. Not to scale (they are tokens in 1.22 m lanes).
  • The soundtrack is generated in Python too (a hum that follows the speed limit, ticks, a low note at the finish). The film works without sound.
  • Render: EEVEE, 32 samples, 0.72 s per frame, 8 minutes for the whole film.

Challenges

  • The first threshold idea from my spec (7.6 / 7.9 / 10.0 km/s) did not empty low orbit in the real data. 1,403 objects were left after 7.9, still 47 in low orbit. Setting heat 2 to the ISS's own speed fixed it, and gave the ISS a reason to be in the film.
  • Four of the five finalists have the same name, FALCON 9 R/B. On the cards and results the launch year tells them apart.
  • In the first race render the rocket stages were invisible. The ground plane was drawn over them, because of transparent material sorting in EEVEE. Solid materials for ground and tokens fixed it.
  • The first preview had no sound. The audio file was fine, but the encoder was given a relative path and Blender silently made a silent track.

Honesty notes

  • Orbits are two-body Keplerian propagation from the epoch elements (epoch 2026-10-19). Good for display, not a collision tool.
  • The race is a flying start through perigee, at each object's perigee speed, in the Earth centred frame. The lanes are a straightening of the real perigee arc, they do not claim the objects share an orbit.
  • World record pace is 9.58 s, shown as a generic wire figure, no likeness.

AI and assets

The spec and the code were written with AI assistance (Claude). No AI generated images, video or audio. No third party models, textures or sounds. The only thing not generated is the font, DejaVu Sans Mono, which ships with Blender. Orbital data is CelesTrak public data, used as input data.

Built With

Share this project:

Updates

Submission history