We are going to recreate a virtual city in a procedural way, with mathematically guided distribution and placement of elements. It will have the advantage of being reusable. The goal is to make the model more complex by successive steps. The principles will be explained in detail.
In order to ask ourselves abstract urban planning questions, let us place ourselves in a distant past, but nevertheless documented, era: Roman Antiquity. This will enable us to avoid comparing our model too closely to reality and allow a certain freedom of interpretation. Of course, it is necessary to document beforehand with some references (archaeological for our case).
Also, the model explained here wants to be independent of any 3D software, we will try to stay within general technical considerations.
Let’s begin: we know that the Romans took care of urbanism and a certain orderly organization of the streets.
Technically, let’s bound the limits of our city (an irregular oval) and inside, let’s distribute a house model homogeneously, shown on the following picture.
It’s way too regular (more suited to the distribution of tents in a fortified camp, or for legionnaires in close formation). There is also only one model of house. To improve this, we will diversify the houses (shape, distribution of windows, floors, etc). The scale of the houses will remain globally the same. Pease note that the size of the houses in relation to the size of the city defines the scale of the representation at this stage. We have no other reference to get an idea of the size of the city! All future elements will have to be proportional to these basic elements.
Let’s continue our complexification: in the following image, the different houses are randomly chosen with the same homogeneous distribution.
It’s already better, but this city remains very uniform. As it is, it could be usable for a suburb populated by pavilions... But with a few adjustments. We can consider varying the spacing between houses, creating streets of different widths.
But this is not New York, and even for an ancient city, one expects a certain balance between order and anarchy.
So we’re going to work on an urban model with streets that cut off regularity and orient the houses according to these streets. We can also vary this alignment according to different areas of the city.
At this stage, the distribution of buildings can be defined according to several criteria:
- multi-storey houses in certain central districts,
- Rich houses (with interior garden) would be grouped together,
- these neighborhoods would be surrounded by slightly less opulent houses,
- the poorest neighborhoods would be far away from it,
- The street grid can differ from one neighborhood to another (more regular in richer neighborhoods, more winding and dense in poorer ones), etc.
The volume effect is much more interesting than before. The houses have been separated by streets (and "districts") and their orientation follows this structure. In the distance, we can see a gap between the houses, which now seem tighter, but we will be able to adjust some elements later to enhance this effect (add local fog, change the contrast of the image, if necessary).
Seen from our camera, the neighborhoods separate the city like on the left image. The houses are also oriented according to these parameters. To increase the separation of the streets, the settings of this pattern can be adjusted, hence the interest of guiding the shot by mathematical elements (mainly layers of Voronoi cell patterns, with different amplitudes) rather than by images. We will then have the possibility to highlight the streets with different materials on the ground, and by adding object in these streets (like virtual characters, market stalls, etc), we will see this later.
Next, we will create bumps on the map, which is a determining element (especially in a city like Rome, with its seven hills). It will be important to use elevation, slope inclination data for each location in the city. The illustration on the left shows a river, different reliefs, some of which are carved by small streams. The figure displays levels of gray: dark for the low altitudes, and light for the highest areas. Below is our previous city based on a topography of a few tens of meters of unevenness.
Remember: the goal is not to reproduce exactly ancient Rome, rather to create an imaginary or approximate reproduction of it, like those that the Romans built on the same model, elsewhere in the conquered territories (and not necessarily as large).
Strangely, the areas without buildings seem more bumpy than the neighbourhoods themselves. However, there are many houses with floors (i.e. on the left side of the image). Also, we will fill large empty areas (squares in the city) with new buildings to break up the regularity of the panorama even more and make the city more complex. We could place there administrative buildings, temples, etc.. Always with a bit of randomness.
The appearance of relief also allows us to ask ourselves a lot of new questions:
- how do houses arrange themselves on the different levels?
- Would temples rather be on the heights?
- What would be the "social" distribution (rich and poor) of the houses?
- Do the streets and roads follow the topography of the land?
- how is the drinking water network organized?
All these appearing ideas, inspired by the simulation, allow us to question the archaeological sources, and if they only partially answer them, we need to think of practical and logical solutions to bring "realism" to our model.
As soon as a general rule emerges, it is possible to integrate this parameter in our procedural model (depending on the possibilities of the software used, but any particle system allows a great flexibility and by adding a bit of rudimentary mathematics, it is feasible). However, it is tempting to place some buildings by hand if they are not too numerous, but we will avoid this option in our exercise.
Let’s continue with the automated city, with a few more parameters, partly answers from the previous list. We add temples, administrative buildings in the gaps, to increase the diversity and make the city more complex. And some trees were added around it.
We need small elements to inhabit the city: bundles of market stalls scattered at the bottom of houses, more numerous at the roadside. Their distribution will be, again, guided by the parametric streets map.
The temples do not follow the same orientation as the streets (were they oriented according to a solar logic?), clearly, the temples’s construction responded to very specific divinatory imperatives.
And viewed afar, these temples could be Greek, Carthaginian, Babylonian, or from elsewhere, but the administrative buildings show the Roman city. Of course, amphitheaters and a grandiose circus would fill this imaginary "Rome", but we will stop there for the architecture.
Finally, we will have to create an environment of nature around the city, and that will be the end of the static elements. If we want to create an animation, these objects will be rendered only once, unlike animated ones (crowds, smoke...). They will then be mixed together like on the picture below.
This is the city with a crowd of people (arranged according to the same parameters and randomness), an environment as well as mists and fumes which, according to historians, made these cities smoggy and smelly!
Finally, depending on the needs, this city with different levels of detail (from urbanism to individuals) can be used in a video game or integrated in a film shot (with tweaks for each). For the foreground elements, it will be possible to manually reposition them for a finer artistic control.
Some plugins for 3D software offer various solutions ranging from skyscraper-like blocks of different sizes, up to the ability to guide the scattering of buildings with real geographic and urbanism data. Without any dedicated tool but particles and possibly a small script, this principle can be reproduced within any 3D software. Then, the task is to adapt the model according to its intended use!
To go further, here’s a PDF document from 2006 that covers in more details the procedural generation of cityscapes.