The goal of this project is to take the human-made annotation data from a 2D chorography and use this data to create a 3D model of the city it depicts to reveal interesting information encoded in these maps. To contextualize this goal, let’s imagine we have a 2D chorographic view as the reference for a landscape and city, and a blank 3D world to fill. If you want to recreate this map in 3D, one approach might be to individually design and place each object in the map, such as houses, fortifications, and religious buildings, which are abundant in the Civitates maps, or the Book of Fortresses perspective drawings. As you might expect, this approach is tedious, and more importantly, reiterates work done for similar objects, because you may have multiple instances of the same object type (like a fortified tower) with different shapes and sizes.
This is where Houdini comes in. Among 3D modeling and animation software, Houdini distinguishes itself by specializing in something called proceduralism. Houdini’s procedural generation of nodes makes it easy for people to design objects that can be reused many times, even if the instances of that object must be different. For example, say a chorographic view contains two disconnected pieces of city walls, both with different sizes and numbers of merlons. Rather than creating one wall with 7 merlons and one wall with 11 merlons, we can instead create a generic wall with n merlons using some math and proceduralism. Now, if your wall model is designed well, it can be used for every wall in the maps you are modeling – as long as it is parametric, i.e individually adjustable. This is done through HDAs (Houdini Digital Assets), which are essentially packaged models of 3D objects with a parameter interface. So a wall HDA might have a parameter for height and width, so you only have to worry about controlling these values and not everything that happens underneath.
The next problem is, even if we have good models and our 2D map as a reference, how do we go about putting the right values into the parameter interface? If a map has 100 houses, 20 fortress parts, and a multitude of other objects, this would still require individually setting the parameters for each object in the map. Luckily, Houdini comes in handy here too. Using our annotation data from Supervisely, we can extract certain information about each object in the map, and import this data directly into Houdini. This data includes information such as the position of each object in a 2D plane, its size in the x and y direction, and other object-type specific information. So, if you can figure out a way to set the parameters of your HDAs based on this imported data, then you have automated a large chunk of the process to go from a 2D map to a 3D model of your city with minimal “direct” modeling by hand.
Overall, Houdini’s ability to facilitate procedural and data-driven modeling is the reason why it is so integral to this project. Once the object HDAs are made and the map/view you want to model is annotated, you are well on your way to “automatically” generating a city, which is an exciting prospect for historians and art historians who want to study these objects from new vantage points.