Thanks for sharing and detailed production breakdown
i thought there wouldnt be anything better than akeytsu for creating easy animations. im happy if i am proven wrong.
Keith, I just wanted to stop by and say: Thank you.
Jonathan Holmes showed how he approached the production of his ‘Substation’ project, which was created with some Megascans assets.
Hey there! My name is Jonathan Holmes. I’ve been a 3D artist since 2002. I work for Quixel, performing community management, product support, and showrunning development and features for Quixel Suite. My primary role at Quixel is support, which encompasses community management as well. I’m very active in the Quixel Tools Group – either posting personal work I do in my downtime or observing what others are up to as they work with the tools we develop. This entire project was done during my downtime. In this breakdown, I’ll detail how I created this scene and how you can achieve the same effects yourself!
This, like all of my projects, is meant to showcase the power of Quixel Megascans in real-time applications. Unreal is always a natural choice for this, so I developed everything using the engine. I have a collection of materials and functions that I use for each project to simplify scene and asset creation, which I’ll share later in the breakdown.
Substation Component Breakdown
This is a project I originally developed in college during my Advanced Level Design class in 2009. Developed for UDK, it started off very blocky – more like a level blockout rather than a detailed piece. The main elements are present in the blockout modeling, but are very loose – I definitely didn’t look closely at the reference photos I took. That’s lesson #1 – always pay very close attention to references. When recreating realistic objects, especially objects as intricate as electrical facilities, even a slight deviation from references will look wrong.
You can contrast the blockout modeling to my reference photos to see the obvious differences in detail and proportions. Everyone has seen something like this in their life, so we subconsciously know how these objects should generally look. This station is but one of many millions that exist across the world, but fun fact: this specific station was built to handle power distribution to Walt Disney World in Orlando! If you’ve noticed a trend with anything I make so far, it would be that I tend to model and create what I know. I try to work on projects that are local, which makes it easy for me to get references to follow and work from.
I primarily designed the final look of this to be much like I had imagined it in college: an Unreal Tournament deathmatch where pools of orange light would hold items and other goodies to fight over, but with just enough ambient light in the area for people to hide and fight in the shadows. If you wanted better weapons, you needed to go into the light – but this exposes you to being attacked. It evolved, a bit, into a more dramatic ambiance that I really liked.
This project uses my custom material functions to power everything you see. I worked from a master material and split it off into various material instances which have parameterized switches and other tools to change the material on the fly for the vast majority of the scene. It’s highly customizable and requires fewer master materials, reducing my material overhead by quite a lot.
You can download this function from my website. Simply add it to your Unreal project and drag/drop directly into your master material to have an easy setup with tons of customization variables for material instances, including an effective control over IOR (specular) by using your albedo map. This function also allows you to invert the albedo used for IOR at the press of a switch, making it functional with albedo maps that are predominantly white – or if you simply want to invert the effect.
This was used to create vertex painted rust blends controlled by a Photoshop cloud mask, which itself was also parameterized via my usual “Levels/Strength” nodes (as seen in the function) to have near total control over distribution and spread of the rust depending on where I painted it.
Otherwise, the material function itself powered the master materials in the scene and allowed me to have total control over the end result. Material instancing is one of the most powerful tools for artists in Unreal – take advantage of it!
I spent a significant amount of time (a few months, on and off) creating the geometry for the station. Lots of detail went into everything, including components and pieces that simply could not be seen at the end. I got a bit too detail-oriented and included welded mesh decals in places where welding would never realistically be seen in the final product, given the lighting conditions and camera angles I chose. I did this specifically because if I wanted to change any camera angles later, I wouldn’t need to go back to the geo and rework any of it to include higher fidelity details that I skipped trying to save time.
I use Megascans assets for everything I can. This project featured a lot of different scans. The terrain uses the same set of textures I used in my Florida Ethanol Train project. I also added a lot of custom foliage using the new pine and oak atlases in concert with SpeedTree for rapid prototyping and quick variation generation.
I also used Megascans to create a quick tileable painted cinderblock material out of the asset you see above. This was done by using Content Aware healing/selections on the normal map after tiling it into a 4k material, then processing it through DDO without using an input mesh. The AO/displacement that I generated from NDO converting the normals were then used for the masks that gave the cinderblock different grout and a thick layer of semigloss paint, along with bringing the grout closer to the surface of the cinderblock. This texture was used on the control room and added a lot of depth to it.
I made heavy use of atmospheric fog and volumetric fog to make this scene come to life. The primary light sources are the four streetlamps affixed to the substation’s A-frames. It was a huge struggle to get good looking shadows out of the engine with the setup I used, as everything was lit dynamically and with that comes some obvious limitations in the engine. Be forewarned if you work at a real-world scale like I did – small components will not shadow correctly, and trying to compensate by reducing shadow bias will introduce artifacts to the scene.
This is one of the instrument transformer stacks with shadow bias set to 0.09 in both images. The shadows are a bit rough up-close, but they blur out well enough from the distances I shot the scene. I’m also using contact shadows to fix the gap that appears, which would normally be done with more shadow bias – but this is the result of just using 0.02 as a shadow bias value.
This is clearly unacceptable, so some compromises had to be made. Unreal definitely has a few snags with dynamic spotlight shadows on very complex scenes like this. I managed to use my contact shadow/shadow bias workaround to avoid the vast majority of it, but it was certainly a challenge to find the right values. I had my fingers crossed throughout this – to say it was stressful is an understatement. It can be very frustrating fighting the engine in these narrow use-cases that it wasn’t designed to work with!
As always: the most critical part of this project was the camera work. Even the best modeling and texturing will fall flat without composition. All of the cinematic cameras in this project used the Olympus Micro 4/3s System as their Filmback setting, meaning all images rendered by these cameras are using a 4:3 aspect ratio with a doubled crop factor.
17.5mm lenses in M4/3 are 35mm equivalent lenses, so if you’re shooting M4/3 in Unreal you’ll need to remember to double any focal length settings to get the 35mm full-frame equivalent. I shoot Olympus as an amateur photographer. I find it significantly easier to compose shots in the engine because the viewfinder in Unreal is exactly what I see in my E-M10II camera, so it feels very natural to me to work in the M4/3 format.
This image I shot in 2003 inspired me to work on the project. I love the atmosphere and moodiness of this particular photo, and I wanted to recreate it in Unreal if possible. I think I succeeded!
I’ve included the camera settings for my shots for consideration – you can see how each variable has a drastic effect on the final product.
Some shots required adjusting the Slope and Toe higher or lower depending on the amount of highlight and shadow I wanted in that particular shot. When I wanted more precise control, I’d switch to the Global color grading and adjust Contrast, Gamma, Gain, and Offset. A little bit of these controls go a long way – it’s very easy to push something too far. Check against the reference you’re using before you commit to the values.
I used a custom LUT to create a Matrix-like color scheme – everything is toned a bit toward green in the shadows.
Here’s how it looked from beginning to end, chronologically sorted.
And of course, the finished results!
I got to know this place very well. In some ways I’m sad to see it go – it marks the progression of roughly seven months of time. Of those seven months, probably a month altogether was spent on the assets you see here and all of the composition. I can confidently say that I’m looking forward to my next project. I hope it’ll have a big impact!