Evolutionary optimisation + generative AI · UCL Digital Ecologies · 2025

Reimagining
Jeddah.

Performance-driven urban form for a hot, sprawling city — visualised by a model that knows what Hejazi architecture looks like.

Wallacei · NSGA-II · Ladybug · ComfyUI · SD 1.5 LoRA · Hunyuan3D
with Raghul Siva & Rohit Sindhav

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

Best solution with massing

Best solution — hierarchical streets, varied heights

Phenotype catalogue

Phenotype catalogue

02 · AI visualisation

Teach the model what Hejazi looks like.

A captioned dataset of coral-stone houses, Shibam towers and modern-traditional façades, fine-tuned into a LoRA. Segmentation and depth from the massing condition every image.

Dataset hierarchy

Dataset — classes × views

Colour palettes

Palette extracted from references

LoRA training table

Five checkpoints — 4 to 29 epochs

Segmentation and depth maps

Conditioning — segmentation + depth from the massing

With and without LoRA

Without / with LoRA — same prompt, same seed

Denoising, frame by frame

Denoising — second seed

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

03 · Image to 3D

From a render back to a mass.

Hunyuan3D 2.0 lifts generated façades into textured meshes; octree resolution benchmarked against time.

Input image

Input

Normals

Normals

Textured mesh

Textured mesh

Turntable — 01, single image

Turntable — 02

Turntable — 03

Turntable — multi-image cluster

Octree resolution comparison

Octree 32 → 640 — chunks and seconds

Multi-image workflow

Multi-image workflow

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, walked.

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

Clip — image-to-video from a LoRA render

Clip — plaza at dusk