Blog

Frame 1 of the shot: the model rendered in Karma over the stabilised plate

Building 20 Fenchurch Street in Houdini

I want to bring down the Walkie-Talkie in London for a fracture shot, and for that I needed a model of the building that an RBD setup can actually use. Looking right isn’t enough. Every part has to be its own closed solid with real thickness, nothing can overlap, and every piece needs a name and some tags so I can pull the floors, glass and fins apart later. So I had Claude Code write a Python generator that builds the whole tower inside Houdini from the planning drawings, and then spent a week of evenings matching it to my plate. This is where it ended up: version 38, rendered in Karma over the first frame of the shot.

Frame 1 of the shot: the model rendered in Karma over the stabilised plate
Frame 1 of the shot: the model rendered in Karma over the stabilised plate

Starting from the planning drawings

The City of London planning portal still has the building’s original 2008 application, so the starting point was 19 sheets from it: elevations, sections, a couple of floor plans and the facade details at 1:50. They’re all scans with no text layer, so every number was read off the images, levels from the datum tags on the sections and everything else against the drawing scale. All of it goes into one params file, and each value says which sheet and view it came from and whether it was measured, derived or estimated. There are 248 values in there now, 88 measured, 26 derived and 134 estimated. The estimates are mostly things the drawings don’t show, like the louvre sizes and the slab thickness. The generator code isn’t allowed any numbers of its own, so changing the building means changing the params and rebuilding.

Rules for the geometry

This is the part that matters for fracture. Every piece is a watertight solid with its normals facing out, and it’s built closed from the start with capped extrusions, lofts and boxes, not patched up with booleans afterwards. Pieces next to each other either share a face exactly or leave a 1 mm gap, and nothing overlaps. Each one gets a name like glass_L34_B012 (level 34, bay 12) plus a material, level and bay. After every build a validation pass checks the lot: PolyDoctor for manifold, Measure for the volume of each piece, and an overlap test between every pair of neighbours. If anything fails, that version doesn’t get saved. The final build is 31,299 pieces and takes about two and a half minutes to validate, with zero failures.

Four of the hero floors on their own with the facade hidden: slabs, columns and the core walls
Four of the hero floors on their own with the facade hidden: slabs, columns and the core walls

Matching the plate

The drawings got the overall shape close, but the crown and the flare of the sides never quite lined up with my plate, a short iPhone clip of the skyline that I stabilised in Nuke. Rather than track it, Claude estimated the camera from a single frame and fitted things to that, like the curve of the white band round the roof. It ended up good enough that I kept it as the shot camera. The plate only shows the front, so for the back of the crown I added a set of sunset photos I took from Tower Bridge and it fitted to those as well. The east half of the model ended up 16 to 19 percent wider than the drawings say, because that’s what the plate shows. Anything that came from photos is marked as estimated in the params, so I know which numbers to revisit if a tracked camera turns up.

An early check: every vertex of the model drawn over the plate through the estimated camera
An early check: every vertex of the model drawn over the plate through the estimated camera
The model over one of the Tower Bridge photos
The model over one of the Tower Bridge photos

The crown

The crown took longer than everything else put together. The roof over the sky garden arches up on the south and north, the side frames have to meet it at the corners, and the fins run up into the frame. Getting those corners to read right took about a dozen versions. Claude kept trying to read the joint off reference photos and kept adding pieces that weren’t there, like caps, gussets and a lip, and at one point it drew me a sheet of lettered options to pick from. What finally worked was describing the corner to it in plain words: the frames meet in a square mitre, the fins and the corner post stop on the top edge of the frame with a 45 degree trim, and the dark bit in the photo is just shadow. It built exactly that, and after one more round of tidying the gaps it was done.

The question sheet Claude made when we were stuck on the corner
The question sheet Claude made when we were stuck on the corner
The south-east corner as it ended up
The south-east corner as it ended up

The sky garden and the hero floors

Inside the crown are 25 lattice arches holding up the roof, built as leaning trusses that follow its curve. The floors that will be seen breaking up close (L16 to L36, set in the params) get an interior too: core walls, lift shafts, stairs, raised floors and ceilings, so there’s something behind the glass when it goes. I tried the roof crane up there for a version as well and took it out again, because it looked out of place in the shot.

Sunshades

The south face has a louvre on every bay of every floor, nearly 8,000 of them. The controls node has a tab where you pick a range of floors and an angle, and you can stack as many of those groups as you like. It works on the cached geometry, so it’s quick to play with, and the validation turns every blade to 0 and 90 degrees and checks that none of them hit each other or the glass at any angle.

Handing it over to fracture

The last step packs every piece by name, adds a group for each material and builds a starter constraint network: 198,104 glue constraints between pieces that touch, with a strength for each pair of materials so the glass lets go before the mullions and the mullions before the slabs. I’m building my own fracture tool to go on top of this (shapes to pick the area, then the floors, glass and fins fractured separately), so the generator stops here on purpose and doesn’t touch the sim.

Rendering

Karma, with render settings I worked out in another chat with Claude: adaptive sampling, path guiding, a proper sun angle, and AOVs and light groups for the comp. Frame 1 takes about five minutes on my laptop, so all 378 frames would be over a day. That’s going on the M2 Ultra. The Houdini logo in the corner of everything is because I’m on Apprentice.

Crops of frame 1: the first Karma settings on the left, the final ones on the right
Crops of frame 1: the first Karma settings on the left, the final ones on the right

How it’s built

All of the code was written by Claude Code, talking to Houdini through an MCP server. The rule from the start was that the code is the asset: Claude doesn’t edit nodes by hand in the scene, it changes the Python and rebuilds. The generator is about 4,200 lines of Python, plus a few tools for fitting cameras to photos. It went in phases (references, parameters, structure, facade, hero detail and fracture prep) and stopped at the end of each one for me to look. I reviewed every version by eye through the plate camera and sent back screenshots with notes, and every version that passed validation went into Perforce. That’s 38 versions in a week. It’s all Houdini 22 Apprentice on a Mac, with Nuke Non-Commercial for the plate.

No Comments

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

JStreamerHome, with the sidebar openMTG: Deck Builder on iPad, with the deck list on the left and a deck open on the rightMTG: Deck Builder