Evolutionary optimisation + generative AI · UCL Digital Ecologies · 2025

Reimagining
Jeddah.

Performance-driven urban form for a hot, sprawling city, visualised by a diffusion model fine-tuned on Hejazi architecture.

Wallacei · NSGA-II · Ladybug · ComfyUI · SD 1.5 LoRA · Hunyuan3D

Retextured neighbourhood

Reimagining Jeddah · UCL

01 · Genetic algorithm

Evolve the street, then the mass.

A plot-threshold gene grows streets, parcels, land use and volumes. NSGA-II searches it.

Site boundary

Site

Parcels

Parcels

Land use

Land use

Pareto-front phenotypes

Simulation 1 · Pareto-front phenotypes

Evolution across generations

Evolutionary matrix

Three selected individuals and their objective ranks

Layout → massing

Phenotype catalogue

Phenotype catalogue

Best solution with massing

Best solution · hierarchical streets, varied heights

02 · AI visualisation

Training a LoRA model on Hejazi architecture.

A captioned dataset of coral-stone houses, Shibam towers and modern-traditional facades was used to train a LoRA model. Segmentation and depth maps derived from the massing condition every generated image.

Dataset hierarchy

Dataset · classes × views

Colour palettes

Palette extracted from references

Segmentation and depth maps

Conditioning · segmentation + depth from the massing

With and without LoRA

Without / with LoRA · same prompt, same seed

Seed 1

Seed 2

Seed 3

Seed 4

Seed 5

Seed 6

AI render
AI render
AI render
AI render
AI render
AI render

03 · Image to 3D

From an image to a textured 3D model.

Hunyuan3D 2.0 lifts generated facades into textured meshes; octree resolution benchmarked against time.

Front image
Front image
Mask image
Mask image
3D delight image
3D delight image
Left image
Left image
Mask image
Mask image
3D delight image
3D delight image
Back image
Back image
Mask image
Mask image
3D delight image
3D delight image
Render textures (position maps)
Front side
Front side
Back side
Back side
Top view
Top view
Right side
Right side
Left side
Left side
Top view
Top view
Render textures (normal maps)
Front side
Front side
Back side
Back side
Top view
Top view
Right side
Right side
Left side
Left side
Top view
Top view
3D sample multi views
Front side
Front side
Back side
Back side
Top view
Top view
Right side
Right side
Left side
Left side
Bottom view
Bottom view
Normal map on the mesh
Untextured mesh
Baked texture atlas
Baked texture atlas
Textured 3D model
Input image

Input

Normals

Normals

Textured mesh

Textured mesh

Octree resolution comparison

Octree 32 → 640 · chunks and seconds

Turntable · 01, single image

Turntable · 02

Turntable · 03

Turntable · multi-image cluster

04 · Ray-cast texture projection

Project the image only where the camera can see.

A ray from each camera to each vertex; if nothing occludes it, the pixel colour is written to the vertex. Written in Python inside Grasshopper.

Visibility check, in planMove the camera. Green vertices receive the image; grey are occluded.
Live · JS
visible ·total ·
Camera rig

Five cameras, five images

Vertex ownership by camera

Vertex ownership by camera

100 quads

100 quads

500 quads

500 quads

1000 quads

1,000 quads

Retextured neighbourhood

Retextured · camera 1

Retextured neighbourhood

Camera 2

Retextured neighbourhood

Camera 3

05 · Film

The neighbourhood, in motion.

Final film · from GA layout to textured 3D to AI walkthrough