logo80lv
Articlesclick_arrow
Research
Talentsclick_arrow
Events
Workshops
Aboutclick_arrow
profile_loginLogIn

Creating Bold Elf Warrior Using Unreal Engine 5 & ZBrush

Safwen Laabidi shared the workflow behind the Elf Commander project, discussing in detail approaching skin details and setting up the character's eyes, hair, clothes, weapon, and accessories using Unreal Engine 5, ZBrush, Maya, Marvelous Designer, and Substance 3D Painter.

Introduction

My name is Safouen Laabidi, and I'm a Senior Character Artist at GameU. I'm from Tunisia, located in North Africa. I've worked in the game industry for about 6 years, and overall, I've been in the industry for around 14 years. I've had the opportunity to work with prestigious clients such as Louis Vuitton as a 3D modeler, and I've also taught character creation for games for 4 years.

In addition to my teaching and freelance work, I've contributed to major projects like PUBG, Apex Legends, and, more recently, Azguard Wrath 2. As for my education, it's a bit different from what I do now. I have a degree in Business Administration, but I decided to change direction and learn 3D modeling on my own. It was a risky decision, but in the end, it was definitely worth it.

Inspiration & References

I chose this character to improve my hair creation and rendering skills in Unreal Engine, as it was my first time working with rendering in Unreal. My goal was to achieve a level of quality similar to the characters from God of War. It was a challenging task, and while I'm not sure if I fully achieved that, it was a valuable learning experience.

The concept for the character was created by Grafit Studio, and I liked how it looked. It had everything I wanted – from the complex hair to the striking armor. One particular challenge for me was figuring out how the character would look from behind while ensuring it didn't feel too simple or impractical.

The original concept art:

Face & Body Sculpting

I started by focusing on the face because it's a key element that can make or break a character. I wanted her to have a masculine feel yet still be beautiful and feminine without altering the jawline to the point where she looks overly manly. I usually use DynaMesh at a low resolution to block out the main shapes.

Afterward, I used my base mesh of a female body to block out the armor. I firmly believe in maintaining clean topology, even if it doesn't make sense to everyone. From my experience, clean topology makes detailing easier and more efficient, which ultimately helps you become a faster artist. After I had everything in place in good proportion, I started making small assets like belts around her arms, a knife asset, and a sword.

Asset Modeling

For modeling assets like the knife holder, I didn't use ZBrush initially. Instead, I used 3ds Max for the polymodeling. The process was straightforward – I created a basic form and added some support loops to ensure good smoothing when subdividing without losing volume. After that, I brought the model into ZBrush to start sculpting. I mainly used a single alpha from Surface Mimic, specifically the "molted leather" texture.

I used five brushes for the rest of the damage and ornamental design on the handle: Clay Buildup, Dam Standard, and Orb Crack. I also used the Slash2 brush for edge wear and damage and occasionally Trim Dynamic for metallic damage. I did this process for everything except the skin.

Face Details

For the face, the process was simple. I started by wrapping a basic plane with a Texturing XYZ map onto my model to capture the main details. After that, I did some cleanup using the Morph Brush. The steps are straightforward: first, store a morph target and create a new layer in ZBrush, then project the details. You'll likely encounter artifacts in areas like the eyes, ears, and corners of the mouth, but since you have a morph target stored, you can easily clean these up with the Morph Brush. Once that was done, I blended the remaining empty spaces using custom brushes with similar skin details.

The scarring was really simple to achieve. I used the Dam Standard brush with some inflation to create natural-looking scars that appeared fairly fresh. However, most of the final look of the scars in the render came from the texturing process.

Clothes

This was the easiest part for the clothes since I only had a cape and some straps. It was a simple simulation in Marvelous Designer, which I don't think anyone would struggle with. The real challenge with my clothes was creating natural-looking tears and messy fibers while also ensuring they looked crisp when baking opacity maps. To achieve this, I made custom fibers and used the IMM brush to add them. Then, I used the Move and Inflate brushes to introduce variation so the fibers wouldn't look repetitive.

Hair

This hairstyle is my first attempt at creating hair. Previously, I only made a very simple hairstyle and didn't use Unreal Engine, but this time, the design was more complicated, presenting a new challenge.

I began by gathering hair references, as I didn't have a specific reference for this hairstyle. However, I found several similar styles that served as guides. I blocked out the hair using a large spline in ZBrush, which I planned to use as a reference later on.

Next, I used Ornatrix in 3DS Max to create the hair strands. I watched an interview with Johan Lithvall from CGMA multiple times – about five, in fact. Since I don't have access to online courses in my country, I relied heavily on that interview, even replicating the hair strand appearance from his example, as our hair lengths were similar.

Once I finished creating the hair strands, I moved on to making the hair cards. I started with a simple plane, slightly adjusting the vertices so that the hair strands would effectively cover the plane. To simplify the process, I divided the hair card into four sections.

During the blockout phase, I used thick hair strands to cover the head as much as possible. Then, I added a secondary layer to break up the form of the first layer, followed by a third layer where I used smaller strands. This helped create a more natural look by allowing light to pass through the hair fibers. Finally, I added flyaway strands to give the hair some life, making it appear less computer-generated and more organic.

To incorporate the hair cards, I extracted splines from the blockout mesh in ZBrush and used a path deformer to follow that path. After finishing, I adjusted the hair in ZBrush to ensure it looked better and fit well with the armor.

Weapon

At first, I wanted to follow the original concept. To be honest, I liked the sword handle, but I didn't like the look of the rest of the sword design, so I decided to do something on my own.

I used the same dragon from the hip armor to model the handle. Since I had sculpted that dragon as a full design from both sides, I took that part and adjusted the end of the dragon to resemble a handle. Then, I created a simple blockout for the actual sword and started detailing it using the Curve Tube brush with adjusted curves at the end. After laying out the patterns, I began polishing the form to achieve a natural look, ensuring it complemented the rest of the armor design. I wanted the sword to look like it belonged to that character.

Retopology & UVs

I used to rely on ZBrush for retopology, but I've switched to TopoGun because I find it simpler. Although ZBrush's ZSphere topology has served me well for years, I've grown to love TopoGun. Most of the armor and body were retopologized using TopoGun, except for some easier areas like the face, where I applied the warp method. For some assets, I kept my high poly models clean, removing unnecessary edge loops to save time. This approach is also efficient for my work.

For UV mapping, I find ZBrush straightforward for unfolding the mesh. If I encounter any issues, I turn to 3ds Max for unwrapping. I split the character into five texture sets to maintain better texel density.

Texturing

Face Texturing

I had a good base for the face since I used the Texturing XYZ maps. If there's one thing you need to do in this industry, it's to stay up to date with any new pipeline. Of course, I can't use the maps as they are. I have to take all those maps to Substance 3D Painter along with an additional normal map baked in ZBrush because of the extra scars I added.

First, I added some filters to adjust the colors with the help of the different maps provided by Texturing XYZ. After that, I removed the eyebrows and painted some shadows on the scalp so that later, the hair would blend with the hair card. I also added a layer of dirt and then applied two different types of blood – dry and wet – on the scar to make it look believable. For the roughness, I didn't like the basic roughness map that came with the pack, so I adjusted the contrast and added some more wetness under the eyes, lips, and nose.

Eyes

For the eyes, I used the Digital Human Project from the Epic Marketplace for my elf character. I scaled the original eyes to fit the design and added an extra mesh on top to add shadows and simulate wetness, which is why they look so realistic. One important tip: never mirror the eyes directly. If you need to mirror one eye, make sure to adjust the UVs accordingly to avoid any weird distortions.

Armor Texturing

Like any texturing process, I start by setting up the base material for leather. I begin with the original leather material and work on the underlying layer. This way, when I add the leather texture on top, any damage I create will reveal the details beneath.

A crucial aspect for me is achieving the correct roughness in Unreal Engine. To do this, I apply a custom LUT to ensure that the viewport in Painter resembles Unreal’s output. This allows me to work with confidence that the colors and roughness will match.

I use multiple anchor points to create consistent leather damage. The same approach applies to adding dirt and rust to the metallic parts of the armor. For stitching, I have my own custom tool, but you can also use the native stitching tool in Substance, which is even more effective.

Hair Texturing

The hair texturing wasn't done in Painter. Instead, I baked the Height Map, ID Map, and Opacity Map using xNormal with some custom gradients. I then utilized the hair shader from the Digital Human Asset. With a solid base and quality maps, the results look fantastic – most of the texturing involves just adjusting colors and roughness.

One tip I can offer is to bake vertex occlusion in whatever software you choose. This step adds depth and variation to your hair in Unreal Engine.

Lighting & Rendering

After finishing everything, I exported the assets into Unreal Engine. I began by blocking out a simple environment using some Megascans assets to populate the scene. I also incorporated fire particles from the starter content. Once I was satisfied with the setup, I added point lights to help illuminate the scene with the fire, focusing primarily on how the fire and point lights affected the character. This added warmth and helped ground the character within the environment.

I used Lumen and ray tracing, which enhanced the global illumination affecting the character. Next, I concentrated on defining the character's silhouette, particularly the hair, shoulders, and sides of the cape. I aimed to create a strong outline using light, employing a cold versus warm lighting approach. The moon served to simulate cool light, while the fire provided an orange glow from the side and back, adding a nice rim light effect for the hair.

After that, I added a rectangle light facing the character to bring life to the eyes, highlight the wetness, and ensure the light reflected realistically in the irises.

The rendering process was straightforward. I followed Unreal's documentation to add custom console variables, which improved the quality of the renders. All my outputs came out sharp, and I didn't need to do any post-production or color correction. I simply took the images into After Effects to convert the PNG sequence into a video.

Here are some render setting values to follow:

Spatial Sample Count: 1
Temporal Sample Count: 64
Override Anti Aliasing Mode: Enabled
Anti Aliasing Method: None
Render Warm Up Count: 120
Engine Warm Up Count: 120

These are the console variable I used:

r.MotionBlurQuality: 4
r.MotionBlurSeparable: 1
r.DepthOfFieldQuality: 4
r.BloomQuality: 5
r.Tonemapper.Quality: 5
r.RayTracing.GlobalIllumination: 1
r.RayTracing.GlobalIllumination.MaxBounces: 2
r.RayTracing.Reflections.MaxRoughness: 1
r.RayTracing.Reflections.MaxBounces: 2
r.RayTracing.Reflections.Shadows: 2

Conclusion

This character took me a significant amount of time to complete, primarily due to some personal issues that prevented me from finishing it sooner. If I had to estimate the total hours, I'd say it took about two months and eight days. I learned a lot during this process, especially about Unreal Engine and hair rendering. Since this was my first experience with hair, I faced many challenges in getting it to look good. However, once I broke the process down into layers, everything became much clearer.

One piece of advice I can offer is this: when starting a character, try not to focus on the details right away, as that can overwhelm you and lead to mistakes. Instead, break down the form into simpler shapes. As humans, we tend to get drawn into details, but simplifying the process will help you create a great character.

Safwen Laabidi, 3D Character Artist

Interview conducted by Gloria Levine

Join discussion

Comments 0

    You might also like

    We need your consent

    We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more