A 3D Environment Artist Ana Marian Rivera has shared an extensive breakdown of the Thermal Baths scene, thoroughly explained the texturing process, and showed us how the scene was assembled in Unreal Engine.
Hi everyone, my name is Ana Marian Rivera, I am 25 years old and I live in Spain. I am currently a Game Environment student taking the Advanced term at Think Tank Training Centre (Online). Prior to Think Tank, I got a degree in Audiovisual Communication back in 2018 at Universitat Pompeu Fabra (Barcelona), where I discovered 3D modeling for the first time. I then took a 2-year course at CEV (Barcelona) in 3D modeling and game development, which taught me the basics of it.
I knew I wanted to work in video games after playing The Last Of Us. I was fascinated by the details and how beautiful the environments were, so I decided I wanted to have a part in creating art and hopefully inspire others someday.
The Thermal Baths Project
The Thermal Baths scene started as my final project for the Intermediate-Term at Think Tank Online. This assignment consisted of creating a small environment in Unreal Engine 4 during a period of 4-5 weeks. During the first 10 weeks of the term, we were introduced to modularity, creating tileable textures, setting up simple master materials, among other concepts. My goal for this project was to practice all these different techniques and learn more during the process.
The first step was, of course, finding the right concept and gathering all the references necessary to organize them in a job sheet.
I had recently re-watched The Grand Budapest Hotel (2014) by Wes Anderson and I thought it would be perfect for this project. Not only did it already have most of the storytelling components I needed to make the environment interesting, but it also had a pretty strong and unique cinematic mood, very characteristic of Anderson’s films.
I was also drawn to the idea that this scene was shot at the former bathing establishment of Freisebad in Görlitz, Germany. The building has been abandoned for a while and that shows even in the film, where you can clearly see the damaged plaster, the chipped wood paint, rusty metals, etc… There is something incredibly magical in this type of environment where the weathering and deterioration are present throughout the place and that is why I incorporated as much of it to my scene either with decals, vertex painting, or the textures themselves.
The references I gathered from the real-life location were essential to the making of this project for several reasons:
- A better understanding of the real dimensions of the building.
- Visualizing additional details, otherwise hard to perceive in the film
- Appreciating the materials with more clarity
A good recommendation when it comes to real locations is to look for a 360º view so it is easier to visualize what you’re trying to recreate.
Once I gathered all the initial references, I created a PureRef file to organize them into categories and define the list of props and modules I needed to create as well as establish the different materials and a general idea of how I would tackle them.
For this project, I used Maya as my modeling software. The first step I took was making sure my units were set up correctly in the Grid Options.
Setting the grid lines every 100 units and the subdivisions to 1 will mean that every square is 100 cm = 1 meter. This made it easier to control the dimensions of every module of my scene and have a correct scale inside Unreal.
For further scale reference, I imported a 180 cm human model to my scene, which I highly recommend doing because it is so easy to make mistakes in scale and then things start to look off. Having that visual reference will definitely help. I also like to keep a measuring tape next to me when I’m starting a project, so I can compare what a meter looks like in real life, and, most of the time I find it extremely helpful when I can’t understand the dimensions of a certain place or object. And, of course, Google is always your best friend!
I started by blocking out the different modules in my scene, always keeping my references in my second screen where I had established the size of most modules: walls, columns, ceiling, and the rest of the pieces.
First modeling/blockout pass:
After modeling the main modules and making sure they all snapped together seamlessly, I merged them and imported them into unreal to verify the dimensions were working in the engine as well. I realized my front walls were too wide in comparison to the reference and I was missing a module in between, so I made the necessary adjustments and continued on to blocking out the props and extra modular pieces for the backdrop.
Once the block out was finished, I polished my modules, added bevels where needed, and started modeling the props in my scene.
My asset workflow for this project was fairly straightforward. I started blocking out the main shapes for my props and then created a mid poly adding the right amount of bevels. I had no organic shapes so I didn’t use ZBrush for this particular project, as I already knew my next project would be ZBrush heavy and I wanted to focus on simple hard-surface props and adding all the necessary details through textures.
Modular kit and props result:
Modeling the Curtains
I used Marvelous Designer to create and simulate three different curtain sets as well as four different towels. The workflow was always the same:
- Create the planes and stitch the corresponding parts together, then simulate.
- Change the workspace from Simulator to UV editor and layout the UVs in the UDIMs.
- Export the curtains as high poly .obj or .fbx
- Increase the particle distance in the cloth options (in case it was lowered to have more tessellation for the simulation and high poly version)
- Flatten the cloth (Reset 2D arrangement option/button) to export as low poly .obj or .fbx (This will make it easier to retopologize later)
- Import the high poly and the flattened version. Retopologize the flattened version using the Quad Draw option in the Modeling Toolkit tab.
- Once Retopology is done, transfer the UV attributes from the flattened version to the retopologized one. (This can be found in the Mesh menu -> Transfer attributes)
- Now that the retopologized one has UVs, transfer vertex position attributes so that the retopologized version moves to the high poly position and acquires the shape (You might need to add SubDivisions to get a good result)
One of the goals for this project was to have as few unique textures as possible, so most props in my scene use tileable textures with some sort of adjustment (tinting, decals, etc.) to break up the repetitiveness. However, I did establish from the beginning which props would be textured separately, taking into account their size and their importance in the scene.
For example, I knew the bathtubs were my hero props so I textured 2 variations of them in Substance 3D Painter. For one of the variations, I created a mask (packed in the Alpha channel of my ROM+A Map (Roughness, Ambient Occlusion, Metallic + Alpha) to control vertex painting inside Unreal and be able to have a third version of a bathtub that matched my reference.
Bathtub with mask for vertex painting:
Mask (Alpha Channel):
For tinting and vertex color painting of the bathtub and other assets, I created a very simple Master Material:
Since this was my first time working with tileable textures and I have a special interest in material creation, I decided to focus on using Substance Designer as my primary texturing software. I created most of the tiling textures and decals in this software, with the exception of unique textures and some other tileables like brass and iron (for which I used Substance 3D Painter).
Towel Material Example:
I started by creating the cloth noise using the mesh 2 pattern, which I tiled using Safe Transform Grayscale. This was used as a background height in the Shape Splatter node. The two shapes below were my pattern 1 and pattern 2. The result of this node is the grayscale value seen in the image. After that, I created different patterns for the 3 variations of towels (in this case the squared one). Like all my other materials, I exported the base color, normal, and a packed map (Roughness, AO, Metallic, and an Alpha mask with the square pattern to tint its color in Unreal).
Floor Tiles Example:
First, I generated an octagon with the Polygon 1 tool, which I then transformed and beveled. I used the tile sampler for the original pattern and another one for an inverted version, which I blended together using an Add (linear dodge) to achieve the tile pattern. I warped and blended some grunges to create the floor stains and the small cracks.
For the base color, I used Flood Fill to have a bit of color variation in the tiles. By using the Flood Fill to Grayscale I could control where the variation was being applied and how much contrast I wanted. Then I blended the result with another Gradient Map which contained the rest of the color information.
For my tileable modules, I used a 10.24 texel density and 2K texture. This is how I set up my UVs for different modules:
1.5 x 3-meter wall modules:
4 x 4-meter floor modules:
Arch set UVs (Ceiling 1.5 x 2 meters):
Assembling the Scene
Before assembling my scene, I made sure to position the pivot in the right places and move each module/prop to the center of the grid before exporting. I also named them using the prefix SM_ (the module’s name)_1a, and imported them into their corresponding folders, in order to have an organized project.
I first assembled the modular kits (walls, ceiling, arches, etc..) in a blueprint actor to have all the different modules ”merged” in the actual scene. With the modules assembled, I could then move on to placing the props and making changes as I progressed.
NB: Always apply the materials to the prefabs in the content folder so that they already have the textures before placing them in the scene.
The fact that my scene was based on a film, made it easier to have storytelling elements all over which I just recreated as much as possible to keep the identity of the scene. For example, the scene would not be the same without the black and white posters on the walls, so I did my best to include them and also add extra details on them.
Another way of adding more life to the scene was through decals and vertex painting. I wanted to achieve the old and deteriorated look appreciated in the film, so it was important to make sure the walls and props reflected that through the textures. Towards the final weeks, I focused on creating my own decals, such as rust, dirt, peeled plaster, and so on. I used Photoshop to design some decals (mainly texts for the posters) and Substance 3D Designer for more details and generating the final outputs.
Example of a poster decal:
To blend different materials together using vertex painting, I created a master material that used the Height Lerp node with a height contrast set to 0.5:
Material Instance for arch vertex painting example:
Glass and Water Shaders
I created a very simple glass master material and then instanced it for different props in my scene. I used the following tutorial as a guide:
For the water in the bathtub, I downloaded the free Water Plane project in Epic Games Marketplace, which has some useful shaders and textures. I created some instances of the Lake shader and tweaked the parameters to achieve the look I wanted for each bathtub.
In order to get an accurate reflection, I enabled the Planar Reflection, which is turned off by default. You can find it inside the project settings by typing "planar" in the search box:
Lastly, I would like to mention that I created particles to give a more atmospheric feel to the scene. On one hand, I generated larger particles to simulate the steam that would emerge from hot water, and, on the other hand, I added some dust particles floating around. I created both using the particle system in Unreal.
Lighting was definitely the most challenging part of the whole project. My reference has both exterior light coming through the arches and interior lighting from the ceiling lamps.
Throughout the project, I worked with a basic lighting setup, which consisted of my Sky Light, Directional Light, some Dynamic Point Lights, and a post-process volume to control the exposure (min and max brightness set to 1) and the Ambient Occlusion (I used a 0,75 intensity for a radius of 100).
When it came to the actual lighting in week 4-5, I added a lightmass importance volume to my scene and lightmass portals in the openings of every column arch. This should tell Unreal where the light rays should be prioritized and have more quality.
In order to achieve the appearance of my scene, I set my skylight intensity scale to 0,2 and gave the directional light intensity of 10 and a warmer color temperature of 4400. Here are some of the settings I changed:
For my interior lightings, I used mostly Spotlights set to static for the main lights (ceiling lamps) and dynamic point lights for some ambient lighting where I saw fit.
It’s worth noting that inside World Settings, I decreased the static lighting level scale to 0.8, this increases the quality of the lighting but will also increase the build times, so use it carefully.
Some detail lighting shots:
To finalize my scene, I added a bloom effect, some subtle lens flare, as well as a Vignette effect for the edges of the camera, and some grain jitter to imitate the noise seen in the scene from the movie. I also applied a dirt mask texture to add another level of detail with a smudge/dirty effect on the lens when the light hits the camera.
I was quite happy with the result I achieved with the lighting in the end, so for color grading, I only played with the gain in the shadows and mid-tones and added slope and toe for a more cinematic look:
I wanted to be as accurate as possible with my camera settings so I did a quick google search on the type of camera and lens used in the film and used that information to set most of my cameras to 35 mm VistaVision and universal zoom or custom lens settings depending on the shot. For my final renders, I set the screen percentage to 200% and took high-resolution screenshots with a screenshot size multiplier set to 3. You can do this in the viewport drop-down menu next to perspective.
Finally, I created a Sequencer with 10 cameras to create 10 different shots for the cinematic. I exported it as a .avi, 60 FPS, and 1920x1080 resolution, which I then edited in Premiere Pro and added the soundtrack.
I finished this project in 5 weeks. The last week was all about adding more details and especially getting the lighting and mood right, which proved to be challenging. This was my first ever real-time environment in Unreal Engine and even though I am still learning, I’m quite happy with the result I achieved. It was definitely challenging to always keep 100% focused and some weeks were harder than others but I tried to push myself as much as I could. One particular aspect I struggled with was creating master materials and understanding texel density. Some concepts were completely new to me and this project was a good practice to get the basics of it, but I definitely would like to focus on achieving more complex results in my upcoming project. I would like to thank Think Tank and its community of awesome artists and people, as well as my supervisor, Sergei Panin.
One piece of advice I would like to give other artists and myself is to take breaks to avoid burnout and stretch out from time to time. Taking small breaks is also good to get back to work with more ideas and a clear mind. Another piece of advice I once heard: Frustration means you’re learning something new. Art takes time to master, so don’t compare yourself to more experienced artists and keep practicing!
Huge thanks to 80 Level for taking an interest in my project and I hope this will be of interest to anyone who is reading.
You may find these articles interesting