An OSM City Generator where real data drives every decision.
OSM data → Python ingest → Houdini HDA → Unity (C#) · co-authored with Claude Code
A data-driven procedural pipeline: real OpenStreetMap data flows through a Python ingestion layer into a Houdini HDA that generates game-ready geometry, then into Unity through a C# editor import tool. It isn't a random city generator. Road width, building height, and material assignment are all driven by semantic tags from real data, not by noise.
The generator, running.
The point isn't the city. It's that every road width and building height traces back to a real-world tag, not a random seed.
Sole builder across the whole pipeline.
I designed and built every layer: the Python OSM ingestion and rule-based classifier, the Houdini HDA that turns tagged data into geometry, the FBX/USD export, and the Unity C# editor tool that imports it. Co-authored with Claude Code, with the judgment to know when its output was wrong.
The hard part isn't making a city. It's making one driven by real data, not random numbers.
Plenty of tools scatter plausible-looking buildings. The harder problem is fidelity: reading a real place and letting its actual road types, footprints, and building tags decide the geometry. Raw map data isn't geometry. It has to be fetched, normalised, classified, and interpreted before an engine can use any of it.
Built a node-based generative workflow, driven by controls, not code.
Read the real world
OSMnx pulls the road graph and building footprints for a real neighbourhood, normalised from WGS84 to local metres and cleaned to JSON.
Tag, don't guess
A rule-based classifier maps OSM tags to a semantic type: residential, commercial, or industrial. Built as a slot an ML model can drop into later.
Data drives geometry
The HDA sets road width from road type, extrudes building height from floor/height tags, and groups primitives by building type.
A tool, not a scene
A parameterised HDA with a clean interface, exporting FBX/USD with named material slots and two LOD levels.
A staged pipeline, from Overpass API to Unity import.
Five stages, each with a single clean handoff: Python fetches and classifies the data, the Houdini HDA turns it into geometry, an FBX/USD export carries named material slots, and a Unity C# editor tool imports it in one click. Everything is pre-baked offline, not generated at runtime.
Every stage has a single, testable handoff. The classifier is the thesis: real-world tags decide the geometry, instead of random numbers.
Real data in, game-ready city out.
These describe what the pipeline does, not a benchmark.
The same HDA-as-a-product discipline I shipped 20+ times at DNEG, where real artists, editors, and compositors drove the tools in production.
Shipped with CI/CD, QA, and docs across art, engineering, and TD · qualitative adoption, not a headline figure