Generate
Realistic
3D Cities
From Satellite
A complete step-by-step guide to transforming real-world satellite data into fully procedural 3D cities using Esri CityEngine — from import to Unreal Engine 5.
What if you could turn a satellite image of any city on Earth into a fully textured 3D environment — in minutes?
That's exactly what Esri CityEngine lets you do. By combining real-world geospatial data with procedural generation rules (CGA), you can build massive, realistic urban environments at a fraction of the time it would take to model manually. Whether you're a game developer building open-world maps, an architect visualizing urban planning proposals, or a filmmaker crafting digital environments — this workflow is a game-changer.
In this tutorial, we'll walk through the entire pipeline: importing satellite imagery, auto-generating street networks, applying CGA rules for instant building generation, adding realistic texture variation, and finally exporting everything to Unreal Engine 5.
"Procedural city generation doesn't just save time — it gives you the creative power to iterate at city scale. Change a rule, and a thousand buildings update instantly."
5 Skills That Will
Level Up Your Workflow
The Full
Pipeline
Importing Satellite Images into CityEngine Foundation
The workflow starts with real data. CityEngine supports multiple geospatial data sources, including OpenStreetMap (OSM) exports, GeoTIFF satellite imagery, and live tile services. For best results, export your target area from overpass-turbo.eu or download directly via the built-in OSM import.
Once imported, CityEngine will automatically recognize building footprints, road centerlines, and terrain elevation data — giving you an instant base layer to build on.
Generating Streets and Building Layouts Structure
CityEngine's street network generation interprets road centerlines from your OSM data and creates full-width street polygons with intersections, curbs, and sidewalks. You can also use the built-in street growth algorithm to procedurally generate plausible street patterns from scratch based on city type (Manhattan grid, organic, radial).
Building footprints extracted from OSM define your lot shapes — the basic input for all procedural architecture. Clean up overlapping lots using the Graph Cleanup tools before moving to rule assignment.
Writing CGA Rules for Fast City Creation Core Skill
CGA (Computer Generated Architecture) is CityEngine's scripting language for procedural generation. A rule file defines how a building footprint grows floor by floor, how facades are subdivided into windows and panels, and how roof types are applied — all from a set of compact, reusable rules.
The key concept is shape grammar: each shape (a lot, a floor, a facade) is processed by a rule that splits it, extrudes it, or assigns geometry. The result is geometry generated on-the-fly, which means changing one attribute updates your entire city instantly.
Notice how rand() and rint() introduce controlled randomness — so every building in your city has a unique height while still feeling coherent. This is the core power of procedural generation.
Enhancing Realism with Textures & Variations Visual Polish
A procedural city lives or dies by its texture quality. CityEngine supports UV mapping of facade textures through the CGA setupProjection() and projectUV() functions, allowing you to tile brick, concrete, glass, and metal textures at real-world scale across your buildings.
For maximum visual variety with minimal work, build a texture atlas with multiple facade styles and use the rand() function to randomly select from them per building. Combine with color tinting using color() to create hundreds of perceived variations from just a handful of assets.
Don't overlook LODs (Levels of Detail). Use CGA's case statements with geometry.area to switch between detailed and simplified geometry based on lot size — this keeps performance manageable even across entire city districts.
Exporting to Unreal Engine 5 Final Step
CityEngine's FBX and GLTF export pipelines are built for game engine handoff. Export your city in sections (chunks of ~500m × 500m work well) to keep file sizes manageable. Enable mesh merging per block in export settings to batch similar building meshes and reduce draw calls dramatically.
In Unreal Engine 5, import your FBX with the standard static mesh workflow. Enable Nanite on your building meshes for cinematic-quality geometry at no runtime performance cost. Use World Partition to stream your city sections in and out dynamically — essential for open-world city-scale environments.
to Game-Ready City
in One Workflow
CityEngine + CGA + UE5 is the most powerful open-world urban pipeline available today — and it runs on real-world data.
Perfect For Every Creator
Whether you're just starting out or looking to add a powerful new tool to your professional pipeline, this workflow scales to your needs.
Ready to Build
Your City?
Watch the full tutorial on Unreal Fusion and start generating your first procedural city today. Drop a comment with the city you want to recreate! 🔥
