This is part 1, the beginning of the entire development process focusing on Concept 2 of our ideation for the Silk Road theme. For subsequent parts, please see:
One of the core visual inspiration of this project is gears. Thus, we started with asset creation for these elements.
Below is a high resolution video result of our current 3D gears render, 20 seconds rendered at 3840 x 2160px:
This post details the breakdown in the asset creation pipeline and how rendering of our gears is achieved. This breakdown showcases the entire pipeline:
- Post Processing
- Particle Effects
The composition is not confirmed. Should the video not work, this is a high resolution screenshot from the video render.
Modelling the Geometry
Modelling is our first phase to obtain the 3D geometry we need. Modelling each 3D gear asset individually can be a labourous process. But what if it did not have to be this way?
Using Maya 2018, we discovered that it is possible to procedurally generate gears instead of hand-modelling individual ones, leading to huge time savings and procedural generation meant our assets are non-destructive (able to go back to edit easily its parameters).
Here is a screenshot presenting attributes of the gears we can edit when creating our gears through this method. It allows for easy experimentation.
With varying parameters, the aim was to produce interesting and contrasting shapes and proportions.
To give a realistic look, bevels were added to prevent the ‘CGI look’ resulting from edges with 90 degree angles. This will allow gears to catch lighting and reflections more realistically when lighting is added later on.
To make sure our gears look old enough to be from the 19th Century, much detail has to be considered in its texturing. It is easy to make metal look shiny and glossy. But this clean and shiny look is not what we want. Thus, we move to the next phase.
Adding detail through textures
With our models done, we need to make them look convincing by applying 2D textures and set up our material to emulate real-life materials, such as their physical properties (glossiness, smoothness).
For textures, I looked at various metals:
- Galvanized Metal
- Scratched Steel
To give the old, worn-down look, I use:
- Surface imperfections
To achieve a realistic finish, a technique called physically-based rendering is used. The standard surface shader in Unity supports this. The nature behind this idea is that in real life, no surface is perfectly flat and they have to respond to dynamic lighting easily in our CGI pipeline.
Normal maps lets us add micro-surface detail by simulating scratches, a common surface imperfection in metals. Notice that we also vary reflection in certain areas – a metal surface is not equally reflective across its surface.
Rust was applied using a Detail Mask, specifying three channels (Albedo, Smoothness and Normal).
In Photoshop, I took a rust texture and using a soft brush, desaturated areas of the texture where I did not want rust, as well as the rust layer itself, until I was happy with the percentage coverage of the rust on the gears.
Below is a summary of the gear at different stages of the material set-up process for comparison of start to end.
Notice how in step #2 the reflections and captured lighting falling on the gear are a lot more believable.
The detail masks added in steps #3 and #4 also affect the surface reflection, in addition to the albedo (color), as seen in the specular areas.
These are our two material set ups.
With our meshes and textures, we proceeded to try rendering them to see how they look.
In addition to quality results, the key to our workflow is as much about being able to iterate quickly throughout our conceptualization process.
Using the power of Real-time Rendering
I did not use Maya or Cinema4D to texture or render the gears in the meantime, as I wanted to adopt a faster rendering solution, observing that the long render times in these softwares limit what we can change in the final weeks, and it can be creatively-limited. Thus, I tapped onto the power of a game engine to do real-time rendering, and also because I am accustomed to using it.
We could get a 4K video rendered in 20 seconds in the Unity game engine, complete with lighting, reflections, shadows, particle effects, post processing and color grading. What is amazing is that it outputs a video directly with the option of individual image frames for lossless quality. So we can get a final render look and iterate extremely quickly without going through external video editing software, minimizing additional rendering steps. This lets us focus on the creative aspect instead of worrying about rendering time as it takes seconds to render high resolution 3D content instead of hours.
This additional creativity time let us experiment a lot with different lighting, camera perspectives and screen compositions as seen in pictures below. Plenty of happy accidents came from the results of this which will be talked about in future posts, which will be exciting to share. These would not have been possible in a pre-rendered solution. We are still open to use cinema4d if needed later on in the project.
Exploring compositions and perspectives on the first night of testing:
Lighting & Post Processing
The scene itself uses fully real-time and dynamic lights. These lights can be changed on the fly interactively to achieve results we want.
The scene is made up of a directional light as the key light, and a few spot and point lights for fill and rim lighting, as well as strategically placed lights to show off the surface detail of our gears.
Using lighting, it is easy to change the mood and tone of the scene globally as well. Above is one of the first few early videos of me playing with the directional lighting.
Post Processing involves several effects, one of which is tonemapping to get a filmic look. We also slightly bump the contrast and apply subtle color grading where needed.
Other subtle effects include ambient occlusion, which darken edges where objects appear to touch, making them look more grounded in reality, as well as bloom to simulate how intense light appear as bright spots through a camera lens.
Depth of field was also used to blur out gears in the background, just to test the composition and bring focus to the main gears.
These effects are added in the 3D engine so we can preview the gears’ look without going it through AE or other compositing softwares for faster iteration.
Ambient lighting is also used to set-up optimized reflections, by using something called Reflection Probes, as seen above. The reflections light up the darker areas of the gear parts, revealing details that are previously in shadow. A Reflection Probe is an optimized way to capture a 360 cubemap to cast as reflection onto nearby objects. The effect can be toggled off if we prefer the areas in shadow to remain dark.
This technique is cheap and fast to compute, and is highly optimized compared to Maya and C4D which calculate reflections by simulating light rays, known as ray tracing, which is comparatively fairly expensive computation. Our current technique of using reflection probes works well as we do not need super accurate mirror-like sharp reflections.
This project does not feature animation heavily, but is still essential to the process. To create intricacy and mesmerizing effects, we will play with:
- Speed of rotation of gears
- Direction of gear rotations
- Animating of lights (future post)
- Layering of multiple rotating gears in z-axis space
The gears are not animated in Maya using keyframes as we want to be able to change individual gears’ rotation speeds easily and flexibly. Thus, the gears are rotated using a script.
I wrote a script that lets me specify values (in degrees per second) to rotate the gear on a chosen axis, by modifying its transform values.
The script can easily be copied and applied to every gear, with each one rotating at selected user-input speeds that can be changed on the go. Below is a screenshot of the script written in Visual Studio (C#), with comments, for those interested.
To give illusion that gears are interlocked and rotation in sync with one another, we discovered this engineering trick:
Speed of Rotation is inversely proportional to its radius and number of teeth (sides).
Which means to say, if we halve the size (radius) of a gear, we have to halve the number of teeth and double its rotation speed.
Being a programmer helped discover this as I often use power of two values and this made me realise that as long as we ensure that our gears are modelled with exactly Power of Two number of sides – 8, 16, 32, 64, they are easily compatibility with one another.
Lastly, a test 3D particle system emits chinese symbols at the bottom right, which are tests for linking to the symbols on a compass we have yet to model.
The particles’ direction, positions and speeds are also yet to be confirmed. The initial plan is to have them float upward from the surface of the compass, which is different from what our current footage shows.
The particle system uses an emissive shader with a chinese symbol as texture, with its velocity generated by perlin noise to create a randomized movement.
Tutorials & References
Lastly, here are some additional materials referenced that aided in the process.