Forest Witch

thumb_02
27-1

Yulia Golovko

Chatacter Artist

Introduction

Hi! My name is Yulia Golovko, I’m a 3D artist from Belarus, currently living and working in Poland. I've been working in game development for five years.

I specialize in stylized art and have tried different pipelines, but eventually discovered that hand-painted textures are what I enjoy the most.

That’s why my latest project is done in this style. I put a lot of effort into the fine details and texture painting.

Project

3D started as just a fun hobby for me, and later it turned into my job. I still really enjoy working on personal projects in my free time.

This past year, I’ve been streaming the whole process on my Twitch channel, so if you liked this project, you can usually catch me working on stuff like this live there!

28-scaled
29-scaled

Inspiration

The concept “Witch Forest – Medea” by the talented artist SHY became the foundation and main source of inspiration for the new project.

This concept instantly caught my attention, and I saw a great opportunity to practice and grow my skills through it.

1-1

Software

  • Blender
  • ZBrush
  • Marmoset Toolbag
  • Substance 3D Painter
  • 3D Coat
  • Photoshop

References

I often use works by other artists with a similar style as references. You can also see some inspiration from “Arcane” and the Riot Games cinematic “Welcome to Noxus”.

I’m particularly drawn to small, intricate details, like highlights, dirt, and other subtle elements that invite closer inspection.

That’s the level of detail I aim to achieve in my own work.

2

Additionally, material reference guides for artists have been very helpful in understanding how light interacts with different surfaces, especially since my project will use only a Base Color.

Sculpting

Since all the detailing will be done through textures, my main focus in the high-poly model is to accurately capture the shapes and curves.

As for the meshes themselves, all clothing elements and props were initially created in Blender, as I find it more convenient for modeling.

In ZBrush, I only add some folds, fine details, and adjust the proportions.

3

Here are some examples of props I made in Blender. I focused on keeping the shapes clean and the mesh made of evenly spaced quads.

To transfer the meshes into ZBrush, I assign creases to the edges that need to stay sharp using the ZModeler brush (Edge → Crease), and then apply subdivision levels.

4

The hair was created in Blender using Curves. A short walkthrough is shown in the image below.

What I like about this method is that it gives me full control over both the polycount and the shape, which I can easily adjust at any time by simply editing the curve points.

The polycount is controlled in the Curve settings under Shape → Resolution Preview U.

By the way, I used the same curve-based method to create certain clothing elements as well, such as bandages and ribbons.

5-1

The final high-poly is finished. All main shapes and details are in place and ready for baking.

6-1
7-1

Low-poly

Now that the high-poly model is complete, it’s time to move on to the next stage — retopology.

Before starting the retopology process, the high-poly mesh needs to be optimized by reducing its polygon count. This step helps avoid performance issues, especially when working in Blender. I use the Decimation Master plugin in ZBrush to simplify the model:

  • Open the Decimation Master plugin.
  • Click Pre-process Current to prepare the mesh.
  • Choose the desired decimation percentage (e.g., 20%) and click Decimate Current.

For example, a head sculpt originally consisting of 3 million polygons can be reduced to around 10,000 triangles. This makes it much easier to work with in Blender without significant lag.

8

Once the decimated model is ready, I export it from ZBrush and import it into Blender. I then perform retopology using the RetopoFlow plugin: a powerful toolset designed specifically for this purpose.

By the way, for some parts of the character that were originally modeled in Blender using Subdivision Surface, I don’t always retopologize them manually.

Instead, I can simply clean up unnecessary edges and optimize the topology directly. This saves time and keeps the workflow efficient.

9-1

UVs

As for the texture sets, since this model is being created for a personal project and one of my main goals is to produce high-quality, detailed textures, I didn’t hold back on space; I decided to split the model into 7 separate texture sets.

This approach allows for better resolution and finer detail in each part of the character.

10-1

During the UV unwrapping process, I used several helpful tools that significantly simplified and sped up the workflow. In particular:
Mio3 Add-on.

A very convenient tool that offers advanced functionality for UV unwrapping. It allows for easy creation and adjustment of seams, management of UV islands, and optimization of the unwrap.

Mio3 is especially effective for complex models, helping to achieve clean and precise UV layouts with minimal effort.

Tools for Aligning UV Islands:

  • Gridify. This tool aligns the vertices of UV islands to a grid, giving them a more structured, “grid-like” appearance.It is particularly useful for objects with strict geometry, such as panels, boxes, or architectural elements. Gridify helps eliminate distortions and makes the texture mapping more precise and predictable.
  • Rectify. Transforms UV islands into a rectangular shape, which is especially useful for objects with clean, linear topology. This simplifies working with tileable textures and helps reduce stretching or texture deformation.
11

As a result, the model was divided into 7 texture sets, allowing for efficient organization of materials and optimal texture resolution.

The final model consists of 110,489 triangles in total, including all elements.

Without the hair geometry, the model contains 34,271 triangles, which reflects the optimized base mesh.

12-scaled

Texturing

Before starting the texturing process, I baked all the necessary maps in Marmoset Toolbag, including:

Normal, Normal Object, Ambient Occlusion (AO), Material ID (MatID), Curvature, Thickness and Position.

Then, I imported them all into Substance Painter.

13

Even though I only needed the Base Color map in the end, the other maps were very important. They help different generators and filters work correctly by providing extra information about the model.

I used a few key generators to create a base layer of color that I could paint over later:

  • Ambient Occlusion Generator adds shadows in small cracks and corners. It helps make the texture feel more 3D and realistic.
  • Position Generator uses the position map to create gradients based on the object’s space (like top-to-bottom). It’s great for effects like dust, dirt, or faded colors.
  • Light Generator simulates basic lighting and helps show how light might hit the object in a real scene. It’s especially useful when doing hand-painted textures.

With these tools, I created a basic color map and blocked out the main color areas. After that, I exported the texture to 3D-Coat to continue detailed hand-painting and finish the texturing.

This is the result I got in Substance Painter. I usually prefer to keep things soft at this stage without strong contrast or sharp curvature effects because it makes overpainting easier later on.

The most important thing for me is to clearly see where each material is placed and to have a rough idea of the shadow and light areas.

14

After I finished the base color in Substance Painter, I moved the model and texture into 3D-Coat to continue painting everything by hand.

As I mentioned earlier, most of my references came from “Arcane” and the “Welcome to Noxus” trailer, so I paid a lot of attention to small details and the overall stylized look.

I usually start texturing from the face and then slowly move downward. I really enjoy adding highlights, brushstrokes, and little texture touches; it makes the model feel more alive and expressive.

A few useful tips that help me:

  • Don’t just darken the color for shadows, shift the hue too. For example, shadows can be slightly cooler or warmer. It adds depth and makes the texture more dynamic.
  • I always keep in mind that the light source is coming from the front and above, which helps me place shadows and highlights correctly.
  • The process is very similar to 2D painting: I start by blocking in large color shapes, and only thendo  I move on to smaller details. This helps avoid getting stuck on tiny parts too early.
  • Don’t be afraid to mix colors directly on the model. It keeps the texture looking painterly and organic, especially in a hand-painted style. Just be careful not to overblend, or the result can get muddy. If that happens, I just repaint the area with a cleaner color.
  • One super helpful feature in 3D-Coat is the ability to send the texture to Photoshop, make adjustments using masks or brushes, and then send it right back. It’s great for fine-tuning details.
  • Also, I noticed that picking colors with the eyedropper isn’t always accurate, especially when colors are blending together on the surface. So I usually sample a color and then manually tweak the hue or brightness a bit to get what I need.
  • Another helpful trick from 2D art is to occasionally switch your texture to black and white. This lets you check the value contrast, how light or dark different areas are, without getting distracted by the colors.Good value separation helps guide the viewer’s eye and makes the forms on your model more readable, especially from a distance or in low lighting. Below are high-resolution renders to get a closer look at the textures.
15
16
17
18
19
20
21-1

Special attention was given to the hair. All hair strands were straightened and laid out as rectangular shapes in the UV map, with each strand oriented in the same direction.

This was done deliberately to prepare the model for further texture work in 3DCoat.

The base color of the hair was applied following the same principle I described earlier in Substance Painter.

To simulate the natural structure of hair, I added an additional layer with an anisotropic noise texture applied on top. This texture generates thin, directional streaks that mimic the appearance of individual hair strands.

I manually adjusted the noise parameters to achieve a more natural and slightly chaotic line distribution, avoiding an overly uniform or synthetic look.

Using blending modes (such as Overlay or Multiply) allowed me to preserve the base color while adding depth and texture to the surface.

Since the hair is black, I slightly brightened the example to make the details more visible:

22-1-scaled

With this base prepared, I move into 3DCoat, where all that’s left is to soften certain areas of the lines and paint in the highlights to bring the hair to life.

23-1

Animation

The rig I created was fairly simple, nothing too fancy. I didn’t include any IK chains, as I wasn’t planning to animate walking or similar motions that would require them.

The only constraint I used was Damped Track, which I applied to the ribbon bones and hair bones.

This allowed for smooth, simulation-like motion without the need to animate those bones manually.

24

The main challenge arose during export to Marmoset, as constraints like Damped Track need to be baked into the animation.

A standard Bake Action wasn’t sufficient, because Damped Track responds to even slight movements of the hip bone, causing the animation to start with a noticeable jump.

To solve this:

  1. Looped the animation several times.
  2. Baked the entire sequence with constraints applied.
  3. Cut out a clean loop from the middle — a segment where the bones had naturally settled into a smooth motion.

This way, I achieved a fluid, believable secondary motion without having to keyframe everything manually.

Rendering

For rendering, I chose Marmoset Toolbag because it’s very easy to use and produces great results without a complicated setup. Since the project was done in a hand-painted style, I didn’t use any advanced lighting or shader settings.

The only important setting I’d highlight is the material mode, which should be set to Unlit. This makes sure that the model doesn’t react to lighting and displays only the painted texture exactly as it is.

As for color correction, this is more of a personal choice. Some artists like to push contrast or tweak hues, but since my goal was to hand-paint all the colors and shading myself, I didn’t find any need to adjust them post-render.

However, there are a few useful post-processing options in Marmoset that can enhance the final image without affecting the actual texture:

  • Clarity boosts midtone contrast, making details more defined and the texture look a bit sharper.
  • Sharpen increases edge definition and makes brush strokes or fine detail more visible.
  • Bloom adds a soft glow to bright areas, which can give the image a nice cinematic or stylized feel.
  • Vignette darkens the corners of the image slightly to draw more focus toward the center.
  • Grain adds a subtle film-like noise that can soften digital sharpness and make the image feel less “clean” or sterile.

These effects are mostly for presentation purposes and don’t change the texture itself, but they can help make the final renders look more polished and visually appealing.

25-1-scaled

For the background, I didn’t want to use just a flat color — I wanted to add a bit of depth and mood using a gradient.

To create it, I made a simple gradient image in Photoshop, which you can see in the screenshot below. I slightly curved and adjusted it, then loaded it into Marmoset as an HDRI sky image.

Since skies in Marmoset are wrapped around the scene like a sphere, the gradient also gets stretched. That’s why the gradient in Photoshop looks very narrow; it has to be compressed horizontally to appear correctly when wrapped.

A good trick here is to check the typical resolution and aspect ratio for HDRIs in Marmoset (usually very wide), and create your gradient to match that from the start.

This way, it will appear more balanced when rendered.

26-1

To add particles to the scene, I created two planes and positioned them as shown in the screenshot below. I applied a material that uses a radial gradient texture with a transparent background.

I used this same texture in both the Emission and Transparency slots. This makes the particles glow softly while keeping the edges smooth and invisible.

In the Emission settings, you can also change the color, which is really useful. Instead of creating multiple textures, you can adjust the color directly in the material.

You can also increase or decrease the emission intensity to make the particles look brighter or softer, depending on the mood you want.

27

With all of that set up, I finalized the scene and prepared the final renders using these settings.

You can see the results in the screenshots below.

28-scaled
29-scaled

Conclusion

I really enjoyed working on this project. Hand-painted style is something I genuinely love, and it brings me a lot of joy. Throughout the process, I was also watching a lot of painting-focused tutorials and studying traditional art techniques, so I truly felt like I was growing and improving as I worked.

I’d love to continue exploring this style in my future projects and hope to bring even more personality and creativity into my work.

Thank you so much for your time and attention while going through this breakdown! I hope it was helpful or inspiring in some way for your own projects.

Feel free to reach out on my socials if you have any questions or just want to chat!

Artstation: https://www.artstation.com/yuliya__x
Twitch: https://www.twitch.tv/uliya_x
Instagram: https://www.instagram.com/yuliya__x/
LinkedIn: https://www.linkedin.com/in/uliyax/