Philipp Neumann shared the workflow behind the Mouth of Sauron project, explained how the animation for the eye was created, and talked about setting up the flame effect.
My name is Philipp Neumann and I am currently working as a Lead 3D Artist at Rabcat Game Art, which is an AAA art outsourcing company based in the beautiful city of Vienna. The latest titles I worked on include Fortnite, Overwatch 1 and 2, and Forza Horizon 4 and 5. If you want to find out more about Rabcat or about other projects I worked on, you are more than welcome to visit my ArtStation page.
But enough about me, let’s jump straight into the pipeline I used to create this project.
The Mouth of Sauron Project
A couple of weeks ago, I started listening to the amazing audiobooks of The Lord of the Rings and it just stuck in my head that I want to create some sort of fanart from this universe. I quickly landed on the Eye of Sauron since it’s one of the most noticeable objects from The Lord of the Rings. Due to the fiery nature of this asset, I chose Unreal Engine as the tool of choice for the project.
Basically, the goal was to create an eye that can be animated, with a flexible pupil and effects that are not based on particle FX but materials.
Creating Unreal Material
Let's get into the nitty-gritty of the production of the asset. So, before I started with the actual creation of the asset, I was looking through ArtStation for concept art and 3D/VFX art of Sauron's Eye that was done by other artists to get a better feeling of what style I wanted to achieve. I chose to create the asset as a mixture of stylized shapes and realistic touches.
The very first step was to create a material that looks like a stylized fire burning from bottom to top.
For this, I started with a quite simple caustic map that is plugged into the Panner, so it runs from the bottom to the top. Basically, I used the same texture twice and multiplied it over each other to achieve more variety.
To break up this basic setup, I used a BumpMapOffset in the Coordinates of the two caustic maps. In the Height channel of the BumpMapOffset, I used a panning cloud texture to make the caustic maps move more randomly.
As you can see, this is breaking up the panning caustic maps fairly well.
Now that we have those two panning caustic maps, we can multiply them together. But before we do that, we are going to add a gradient from top to bottom on each caustic map so they are brighter at the bottom than on the top. By changing the speed in the Panners slightly, so they are not the same, we can achieve a more random look.
This setup is already the mask that we can use later in the LERP nodes to add color to the flames. We can also use this greyscale mask as an alpha for the opacity later.
The first color that we are going to add is the base color of the flames with a black background. For this, we will use a black (0,0,0) background color and an orange (0.29,0.01,0) foreground color. As the mask, we will use the flame alpha that we created earlier, but before plugging it into the LERP node, we will use the Power node to increase the white values.
Since the output of the Power node will be below 0 and above 1, we will need to clamp the values with a Clamp node back to 0-1. If we don't clamp the values, the colors will be factored by the value in the alpha of the LERP. We will use this effect later for adding the second color.
As a second step, we add another LERP node where the A value will be black, and the B value will be the result of the LERP beforehand. This time, for the alpha, we are going to use the same setup as before, but the second Power node will be increased to 4. It is important that we do NOT clamp the Power node afterward so we can use the values from the Power node as a multiplying factor in the color itself and create a glowing effect.
And this is already the basic flame effect.
Making the fire animatable
To make the emissive animatable, we will need to use a MaterialParameterCollection node that allows us to adjust the value of this node in the Sequencer later. We could just multiply this node with the outcome of our color that we did before but beforehand, we can multiply the MaterialParameterCollection with a gradient from top to bottom to ensure the fire is getting stronger at the bottom than on the top.
So this is the basic setup of the fire in Unreal Engine. To make sure it works fine, I would change the Blend Mode in the material to Translucent and the Lighting Mode to Surface Translucency Volume.
One more thing that we can add to give the whole piece a little more dynamic is to add distortion in the World Offset channel. This way we can manipulate the geometry of the object according to the fire effect. But since we cannot plug a BumpMapOffset node into the World Offset Channel, we need to copy the caustic effects and create the effect again but without BumpMapOffset. The reason that the lower half of the alpha is black is that I don’t want the mesh to move where it is very close to the eye mesh. This will ensure that we are not getting any intersections.
And here is another small compilation of the effect already applied to the outer mesh of the eye.
My idea was to create a small animation where the eye is looking around. While the eye is moving, the pupil should change its size a bit.
There are multiple ways to achieve that, but since I wanted to be able to manipulate the pupil in Unreal itself, I decided to create blend shapes in Maya and import them with the animation into UE. Since we are adjusting the brightness of the emissive in the Sequencer, Blend shapes are perfect because we can also adjust them in the Sequencer.
As you can see, on the geo of the eye, there are basically three separate meshes: one for the outside flame, one for the eye itself, and one for the black of the pupil. I created the UVs in a way that a top-to-bottom gradient is seen as a center to outside gradient on the 3D meshes.
Combing FX in Sequencer
The combination of animations and Blend shapes and the increase of emissiveness was all done in the Level Sequencer.
Since we created a MaterialParameterCollection beforehand in the fire material, we can now alter this parameter in the Sequencer.
To make the Blend shapes work, you need to make sure that you import the Skeleton Mesh with Morph Targets enabled and create a Blueprint that stores the Morph Target value in a Variable so you can alter the Variable later in the Sequencer.
This is the Sequencer after importing the camera, the skeleton meshes with animation, the morph targets, and the MaterialParameterCollection.
As you can see, I import the animations and with the Variables in the Blueprint, I can now access the Blend shapes and just keyframe them along the length of the animation. I did this with both the face and the eye. You can also see that there is the Fire Power that we defined beforehand in the material.
And here is the outcome of mixing animations and Morph targets together with the MaterialParameterCollection for the emissive.
Sculpting & Texturing
I used a very straightforward process for creating the Mouth of Sauron. The blockout was done in Maya. The base high poly of all the metal pieces was also done in Maya so I could make sure to avoid gaps and holes before going to ZBrush with it. In ZBrush, I tried to add edge wear and rough breakup on the metal pieces.
The cloth was made by creating a very rough shape in Maya, which I animated with the Dynamics system in ZBrush. I used the face and the metal pieces as colliders so the cloth would smoothly fall on those pieces and create a nice base for the sculpting pass that followed.
After the HP was done, I went back to Maya and created an LP, which is pretty dense in the mouth area, this allowed me to create nice blend shapes without getting visible poly edges in the final render. After the LP was done, I baked the Normal and AO maps in Marmoset Toolbag and went straight to Substance 3D Painter.
I used some smart materials from Substance 3D Painter itself to create the materials, which I altered later with some dirt and blood FX.
The base render setup was very minimal in Unreal Engine. I used a standard three-point light setup to get the basic lighting, and because my background is mostly black, I used some rim lights to emphasize the borders of the objects.
Since I only wanted to create nice shots and I was not worried about performance, I used CineCameraActors for the rendering and MovieRenderQueue to render out the final shots. What I like about the CineCameraActor is that you have a visible plane where the focal point in the scene is and that you can use real shutter, aperture, and focal length settings in your scene. The only post-production setting I used was a bloom effect, to make the eye stand out a bit more when the emissiveness is increased.
That’s basically everything you need to know to create a flame effect like this in Unreal. Thanks a lot for reading the article and I hope you gained insight into the process. If you have any questions or any other requests, don’t hesitate to reach out to me on ArtStation.
This content is brought to you by 80 Level in collaboration with Unreal Engine. We strive to highlight the best stories in the gamedev and art industries. You can read more Unreal Engine interviews with developers here.
You may find these articles interesting