The hard part of a city twin is never the first screenshot. The first screenshot takes a weekend. The hard part is the third month, when someone stands on a real corner with the model open on a laptop and asks why the sidewalk is two meters off. Most of the fixes happen in places nobody puts on a slide.
The St. Louis project is a good example to work from. St. Louis Development Corporation sponsored it, Houseal Lavigne built the scenes, and the runtime is Unreal Engine with the ArcGIS Maps SDK streaming in city layers. The source data was already in the city's GIS: footprints, parcels, centerlines, street furniture, historic records, and proposed developments. My notes cover the unglamorous middle of that pipeline.
Start with an inventory, not a render
Before importing anything, I list every layer, who owns it, when it was last edited, and what its geometry actually represents. A parcel polygon and a building footprint often look identical on a map. A centerline is not a road surface. If you skip this step you will spend a month making a beautiful scene out of the wrong polygons.
I also write down the units and the vertical datum. City data mixes state plane coordinates with web mercator exports and hand edited shapefiles passed around for a decade. Every one of those has to be reconciled before it touches the engine.
Pick one projection and stay there
Unreal works in centimeters. GIS works in degrees or feet. Somewhere between them you need a single authority. I project everything into one local planar system early, keep the origin near the project area, and store the transform parameters with the build. When a building lands twenty meters off, you want to check the transform, not guess.
Vertical is its own trap. Ground elevation, curb height, and building base are three different numbers. When buildings float or sink, the footprints were probably placed at a flat zero while the ground mesh has relief.
What streams and what bakes
ArcGIS Maps SDK for Unreal Engine is good at streaming layers you might want to toggle or query. It is less good for detail that never changes. My rule: stream anything the city updates, bake anything that needs hand work. Historic building geometry and custom facades get baked. Parcels, proposals, and anything with an update schedule stay live.
Level of detail without visible popping
A walkable scene needs close detail, but the aerial view cannot carry every window frame. I set two budgets: one for the street level view and one for the aerial. Between them, transitions should happen behind a building or during a camera move. If a reviewer can see the switch, the LOD is wrong, not the hardware.
Street furniture is the usual culprit. A bench can be twelve triangles or two thousand. At three meters it needs the armrest. At three hundred it does not exist.
Materials that do not lie
Brick in St. Louis is not one color, and the gap between a red commercial block and a painted row house is part of how the street reads. I use shared materials with per instance tinting rather than unique textures per building. It keeps memory down and a whole district tweakable in one place.
A quick massing pass before the heavy build
Before committing a proposal to the full pipeline, I draw a rectangle around it on a map and let GenAnywhere produce a 3D model of the area. It returns massing, not architecture, and that is what I want at that stage. I check height against neighbors, street enclosure, and where the shadow lands. If the massing fails, I have saved a week of facade work.
The demo has to survive a bad laptop
A community meeting will not have the machine you built on. I test on integrated graphics, with the browser open, at default resolution. If it cannot hold a steady frame rate there, it is not ready. I also keep an offline build, because municipal wifi is a rumor.
The checklist I actually use
One projection, documented. One units table. A ground mesh that matches the curb. Buildings that sit on the ground. Proposals in a separate toggle. Provenance for every layer. A build that runs on a normal laptop. None of these are exciting. All of them decide whether the model is trusted after the first demo. The visuals get people in the room. The boring parts keep them there.


Top comments (0)