How we made Dusty's movie
Everything in the movie is built from code, starting from the same CAD model we 3D print Dusty from. No animation software, no stock models, no video editor. Here is the whole recipe, with the tools, so you can make one for your own project.
The tools
The recipe
Start from the real CAD
assemble.py places every printed part where it sits on the real robot and adds the bought parts (N20 motors, micro:bit, moto:bit, power bank, QTR-1A sensors). export_glb.py turns that into one GLB file in meters, Y up, with each part named system__part (brain, power, drive, sensors, sweeper, tray). Those names are what let the movie light up one system at a time.
Build the set out of code
The kitchen is shapes and formulas: an extruded counter with a sink cut out, a lathe-turned mug, a tube-bent faucet, a crinkled foil chip bag, and the crumbs as instanced meshes. Textures (quartz, subway tile, wood floor, the made-up "Crunchies" label) are painted on a canvas by the page itself. A fixed random seed puts every crumb in the same place every time.
Make the whole movie a function of time
This is the key trick. Give the page any time, say 36.4 seconds, and it can draw exactly that frame: where Dusty is, which crumbs are eaten, what the eyes show, where the camera is. Dusty's path is a spline through lawnmower rows. The page tests every crumb against the roller along that path and only keeps crumbs Dusty will really reach, so the counter truly ends up clean. The edge stop uses the design numbers: the sensor tip crosses the edge by 3 mm, then it stops.
Light it
A warm spotlight under the cabinet, cool moonlight, a room light so the floor shows below the edge, and reflections from an environment map. ACES filmic tone mapping keeps bright areas from blowing out, and the bloom filter only catches things brighter than white, which is just the red LEDs.
Write and record the narration
The script is 15 short lines, each written for one moment and timed to fit its window. ElevenLabs eleven_v3 understands tags like [whispers], [tense] and [relieved], which gave the nature-documentary feel. Halfway through, the narrator hands off to Nolan, the inventor and chief engineer, who explains how each system works in his own (cloned) voice. Each line is its own file, so one line can be redone without touching the rest. Where a line ran long, the movie was retimed to fit the voice.
Make the music and sound effects from math
The pizzicato strings are the Karplus-Strong algorithm (a burst of noise in a short delay loop that rings like a plucked string). The marimba is decaying sine waves. The synth pads are detuned sawtooth waves through a low-pass filter. The motor whir, crumb crunch, beeps, whooshes and fridge hum are filtered noise and tones. Two cues: sneaky D minor for the kitchen, bright C major for the breakdown.
Mix it
Every clip and effect is placed on one 134-second timeline. The music ducks about 7 dB whenever someone talks, using the voice's own loudness as the trigger, then a soft limiter levels the whole thing. The web copy of the audio is 48 kbps mono, 0.8 MB.
Render every frame on a GPU
A script opens the page in headless Chromium, steps time forward 1/60 of a second at a time, and saves each frame, captions included. Four copies run at once, each on a quarter of the movie. Then ffmpeg joins the 8,052 frames with the soundtrack.
Publish
The master file is 56 MB. The web copy is 28 MB, with the index moved to the front so it starts playing before it finishes downloading. The share picture is a still rendered from the same scene with the title added in Python. Change anything, push the page, and one command re-renders the movie from the live site.
Try it yourself
You don't need a GPU to start. Any three.js scene can be made a function of time and screen-recorded. The render step is where a GPU pays off: it turned hours of rendering into under a minute. The parts that took the most care were not technical: writing narration that fits its moment, and choosing camera angles that show the one thing each scene is about.
DONE
- Real CAD, Rev A.6
- Kitchen scene and story
- System-by-system breakdown
- Narration, music, sound effects
- 1080p60 render
NEXT
- Nolan's own LED faces
- Narration in Nolan's voice
- Real stopping distances after the Oct 10 test