Manuel Porras

All work / Address → 3D scene

Case study · Creative AI Lab

From an address to a 3D scene — agents that write Blender code

An animated series needed real places: Alexanderplatz, a café in Neukölln, the Brandenburger Tor. Instead of generating meshes, my agents write every place as Blender code — from open geodata or from a couple of photos.

In short: An animated series needed real places such as Alexanderplatz, a café in Neukölln and the Brandenburger Tor, and the image-to-3D models I tested locally invented details and fell apart when reduced to a scene budget. So Claude Code agents write every place as Blender Python code in real metres — streets from an address via open geodata, interiors and landmarks from photos and research — with automatic checks on every build. The result: 30+ 3D sets in 10 days, 22 places written as code, and 2–3 minutes from an address to a street scene.

30+3D sets in 10 days
2–3 minfrom an address to a street scene, end to end
22places written as Blender code
100 %Blender code — no generated meshes in the final places
3D · models
3D model of a Berlin café: wooden floor, tables, lamps and guests, seen from above at an angle.

Why not let an AI generate the meshes?

The obvious route was image-to-3D. I installed the models locally on my GPU and tested them: Hunyuan3D (2, 2.1, 2mv), TRELLIS.2, MeshAnything V2 and DeepMesh.

They fail in exactly the way a film set cannot afford. Single-image models invent the back side — a street sign came out with one post instead of two. And when reduced from about 390,000 to 2,000 triangles, a sensible budget for a scene, they fall apart.

The decision: places are 100 % Blender code. AI meshes only get in when the final model is correct from every side.

The decision: a set is code

Every place is a Blender Python script written by Claude Code agents, in real metres. Low-poly happens by construction — flat colour materials, boxes and extrusions, about 100 to 1,000 triangles per object — not by decimating afterwards. Changing an object means changing a number.

Two pipelines came out of it:

A · Streets from an addressB · Places written as code
Inputan address, a place name or coordinatesphotos or cited written research
Geometrygenerated from geodata by one Blender generatorone Blender script per place, written by an agent
Resulta street block in metres, georeferenceda set with an open front for the camera, baked light, characters
A · STREETS FROM AN ADDRESS address · place · lat,lon → Nominatim OSM+ Overpass Overturefootprints Berlin LoD2official 3D Street Viewcolours, opt-in Blender, headlessgenerator in real metres · 2–3 s rule audit → report B · PLACES WRITTEN AS CODE 2 photos orcited research agent writesone Blender script body checkseats · knee room · aisles light bakeCycles on own GPU GLB → 3D viewerorbit · cameras · baked vs. live light a person approves every model from all sides
Two pipelines, one rule: places are Blender code, not generated meshes.

Pipeline A: one command from an address

  1. Geocode. Nominatim (OpenStreetMap) turns text or coordinates into a location, country and type of place.
  2. Streets and buildings. OpenStreetMap — streets, widths, lanes, buildings, levels, roof shapes, trees — via the API, with three public Overpass servers as fallback.
  3. Footprints and heights. Overture Maps, read straight from the public S3 bucket as Parquet. The slowest step.
  4. Official 3D buildings. Berlin’s LoD2 CityGML — walls, roofs, eaves heights — converted into the same local metres as OSM. Priority: LoD2 over Overture over OSM, and every choice is logged with its reason. A first version of Alexanderplatz came from OpenStreetMap alone; the official data adds the real roof shapes and building parts.
  5. Facade colours, optional. Street View is used only to sample a median colour per facade; only the colours are stored, no images. Off by default, because it is billed.
  6. Build. Blender 4.5 headless builds the scene in 2–3 seconds; the result goes to the viewer.

Every step is cached and timed in a report. A background queue takes requests; a full run from an address takes about 2–3 minutes end to end — for example the main square of Wrocław, with 221 buildings from Overture.

Map data © OpenStreetMap contributors (ODbL) · Overture Maps (CDLA) · 3D buildings: Geoportal Berlin, LoD2 (Datenlizenz Deutschland – Zero – 2.0).

Rules instead of eyeballing

  • An architectural audit on every build: no window above the eaves, nothing on fire walls, no tree or lamp post inside a building or in front of a door, no car in a camera’s view. The rejected cases are counted in the report.
  • A body check for sets: a collision grid measures seats, knee room, the narrowest aisle and head clearance against the characters’ body measurements, with a top-view sheet as proof.
  • A camera check: shots where the speaking character is hidden are rejected and replaced by an over-the-shoulder camera.
  • A person decides: every model is approved in the viewer, from all sides — there is no automatic comparison against the photos.

Pipeline B: a café from two photos

Interiors and landmarks do not come from an address. An agent writes one script per place. The café in Neukölln came from two photos: olive walls, fringed lamps, flowered sofas, a purple velvet curtain, a big shop window, the counter with the espresso machine and the chalkboard — in a 9 × 7 m room, with seat heights adjusted to the low-poly characters.

Landmarks come from cited research written into the header of each script — the Brandenburger Tor with its 12 Doric columns, the U8 station at Alexanderplatz from public descriptions.

The light is baked on my own GPU with Cycles (the café: 71 seconds). One trap worth knowing: under WSL2, OptiX reported the GPU but baked at CPU speed.

Result and honest limits

30+ sets in 10 days — about ten street scenes from geodata and 22 places written as code, including 13 Berlin places registered in a single night run.

What it does not do (yet):

  • “Address to scene” covers street exteriors only; interiors are written per place.
  • LoD2 tiles are fetched by hand; only a few are available locally.
  • Floors and facades follow heuristics (3 m per floor, a window grid, style rules per place); landmarks are hand-coded.
  • The files are heavy for the web; the models on this page are compressed copies.

Technology

Claude Code agentsBlender 4.5 (Python, headless)Cycles / CUDANominatimOpenStreetMap API + OverpassOverture Maps (S3, Parquet, pyarrow)Berlin LoD2 CityGML (lxml, pyproj)shapelythree.jspm2 queue