Benjamin Dickson - Third Year Project at University of East Anglia

Realistic Urban Modelling

My third year project for my final year in my degree studying Computing Science was to implement and develop techniques for realistic aging and weathering of structures, to build on the work of the University's 3D modelling projects for historical buildings in Norwich

I decided to tackle this from a geometry point of view (rather than, say, textures, shaders or bump mapping) - I decided to try and come up with a way of approximating the effects of the environment and adapting the shape of the model.

The mechanics of this will be explained in my write up, however this web page presents a few examples of the development of my work and examples of the results

For any questions, suggestions or feedback on this project, please email me at alienturnedhuman@gmail.com - all images can been clicked to enlarge.

Basic principle

The idea is to take a model of either more simple geometry (for example, one with perfect cuboids for bricks), run the model through my code with parameters and end up with a more complex model, that looks realistically aged

I started out with this simple model, of a 2x2x2 cube, with a 1x1x1 cube removed from a corner, to test various tecniques. This here shows an early example of me running code to subdivide and smoother the mesh.

My basic approach was to simulate environmental factors and properties of the material, and use this to adapt the mesh, manipulate the geometry, sub-divide and smooth to add detail.

These models show very early attempts at controlled mesh manipulation. Forces were applied to 'tunnel' into the model, pushing the vertexes back as if had been erode. However, the erosion on the large face shows the geometry being pushed outwards - like a lump of clay or putty - while this is a useful effect for some materials, and can be useful, for modelling erosion this reaction would not be seen.

My Solution

To address the problems that arose during my early tests, and to make the simulation more controllable, I decided to have my code generate a node based skeleton for each object. Vertexes would be bound to the nearest node behind them, allowing me to control the behaviour (for example, in the case of the stone, making sure it erodes towards the node, to stop the deformation seen earlier).

The skeletal would also allow the code to later use to model other materials like wood, where the structure could bend as a result of humidity, although this is not something I have so far developed

After developing this system, I applied it to my original test model with the following results:

The hollowing out of the back of cube was the intended behaviour (note there was a glitch with my code for normals at this point, hence some visual artifacts)

The code ran successfully, carving out a huge chunk of the cube in a controlled approach. However the notches on the sides, while they look great, were an unintended consequence, and were a result of the convolution algoritm pulling vertexes in. This was rectified by updating the code to only run the convolution process on vertexes that were actually affected by the weathering functions.

With these minor issues sorted, I proceeded to move on my test model and apply the code to 3D models created by the 3D modellers working for the University

Norwich Castle

The intended real world application for my work, was for use on the detailed 3D models of Norwich Castle. I was provided with a low detail model of the castle, and a brick by brick highly detailed model of one of the walls.

Photograph of Norwich Castle and the low detail model created by the team.

The nature of my system meant that simply taking it and applying it to a whole model all at once would be very computationally expensive. To drastically cut down on computational time (especially given my laptops are 5 years old) I set up my code to process a larger model by each indiviudal component. For the castle this would take the large brick by brick model and process it brick by brick.

I started by processing a chunk of the castle wall and seeing the results. I set the code to run a few bricks at a time, pausing to see the results and updating the parameters to work towards the desired effect.

Due to the modeller's random positioning of the bricks in 3DSmax, they were processed in what looks like a random order, however below shows the process as I updated the bricks from no weathering, to a extreme low poly weathering, then a couple of incremental refinements:

This was the first "real world" application of my code, and the results matched my expectations.

Refinement

After showing the results to my supervisor and the original modeller, I was given a few pointers on things they would like me to test. One was to show gradual changes in weathering (for example, more erosion at the top of the building and less at the bottom) and the other was to show more variation in individual elements (for example, more wearing on one part of a brick than another).

This didn't require any changes to my model, just some code to intelligently control the settings. To achieve the changes in weathering I just had to move the cluster of weathering nodes further away the lower to the ground they were. To get the differences in element modelling I just had to create a new class for a harder type of rock and randomly assign nodes either weak or strong rock. (Note, while I used random assignment, an algorithm could be written to assign these nodes procedurally)

Column element shows less wearing at the top. One brick shows wearing on the top but not the bottom due to differences in material make up.

With the system showing it could be applied to a full model, it was time to look back at the effects down at the componenet level. Here is the process of erosion shown on a stone (note, this would obviously be 'extreme' weathering):

From left to right: A geometrically 'perfect' chamfered cuboid, the same model after erosion, the eroded model smoothed using subdivision and a convolution process.

From this point onwards, it was just tinkering with the properties and algorithms to set up the underlying structure of a material and best configure the weathering controls.

The weathering system are just clusters of nodes (usually positioned according with a random gaussian distribution) and these nodes interact with the model. Therefore if you place a cluster of nodes on the east side of a building, you would get weathering on the east side of the building.

Of course, all my examples so far had been showing high levels of wear, closer to hundreds of years of erosion. Given that Norwich Castle has been restored many times throughout the ages, the stonework is in much better condition than is typical of a build its age. I therefore decided to dial the settings down and see the effects with less severe results:

From left to right: A geometrically perfect chamfered brick after minimal erosion applied, close up of the detail, A wall contructed of these bricks (viewed in a different renderer).

These results were better than I imagined, given the simplicity of the underlying model. Not only did the models end up with realistically looking worn edges, but varying of material properties within the structure caused chips and dinks to appear in the bricks as well (enlarge the final image to view)