The workflow behind a 10-second night FPV drone shot through a city: one storyboard, a real physics path, one pivot (the first hero
didn't work), night lighting, sound from the motion, a 3.5-hour render, and a clay build-up reveal. Every step below is a script in
scripts/ that was actually run for that shot; names in them (Drone Empty, Street Asphalt, Building_1...) come from that
scene - rename them for yours.
0. Setup
- Blender 4.4+ (made on 5.2), a GPU for Cycles, Python 3 +
ffmpegon PATH (+numpy,scipyfor the sound step). - Live bridge (Claude drives the open Blender, you watch): in Blender's Text Editor run
tools/bridge.py(listens on 127.0.0.1:9876). Then from a terminal:python tools/send.py scripts/06_night.pyorpython tools/send.py -c "print(bpy.data.filepath)". - Set
FILM_ROOTto your project folder (default~/blender-film):scene/,render/,audio/,research/live there.tools/lib.pyis loaded by every script (helpers:coll(),save(),snap()...). - Work on copies. Before replaying or re-running any script that edits materials, copy the .blend - several passes are not idempotent if a run crashes halfway (re-running orphaned node links once).
1. Storyboard first
Ask Claude for a 10-second storyboard before touching Blender: shot list with timings, camera per shot, where the hero is, what the viewer feels. Turn it into one image sheet (any image model) and keep it open - every later decision gets checked against it.
2. City
Use a city asset pack you own (buildings, roads, props) or free CC0 assets (Poly Haven). Have Claude lay out one avenue + one intersection along +X from a top-view map (keep the hero's path clear of props), then dress it: cars (parked / moving / stopped), lamps, trees, hydrants. Bake every external asset into the .blend.
3. Motion from physics, not hand-keyed curves
scripts/01_swing_sim.py simulates the move (gravity, air drag, a rope that can't stretch, web anchors from the storyboard) and
searches the anchor timings until the path threads the street. 02_path_empty.py turns it into a path curve + an empty on
Follow Path with the offset keyed per frame (real speed, not linear). The hero is parented to the empty, the camera follows its
own path (03_camera.py, + 03b_camera_noise.py for subtle shake).
4. The hero - and when to pivot
The first hero was a rigged Spider-Man animated with Mixamo clips. It failed: mocap is recorded on the ground, so in the air it hung like a puppet, poses were stiff, and he was tiny in frame. If the character with limbs looks wrong, swap the hero - keep the city, camera and path. Ask Claude for options (we got: hawk, supercar, fix by hand, FPV drone).
The FPV drone works because nothing can look stiff. 04_drone_attitude.py flies it like a real quad:
- attitude from physics: thrust axis = acceleration + gravity, nose along velocity -> it tilts into speed-ups, banks hard in fast turns, flares nose-up when braking;
- throttle cut where the path is ballistic -> freestyle tricks layered on top: power flip, barrel roll, back flip;
- braking flare into a hover, then a slow yaw to stare at the lens; spinning props + cyan/magenta LED strips.
5. Realism pass (05_realism.py)
The tiny stuff nobody notices until it's missing: AgX exposure (no grade), a thin haze volume, asphalt with broken texture repeat, wheel paths, an oil drip line down each lane, repair patches, worn paint, and dirt at the foot of every wall + faint run-off streaks.
6. Night that reads as night (06_night.py)
Rule: at night the sky doesn't light the scene - practical lights do. Dark gradient sky with city glow, LED street lamps, lit windows, car head/tail lights, red traffic signals, blue-tinted fog with a touch of emission, wet asphalt with puddles.
- First attempt failed (orange fog everywhere, glowing blocks instead of windows).
- The fix: the facade textures already know where the glass is - glass is smooth, walls are rough. Use the roughness map as
the window mask (
roughness < 0.3), then light a random subset per window cell: warm, cool, off.
7. Camera like a real operator (07_shakify_cams.py)
Replace procedural noise with Shakify (free add-on with real recorded camera motion) on every shot camera. Add close shots:
a street-level camera ~0.45 m above the wet road, the drone dives at the lens and stops right in front of it.
08_lens_look.py: bloom around lights, slight barrel distortion + dispersion - no colour grade, the look is the lighting.
8. Sound designed from the motion
Free CC0 recordings (BigSoundBank: DJI drone, city at night, wet-road traffic, horns, distant siren, wind, rain on a puddle,
an air-conditioner). 11_motion_data.py reads the animation per frame (drone distance / radial speed / side / throttle, nearby cars)
into audio/motion.json; 12_build_sfx.py drives the mix from it:
- throttle -> motor RPM -> pitch; radial speed -> Doppler (pitch drops as it passes the lens); side -> equal-power pan;
- distance gain + air absorption, prop-wash bursts on throttle punches, spray when it hovers low over the wet road, the rooftop AC only on the roof shot, car pass-bys at their closest approach, street-canyon reverb;
- make two versions (calm night / full city chaos) and pick by ear. Calm won: let the hero be the star. Loudness -14 LUFS.
9. Render overnight - safely
09_render_opt.py: remove hidden duplicate geometry (the tree asset carried extra copies), use a lighter LOD for anything far from every shot camera, GPU denoising. No visible change.- Render six test stills at final quality first and check them.
10_render_edit.pyrenders only the frames the edit uses (shot list = camera + frame range), resumable, and writesrender/status.json;tools/render_window.ps1(Windows) shows a clean progress panel: %, time left, last finished frame.- After the render: check every frame exists, no black/broken frames (brightness per frame, jumps only at planned cuts), sound matches the approved mix, loudness ready for YouTube. Only then encode + (if you asked for it) shut the PC down.
10. The clay build-up reveal (proof it's real 3D)
13_aerial_cam.py adds a high camera above the avenue. On a fresh copy of the scene, 14_clay_build.py turns everything into
white clay, freezes the camera + traffic at one frame, and hides every piece until its turn, then drops it from the sky: cars first,
then buildings nearest the camera first, then the far city, then lamps and hydrants (~500 pieces). Each fall accelerates and
bounces a tiny bit on landing. tools/clay_assemble.sh: night | hard cut | clay build | one 0.25 s wipe | night, same camera,
same frame. Clay vs night split stills make great thumbnails.
Lessons that cost time
- Screen recorders capture black if the window spec is wrong - check the first recorded frame before you walk away.
- Viewport recordings: Material Preview needs motion blur off and volumes unlinked or it smears; Cycles viewport needs a denoiser.
- Relative output paths in
blender -bresolve to the drive root - always pass absolute paths. - Ask before any long GPU job; test at low quality first, final quality last.
License: MIT. Made by Mr omi with Claude.