Paying Tribute to Swedish Nature With a Detailed Witch's Hut Scene
Lena Danilova walked us through the workflow behind the Witch's Hut project, detailing how she made the nature and how she used SpeedTree to add color variation and assign weights to the needle materials to get a more natural look in the branches.
Introduction
Hey, my name is Lena. I'm an Environment Artist who has been working in the industry since 2020. My journey into 3D art began out of a desire for creative self-expression, which eventually led me to 3D environment art. I'm trying to constantly develop my skills through personal projects and professional experience. I've contributed to several titles, including World War Z and Escape from Tarkov.
The idea for this project appeared when I was browsing Pinterest for inspiration, and I stumbled upon an AI-generated image that perfectly captured what I had in mind.
I got tired of bright, sunlit, yellow-ish Unreal Engine environments and wanted to create something gloomy and more atmospheric. Having recently moved to Sweden, I was also deeply inspired by its misty forests and wanted to pay tribute to Swedish nature.
So, first of all, I broke down the reference image into individual elements and identified the assets I would need to create. Then I gathered a variety of (mostly) real-world references for each one: from old wooden cabins, churches, and buildings to forest textures and lighting. I also made a simple blockout in Unreal Engine.
Witch's Hut
For this scene, I used a mid-poly/Nanite approach for everything except the foliage. The foliage isn't Nanite-based. In a real production setting in Unreal Engine, though, you'd typically commit to either a fully Nanite or non-Nanite workflow for optimization purposes. However, since this was a personal project, I allowed myself some flexibility.
My main reasoning was to skip the hassle of baking Normal Maps while still maintaining good visual quality. As for the foliage, I chose to keep it in a more traditional setup rather than relying on an Unreal-specific pipeline. I decided not to make the hut modular to save time, as my goal wasn't to build an entire village of these. I still divided it into several blocks to bake RGB masks.
Some of these blocks shared the same material for optimization purposes. The main tileable material was assigned to the first UV channel, while the second UV channel was used for the mask. I assembled the hut in Blender and exported it into Unreal Engine as a single mesh.
In Unreal, I selected the second UV channel within a material instance and used that mask data to introduce variation across the tileable materials. Specifically, the R channel controlled Ambient Occlusion, G handled curvature, B was used for dirt, leaks, or moss, and the Alpha channel stored additional data if needed. I also utilized material layers to add moss on top.
The Vegetation
The sculps for dead oaks are pretty quick and not highly detailed. First, I built the base forms in Blender using curves, then applied subdivision and displacement modifiers. After that, I refined the shapes in ZBrush and decimated the meshes.
I didn't bake any masks this time and just added moss as a second material layer that appears only on upward-facing surfaces, based on the mesh's direction.
Here is the master material layer:
I also added the option to plug in custom AO, Roughness, Metalness, Height Map, Specular, and Emissive textures in addition to or instead of the channel-packed texture. This can be useful for quick testing or if you want to add more details, and four channels aren't enough, though in most cases it's excessive, and I wouldn't use it in a real production pipeline.
Let's talk about foliage. My workflow usually follows the order: leaf → branch → tree. For spruces, for example, I first created a single needle, added some Color, Roughness, and other basic properties, then baked it onto a plane.
Baking isn't strictly necessary, you can always just paint the normals instead. Then I imported the needle textures into SpeedTree, cut out the needle, and assembled branches to bake into an atlas.
I also introduced some color variation and assigned weights to the needle materials to achieve a more natural look, so that lighter needles appear closer to the tips of the branches, while brownish hues are concentrated near the bases. For the bark, I used textures from Quixel Megascans. I also added displacement to the branches and included lumps to enhance visual fidelity.
After I baked the atlas, I imported the textures back into SpeedTree, cut out branches, and assembled the spruces. For the fern, I first sculpted a set of leaves and used them to assemble fronds in Blender. I also baked the sculpted leaves onto a plane to create an atlas for the wilted frond.
Then I made wilted fronds in SpeedTree. I didn't assemble the main fronds in SpeedTree because it handles wide-based leaves very poorly, as you can see. Then I baked all the fronds on a plane for an atlas and then textured it in Substance 3D Painter. Finally, I imported the finished atlas into SpeedTree and assembled the actual ferns.
Moss, heather, and cowberry were created in a way similar to the spruces, but this time I assembled the atlas in Blender and assigned Color IDs for masking in Substance 3D Designer. Then I baked and textured the atlas directly in Substance 3D Designer.
The flowers for the heather were created in Blender. Then I assembled the twigs in SpeedTree and exported them back to Blender to arrange the atlas and bake it. After that, I added additional texturing in Substance 3D Designer.
The lichen was created using Geometry Nodes in Blender, then baked and textured in Substance 3D Designer. I assembled the lichen clusters in Blender as well. Finally, in Unreal Engine, I added vertex animation using the red channel.
Textures
The moss graph may look a bit complex, but it's actually quite straightforward to build. For this material, I started by creating several types of leaves (I believe in biology they are called phyllids).
Using the Tile Sampler Grayscale node, I then created several frond variations based on those leaves. With another Tile Sampler Grayscale pass, I generated a few clusters from the fronds I had just made.
Next, using one of the leaves from the first step and a Tile Sampler, I created a moss "carpet." To introduce variation and directional flow to the moss, I adjusted the Size, Rotation, and Color parameters in the Tile Sampler node. I also made a few more sparsely distributed "moss details" using the previously created clusters.
I combined all of these elements with a Height Blend node. After that, I created a pattern of needles and blended it with the moss using another Height Blend node.
I added bumps, dirt, and tree leaves, then combined everything. Then I added some sphagnum moss and clover leaves. Once the Height Map was complete, I refined it and got the Normal Map and AO.
Finally, I built up the color layer by layer and created the Roughness Map. In Unreal Engine, I fine-tuned the textures to better match the lighting of the scene.
For rock material, I recommend this tutorial by Javier Perez. I also used some techniques from there:
For the log cuts, I photographed real logs in a backyard, extracted the Normal Maps and AO, generated Roughness Maps, and blended them into the wood texture I had created in SD.
Composition and Design
As I mentioned earlier, I started with a reference image, then created a simple blockout and established the camera angle. I chose to work in iterations, so the composition didn't look right from the start, but I trusted the process. With the hut, I avoided committing to complex shapes too early, which meant it evolved.
The same happened with the bridge: initially, I planned to place it far in the background, so I made it modular and fairly simple. Later, when I decided to move it closer to the foreground, I had to rework it quite a bit. I also initially considered making the scene snowy, but ultimately decided against it.
As for lighting, there are no special tricks or complex post-processing settings in this scene. I simply used an HDRI backdrop, adjusted the exposure accordingly, and then I tweaked shadow gamma and contrast to my liking.
Conclusion
This project took me quite a while, as I was working on it alongside my freelance job, moving between countries, attending a language course, and dealing with the current state of the game industry. The most challenging aspects were getting the composition right and achieving an interesting overall look.
Looking back, if I were to change anything, I'd spend more time on the blockout phase and avoid jumping into iterative detailing too soon. I would also dedicate more time to the wood materials and rock sculpts. But I'll keep it for the next time.