Christoph Lechler showed us the workflow behind the Flooded Medieval Town project, demonstrated the modeling steps for the assets, and explained why he chose Unreal Engine 5 for the scene.
Introduction
Hi, I am Christoph Lechler and I recently graduated from Think Tank Training Centre, where I studied 3D Environment Art for Games. Before that, I worked as a graphic and web designer with some 3D from time to time. I always liked games and movies and wanted to work in that field, but I really decided to switch to games after I took the CGMA course called Modular Environments with Clinton Crumpler. It was my first time using UE4 and it was just so cool to me that everything was in real time, instead of waiting for hours or days for a render.
The Flooded Medieval Town Project
This project was my final at Think Tank, so I knew I had only 14 weeks to finish this environment. At first, I thought that I did not want to do an outdoor scene again because I did that already twice during my time at Think Tank. But after I gathered over 100 concepts on Pinterest and ArtStation, I nailed it down to the concept from Wanxing Wang.
I really liked the mood of that image, so I decided to go for it, even though I thought it would be pretty tough for me because this concept has a lot of organic objects, which I found a bit harder to do at that time.
The Detailed Medieval Village from Astrofish Games really inspired me because of the way they assembled the scene and the buildings. It was their own kitbash kit, which I found really interesting and I wanted to try that in my project as well. So their work became my style and quality reference.
I started to gather references and put them all together into PureRef. This way I have a nice overview without having to open multiple folders of pictures. It is important to not only rely on 3D artwork for reference but also gather a lot of real-world pictures. Otherwise, you will maybe be looking at already simplified objects and textures.
Before starting the blockout in Maya, I thought about how I could handle the scene in the given time. I had a 14-week deadline, an inclusive demo reel, and an additional presentation. So I planned to have 11 weeks for working on the scene, 1 week for the presentation, and 2 weeks as a time buffer if something goes wrong. And there were a few things that were unexpected.
For the given time I thought the best workflow would be to create my own modular kitbash kit and then assemble the buildings in Unreal Engine 5. And for the hero props and small assets, I planned to use a high-to-low poly workflow with Maya, ZBrush, and Substance 3D Painter. Later on in the project that changed a bit because I did not have enough time to do a high-to-low poly bake for every small object. So as a solution, I created for some assets mid-/low-poly objects only and textured these in Substance 3D Painter directly.
I started planning the scene in Photoshop. Just simply opened the concept art in Photoshop and overpainted the things I needed to create starting with the large, modular assets for the buildings (walls, doors, roof, wooden beams, etc.) and then moving to the hero props and smaller props. The last thing was to think about smaller details like decals to break up the walls.
After I was done marking the assets, I also wrote down the tiling textures/materials I needed for the scene, which I created with Substance 3D Designer and Substance 3D Painter.
Using Trello to track my progress helped me to stay on time. It is a really easy project management tool, and I think it helps you to roughly organize your work.
After planning the scene, I moved into Maya for the initial blockout. Starting with large objects and moving to smaller assets helped me to stay focused on the overall scene and not to get lost in details early on.
I put the concept art in the background of my camera in Maya and tried to align an object as closely as possible to fit the perspective. Usually, I start with an object where I know the real-world scale. Here I started with the door. I knew it was roughly 210cm tall and 100cm wide. I rotated the camera and zoomed in and out until the door matched the painting.
After that, I created more and more simple cubs to fit the house objects.
After the building blockouts were done, I imported everything into UE5 to see if the scale felt right and made a good scene for the distances between objects. After some back and forth, I created simple shapes for the smaller assets and imported them as well.
Modeling
The scene was so big, I think I used every modeling workflow possible.
For the buildings:
I used a medium poly workflow with modular pieces and tiling textures. Creating modular pieces which are snapping to the grid is really important. So my wall pieces have sizes like 200x300c, 400x300cm, and 200x100cm. Each wall piece I created only once in Maya and imported it into Unreal Engine. There I could just duplicate it and apply different textures like my tiling plaster and brick wall material.
The wooden beams are also snapping to the grid. There are in total 4 different sizes of big beams in my scene (400cm, 300cm, 200cm, 100cm) and 2 or 3 thinner beams for smaller assets. To make them look different, I scaled and rotated them in UE. Scaling them a bit is okay, it is only important to check if you cannot see the stretched texture.
For the boat:
I used a different workflow. The boat is meant to be my hero prop in this scene, but it was too big to make a high-to-low poly bake with it. So I decided to do a full Nanite workflow for this asset.
I started the boat in Maya as a blockout and worked my way up until I had something I liked as a high poly subdivided mesh. I deleted one side of the boat and other parts, which I could later mirror or duplicate. After that, I imported everything to ZBrush and started sculpting the details. This was a long process, but using some wooden alphas helped speed up the work here. I decimated the mesh after I was done sculpting, but not as far as you would for a high-to-low poly work. Because I wanted to use a high poly Nanite object in my scene to try the new feature, I only decimated it a bit until I could still see the damaged details of the boat. Micro details are visible through the textures, and I did not care if I lost them during the decimation.
This was the main modeling and sculpting part of the boat. Now I imported the decimated sculpt in Maya and mirrored the planks from one side to the other and duplicated smaller objects around.
Then it was time to create the UVs, which took a lot of time. Unwrapping high poly sculpts in Maya is not fast. You need to do a lot of hand work. I had even some more work here because the boat is too big to fit everything into one UV tile. So I decided to use an RGB mask shader in UE. For that, I had to create two UV sets. One for Substance 3D Painter and the RGB mask and one for the tiling textures in UE.
In Substance 3D Painter, I baked the high poly sculpt to get my AO and Curvature map, which were my starting point for creating masks for the different materials (wood, moss, metal, dirt). On top of the baked maps, I added different tiling grunge maps to get variations and transitions in between masks. At the end, I also added hand-painting parts so you would not see that it is a procedural created mask/texture.
In UE, I set up a basic layered material and used the exported RGB mask from Substance 3D Painter to blend between my materials. On the Unreal Engine learning site, you can find a really good tutorial for layer blending in the engine, which helped me a lot here – Advanced Skill Sets for Environment Art by Clinton Crumpler.
The wagon:
It was created as a medium poly object with a hybrid/trim sheet texture and RGB mask shader. I created a trim sheet that contained wood, metal, and some baked assets like bolts and nuts with Substance 3D Painter and Substance 3D Designer.
I modeled a medium-poly wagon in Maya and used again two UV channels for unwrapping. One for the trim sheet and one for the RGB mask in Substance 3D Painter.
After that, I could use the same Layered Material with the RGB mask, which I already used for the boat. I only had to swap out the base material against the trim sheet.
The Barrel:
It was created as a high-to-low poly prop, with Maya, ZBrush, and Substance 3D Painter.
Props like billboards, fences, and wooden planks are created as medium/low poly objects but still textured in Substance 3D Painter to give them more quality as just simply using tiling textures. I created smart materials at the beginning to always use the same moss, dirt, and wood on each asset, which helped speed up the workflow and also gave me a consistent look between all assets.
Saving time with Megascans:
I did not have time to do everything, so I used some assets from Megascans but had to add extra work to make them fit my scene.
For example, the dead trees next to the buildings needed some additional texturing in Substance 3D Painter to add moss, dirt, and wetness. So I simply loaded the tree into Substance 3D Painter, baked my standard maps like AO and Curvature plus loaded the maps from Megascans. Then I started adding my Smart Materials, which I used before, to make it fit my scene.
Texturing
Texturing the assets was done via tiling textures/materials with Substance 3D Designer and Painter plus Layered Material shader in UE. Variations and breakups were added at the end with projection and mesh decals.
I had 6 main materials in this scene (wood, plaster, bricks, moss, metal, and dirt), which I used all over, just blended differently or added some more variation through different Grunge maps.
Wood, plaster, and bricks were created in Substance 3D Designer because this way I could quickly iterate the patterns if I did not like something. It is way faster to change the number of bricks in Substance 3D Designer than to lay out bricks in Maya and bake it and texture it again.
For the moss, metal, and dirt I used Substance 3D Painter because it already has a lot of different Grunge maps and when you blend them via layers and masks, you can change them procedurally and they are perfectly tiled. This can be a really fast way to create tiling textures if you do not have much height information.
Composition
The final scene was assembled on top of my final blockout. I created my buildings in Blueprints and then moved them to the position where they were in the blockout. The same goes for the props, I just dragged them into the editor and moved them into the position from the blockout. After that, I deleted the blockout and fine-adjusted the buildings and props. Then I started adding fog cards, which gave me more depth. The last part was my decals for the buildings. Adding dirt, moss, and damages helped to sell the scene way more.
After that, it was time to finalize my cameras in the scene and some final set dressing for the shots. Each item in the scene is hand placed, even the smaller broken wood pieces in the water. I think it gives you the best result even if it takes more time to scatter or paint method.
Lighting & Rendering
For this scene, I chose UE 5 because I wanted to use Lumen and Nanite in my workflow. Even there are not many Nanite-worthy objects (only the boat and brick walls).
It is really cool to work with Lumen because it gives nice bounce lights. But you still need to add extra lights as rim lights here and there if you want to highlight things.
My final lighting was done via the Ultra Dynamic Sky system. This is a really nice blueprint you can get on the UE Marketplace. It gives you way more control over the skylight, fog, especially clouds. I really needed to art direct my clouds, moon, and fog. And with this blueprint, you really can adjust every small detail you would like. This was not possible with the normal UE sky and clouds. It also comes with a weather system, where you can adjust the rain, lighting and so many more things.
The water in UE 5 is really easy to do. You can just activate the water plug-in, restart the engine and search for the water shader you would like. They have different shaders for a pool, river, ocean, etc. Adjusting these works like any other material instance. You have controls to change the watercolor, flow speed, direction, and more.
Conclusion
This project was truly a challenge from the beginning to the end. I did not know how to do layered material with RGB masks, I was not sure if I could handle the scope of the scene, and was not so comfortable with organic assets. But I also knew I could figure all of this out while I am working on it. I learned a lot with this scene and it really pushed my skills forward. At this point, I want to thank my mentor Kacper Niepokolczycki for all his help and art direction, it wouldn't be possible without him.
So as a piece of advice for other artists, I would like to say this: try to add one or two new things that you would like to learn to each scene, this way you can push yourself. And also, if it gets too complicated and you are starting to feel frustrated because things are not working out like they should, just work on another part of your scene, where you know what to do. After that, you still can come back to the complicated new things and try to fix them.