Model Generic Building

Even if this problem seams to have an easy solution – just model all the buildings one by one – the reality is a bit more complicated than it may look. When I have completed the first release of the town, on 2001, I followed the ‘easy’ approach: just modeling every single building with Lightwave. The result was far from being satisfactory for the following reasons:

  • This process is very time consuming. It would be much  better to use the time to model the principal buildings rather simple generic buildings that nobody notice.
  • It is repetitive. I deeply hate to do same things twice.
  • Low variance. At the end all the building started to look the same.
  • Low flexibility. If error, I had to remodel the building from scratch (did I already talked about doing same thing twice?)


I did not have the solution to this problem till 2010, when a swiss company, Procedural (today ESRI), published a software for the ‘procedural’ generation of cities: CityEngine.
This concept behind this software is simple but smart at the same time. If we describe the process of creating a building, we end up to have more or less this ‘algorithm’ for every type of building:
  • Build the base
  • Extrude vertically for the height
  • Add details like door, windows, moulding
  • Build the roof
  • Apply textures
  • Save the object

If we now imagine to write a Grammar that can convert the above high level language into language statements, we could have the following:

  • Start
  • Create Polygon
  • Extrude #height
  • Split #NumberOfStoreys
  • Insert #WindowsOBJ
  • Insert #DoorOBJ
  • Insert #RoofType
  • PaintWall #Texture1
  • Save Building#
  • End

At this point, if we call the above ‘Program’ by changing every time some parameter (#DoorOBJ, #RoofType, etc) we can generate a large variance of buildings with a single click.This is exactly what CityEngine does (with a much higher level of complexity, of course), it allows you to ‘describe’ the building process modeling with a pretty complex Grammar and then it can, more or less randomly, generate buildings using random sets of parameters at each iteration. With a reasonable basic collection of details (doors, windows, textures, roofs) the combinations of the resulting buildings are pretty infinite.
The results of this process is a highly detailed collection of unique buildings that can be exported in Wavefront format and then loaded in the main modeling software (in my case, Lightwave).

I am a software developer, it was not difficult at all for me to learn this Grammar and to develop the script for Ostia. This task took me about 3 months (and from time to time I am still adding new features) but I can finally generate with one click all the secondary buildings of Ostia.

The last version of Ostia Antica with CityEngine takes 6 minutes to be completely rebuilt and it counts 20546 Objects for a total of 7`044`721 polygons.

The complete project of Ostia Antica in CityEngine

I was even able to model some of the principal monuments using only CityEngine, like the Hortensius Horrea, the Great Horrea and Horrea of Artemis. For other monuments, I have further customized in Lightwave the model created with CityEngine, like the Guilds Square, the Garden Houses and the Navalia.

A view of the Hortenisus Horrea built with CityEngine


A detail of a block created with CityEngine.
Notice the high variance of the building