UrbanWeave - MFA Thesis

UrbanWeave (working title) is a procedural city generator I’ve been working on since September 2024. Current procedurally generated city engines either create a homogeneous product with no individual districts with unique character. To remedy this I will use an intelligent decision algorithm and generated data to simulate zoning and historic growth.

v0.6.01 11-08-24

To represent the radial street pattern, I added a feature that allows the artist to change the city center location and how many radial branches the city starts with. Previous, the starting geometry was a single line that would be reflected and then added upon, but now there is a script to generate a specified number of lines radiating out from the centerpoint.

v0.6.00 10-22-24

For this version I worked at integrating the ability for an artist To paint in data layers. In this case the left map below is a population density map that’s compounded with the perlin noise that was there before. The right map is for a checker-style street grid, which just sets the population influence to 0.

v0.5.06 10-17-24

In this version, the population sampling is more advanced. Previously the branch tips sample population density by shooting a fan of rays out and samples at the ends. Now, each ray is divided by new points at equal intervals. It samples from each point, then weights them by the inverse of the distance and sums the values up. The ray with the highest sum is chosen to influence the direction. I also spent some time cleaning up the code, making it run more efficiently.

v0.5.04 10-17-24

In this update, I made the main highway start going from both directions, This creates a more organic road network, as opposed to the very linear previous versions. While it seems like a small change, it required me to rewrite quite a bit of code, overhauling how it initializes the first few points.

v0.5.03 10-16-24

I added an attraction for the roads towards population centers (currently represented by a perlin noise. The top image is the previous version only using a random value to turn the roads. The second image has no random turning, only a weighted influence from population maps. I also created more efficient point attributes; now using “type” to cover everything instead of a separate attribute for each. Previously the types were highway (blue), highway branch (Cyan), intersection (magenta), and ray (yellow). Whether the point is a branch tip or not is stored separately and colored green. My next plan is to integrate water/invalid areas, different road patterns, or terrain constraints.

v0.5.02 10-15-24

This is demo footage where I show off the road branching algorithm, how it can be bent randomly, and how I can represent a 2d image (Perlin noise at the moment) as a grid. All these effects are achieved primarily through “point attributes”, which store data like whether it’s a branch tip, a population density statistic, or the height of the terrain. However, it becomes a lot of information at higher iterations. I believe this is part of why it gets quite slow. I plan to eventually go back and have the program “clean up” behind itself, only storing data that might be needed later