Gaurav Gomes told us about the Archer project set up in Unreal Engine, sharing the texturing process of the multi-layered outfit and tattoos and showing the creation of the high-poly model.
Introduction
My name is Gaurav Gomes. I am a 3D Character Artist with lookdev experience on 3D animated shows from Disney and LEGO. Ever since I was a kid, I loved drawing characters from my favorite movies, video games, and anime. I remember being totally blown away by the insane visuals in the first Iron Man movie and the God of War games. That’s what got me really curious about the process behind creating something like that.
Early on, I knew I wanted to focus on 3D modeling and texturing, as I was most interested in character creation. So I began learning about different 3D software through YouTube tutorials and eventually discovered ZBrush. Its digital sculpting felt natural and similar to drawing, which instantly hooked me. Though its interface felt daunting at first, almost like it was designed by aliens, it became surprisingly intuitive once I customized its UI to fit my workflow. I've also been teaching myself more about Unreal Engine lately as I find the advancements in real-time tech incredibly exciting.
Archer
The goal of this project was to closely follow a 2D concept art to create a 3D character and add variety to my real-time character portfolio. Since I had already created a futuristic sci-fi male character with a lot of hard surface elements, I wanted to push myself by creating something entirely different this time. So I went with the idea of a medieval female character with organic elements. I also set the following design criteria to guide the process:
- Realistic design
- A variety of fabric and leather materials
- Tattoos on the character
- Scars on the character
- A range of accessories and weapons
- Long hair
These criteria were intended to help me practice specific techniques and ultimately create a character I felt would look visually striking. With these factors in mind, I began my search for the perfect concept art. After scrolling through countless designs online, I stumbled upon Archer by Sanchit Chaudhary, which I felt was a perfect fit. It checked all my boxes and featured an interesting character design. With the concept locked in, I gathered additional references to help with the character's various details.
High-Poly Model
Outfit
I started in ZBrush by blocking out the body proportions using basic spheres. Then I merged them using DynaMesh and refined the anatomy further. For anatomy references, I relied on images and 3D scans of real people, and I highly recommend the book Anatomy for Sculptors for its clear breakdowns of human forms.
After working on the body, I used Marvelous Designer to quickly create clothes with realistic folds in areas like the shirt sleeve, cape, waistband, and leather stocking. This created a base for me to further refine in ZBrush.
Next, I imported the cloth geometry from Marvelous Designer into ZBrush. The default geometry we get from Marvelous Designer is not ideal for sculpting. So to make it usable, I used the following steps:
- Duplicated the Marvelous Designer subtool and used ZRemesher to improve the topology for sculpting and reduce polygon density.
- Used the ProjectAll function to transfer details from the Marvelous Designer mesh to the ZRemeshed mesh.
- Subdivided the ZRemeshed mesh four times, projecting details after each subdivision to capture the details as accurately as possible.
With all the cloth pieces ZRemeshed with proper details and subdivisions, they were ready for sculpting. I primarily used the Standard, DamStandard, ClayBuildup, and Move brushes for refining clothes. While sculpting, I focused on cloth volume, fold tension, and compression. Once I was satisfied with the folds, I added thickness to the clothes using Panel Loops.
- I first deleted all lower subdivisions to prepare for thickness application.
- In the Panel Loops options, set Loops to eight to restore the original four subdivision levels later.
- Adjusted Bevel and Elevation to get the desired shape and set Polish to two.
- Tweaked the Thickness value and applied Panel Loops, repeating until the desired thickness was achieved.
- Restored subdivision levels using the Reconstruct Subdiv button.
All the other elements on my character, including the leather straps, belt, arm wrap, and shoes, were created by masking their shape and extracting them from the base mesh, followed by ZRemeshing and adding thickness.
In the concept art, the Archer is shown wearing a padded jacket. After a quick search, I found that this type of garment is called a gambeson, a defensive jacket traditionally worn as armor. Achieving the padded effect on my character’s jacket was quite interesting. Here’s the process for creating gambeson:
1. I first removed all folds from the Marvelous Designer mesh to create a smooth surface for detailing.
2. Created a model of the padded surface using a 3D plane.
3. Set the document resolution to 2048 x 2048 and adjusted the 3D plane to fit the frame.
4. Extracted an alpha by navigating to Alpha > Transfer > GrabDoc.
5. Generated quick UVs for the jacket using ZPlugin > UV Master > Unwrap.
6. Applied the padded alpha using Surface > Noise.
7. Fine-tuned the effect with Strength and Noise Curve in the Surface Noise menu.
8. Applied the effect permanently using Apply to Mesh, then added thickness to the jacket.
Each piece of the outfit underwent multiple sculpting passes, including cleanup and the addition of details such as memory folds, creases, and wear and tear. I sculpted the primary and secondary details in ZBrush and planned to add tertiary details like stitches and fabric patterns during the texturing process.
Face, Arms & Hands
Sculpting the face is one of my favorite parts of character creation because it is often the focal point and provides me a good opportunity to practice my sculpting fundamentals. When creating any likeness, having face references from multiple angles is essential. Even though my character did not require an exact likeness, I still searched for front and side profile images of female faces that had similar features to the face in my concept art. Here are the steps I used to achieve the final version of the face with all the micro details and imperfections:
1. Sculpted the face in DynaMesh mode while aiming to capture the likeness.
2. Exported a decimated version of the head to Maya for retopology using Quad Draw, then unwrapped UVs with UDIMs (one for the face, one for each arm and hand).
3. Imported the retopologized mesh with UVs back into ZBrush, subdivided it, and projected details from the original sculpt.
4. Refined the face by breaking symmetry and adjusting features.
5. Used the ZWrap plugin to wrap the VFace mesh (comes with TexturingXYZ maps) onto my face sculpt.
6. Brought the model into Mari, projected Texturing XYZ textures, and exported displacement and albedo maps.
7. Used Photoshop to split the Texturing XYZ displacement map’s RGB channel into primary, secondary, and tertiary versions for better control in ZBrush.
8. Used ZBrush’s Layers to apply the three displacement maps separately for better detail control.
9. Sculpted additional details like scars and wrinkles using Standard, DamStandard, and ClayBuildup brushes.
10. Used Morph Target and the Morph Brush for a non-destructive workflow, allowing easy removal of manually added details without affecting Texturing XYZ data.
I followed the same process for the arms and hands but worked on them in a separate ZTool file to avoid crashes on my laptop. Once I had added all the fine details to the face, arms, and hands, I baked the details stored in their layers, exported the normal maps from ZBrush, and decimated the meshes for a lighter export.
Low-Poly Model
My low-poly model included the retopologized version of the outfit, weapons (bow, arrow, sword, and sheath), the low-poly versions of the head, arms, and hands (derived from the lowest subdivision of their ZBrush sculpts), and the hair cards.
To create the low-poly version of the outfit, I began by exporting the decimated versions of all the high-poly sculpts, ensuring they were properly named with the suffix "_high" to indicate they were high-poly versions. I then imported these into Maya, where I organized them in the outliner into groups based on the texture set I intended to use during texturing. For example, I grouped all the clothing pieces, leather elements, and weapons separately. Once the organization was done, I hid all the parts except the one I was about to retopologize, put on some good music, and started retopologizing using the Quad Draw tool.
Here are some steps I follow to make the low-poly creation process smoother and achieve better output:
- To save time and effort, I use the lowest subdivision version of parts wherever possible to create their low-poly version, then optimize them further by deleting any unnecessary edges. I used this method to create low-poly versions of the straps, belts, and arm wraps.
- I start the retopo by creating larger quads to cover the maximum area while creating proper loops for the edges to flow. Then I start adding edge loops as needed to better capture the geometry’s silhouette.
- I aim for uniform quad sizes across the entire mesh for better texture mapping. To do this, I smooth the mesh while in Quad Draw mode and use soft selection (pressing B) to quickly smooth larger areas.
The weapons were modeled in Maya, so they already had optimized topology, which I used directly for their low-poly versions. After finishing the low-poly versions of all the parts, I properly named them with the suffix "_low" to indicate they were low-poly versions and organized them into groups, replicating the structure of the high-poly versions.
Hair
This was my first time creating long hair using hair cards, making it both the most challenging and the most time-consuming part of the character creation process. To get a better sense of hair volume, I started with a rough hair sculpt in ZBrush. I then imported this sculpt into Maya, added it to a display layer, and set it to Template ("T"). This helped me to use it as a reference for shaping the volume of the hair cards more easily.
I used FiberShop to generate hair card textures. I liked it for its procedural workflow. In FiberShop, I created several variations of hair strands for different purposes, including:
- Thick-density hair strands: to cover the scalp.
- Medium-density hair strands: to shape the overall volume of the hair.
- Light-density hair strands: to refine the hairline and improve the transition between hair and skin.
- Flyaway hair strands: for added breakup and realism.
- Smaller hair strands: for eyebrows and eyelashes.
From FiberShop, I exported albedo, ambient occlusion, normal, flow, and alpha maps.
Once my textures were ready, I used the GS CurveTool plugin in Maya to generate a collection of hair cards, aligning their UVs to the textures I had created. I then began placing the hair cards on the head in four stages:
- Scalp coverage – I placed the densest hair cards to cover the scalp while leaving space where the hair is parted.
- Volume creation – I used three to four layers of medium-density hair cards to shape the overall hair volume.
- Skin transition – I used finer strands in areas where hair grows directly from the skin, creating a smoother transition between hair and skin.
- Flyaways and facial hair – I added the thinnest hair cards for flyaway strands, eyebrows, and eyelashes.
During the hair placement process, I also set up a quick preview in Marmoset Toolbag using the head mesh, hair textures, and hair cards. I constantly updated it to check how the hair layers looked under real-time lighting, ensuring a more accurate final result. After completing the hair placement, I used Maya’s Reduce feature (Mesh > Reduce) to lower the poly count while preserving the silhouette and also created a new UV set for baking AO for individual hair cards. I followed this video by TriGon to create the AO bake for my hair cards.
The GS CurveTool significantly streamlined the hair card workflow. The biggest advantage of using this tool is that it binds the hair cards to curves, making them much easier to manipulate using curve points. Some of my favorite features included modifying the shape of multiple hair cards simultaneously and automatically filling gaps between them with additional hair cards. For anyone interested in learning more, I would recommend checking out George Sladkovsky’s YouTube channel, who is the creator of the tool.
UVs
I created the UVs for my character using Maya’s UV Editor, organizing them based on the texture sets I finalized after completing the low-poly model. Specifically, I created four UV sets for the outfit, one UV set for the hair, and three UDIMs for the head, arms, and hands. The breakdown was as follows:
I categorized the UV sets based on material type and garment placement to help streamline the texturing process, ensuring better material consistency and organization. Here are a few things I keep in mind while unwrapping UVs:
- Strategic UV Cuts – I place UV seams in less visible areas whenever possible. For clothing, I position the seams where real-life stitching would occur.
- Consistent Texel Density – After cutting and unfolding the UVs, I ensure that all shells sharing the same material have a uniform texel density for consistent texture resolution.
- Optimized UV Layout – Once texel density is set, I scale all UV shells together, maximizing space usage by allowing the largest shell to take up the most area while arranging the others around it proportionally.
- Proper UV Orientation – I align UV shells so that any applied texture with a vertical or horizontal pattern naturally follows the correct direction. This minimizes manual adjustments during texturing.
Texturing
Texturing is the stage where everything starts to come together, and I can finally start to visualize the character in its final form. For the Archer, I divided the texturing work into two separate Substance 3D Painter files, one for the outfit and weapons and another for the skin parts.
Face, Arms & Hands Texturing
I began the skin’s texturing process by importing and applying the normal and albedo maps from ZBrush and Mari to the meshes in Substance 3D Painter. Next, I baked all the necessary maps using the details from the normal map. To ensure the baked maps retained the normal map’s detail, I checked the Use Low Poly Mesh as High Poly Mesh box in the baking settings.
- I used AO, dirt masks, and dirt brushes to add color breakup, skin tan, and scar marks.
- I adjusted the lips and tear line area colors by creating a Fill Layer with the desired color, painting a mask for those areas, and setting the blending mode to Soft Light.
- To mimic the specular breakup found in real skin, I built a roughness mask for wrinkles and pores by using the curvature map and made the crevices rougher than the raised parts.
- I also manually painted some roughness breakup to replicate the oily and specular skin areas like the cheeks, nose, lips, and tear lines. Then set its blending mode to Overlay to blend better with the micro details.
- For the tattoo on the right arm, I used an image of a real sparrow tattoo I found online. It was missing some details, but I liked the design.
- I used Photoshop to convert it into a black-and-white alpha, then used it as a mask in Substance 3D Painter and hand-painted all the missing details.
- Finally, I created a black-and-white Subsurface Scattering mask using the Thickness map, which I would later use to create the skin material in Unreal Engine.
Outfit Texturing
I began the texturing process for the outfit by ensuring that my low-poly and high-poly meshes had individual materials assigned in Maya, with appropriate names and suffixes of “_low” and “_high” respectively. After importing the low-poly model as an FBX into Substance 3D Painter, I imported the high-poly model through the Baking menu. I then baked all the necessary maps, ensuring the Match option in the Baking settings was set to By Mesh Name to avoid any baking artifacts.
For texturing this kind of asset, my general approach was to start with a clean or new look and gradually add layers of weathering and imperfections to convey its age and condition.
- First, I assigned base materials like fabric, leather, and metal to each part of the outfit using materials from the Substance 3D Painter library, adjusting their roughness to have a fairly new look.
- To ensure the materials’ scale matched the model, I utilized the Physical Size option in the UV transformation tab of the material’s properties, as my model was created in the correct scale.
- I improved the materials by adding alpha textures and stolen masks from other smart materials to replicate the surface properties in my references. During this stage, I also hand-painted details like stitches and edge wear.
- To create realistic interactions between soft surfaces, I added bump details to the fabric and leather to simulate compression where they’re tightly wrapped. I used the AO map as a height map to push in the covered areas and applied a warp filter to create a natural breakup.
- I began adding weathering effects by layering imperfections, such as sun damage, stains, dirt, and dust, primarily in the albedo and roughness channels.
- The second layer of weathering involved adding more pronounced details, such as scratches, cracks, and wear-and-tear in the albedo, roughness, and height channels.
- For all weathering effects, I either used alpha masks, smart masks, or hand-painted masks, depending on the specific type of effect.
- To blend the weathering details better, I set the blending mode of the base color and roughness channels for some layers to Overlay or Soft Light.
Once I completed the texturing for the skin and the outfit parts, I exported the albedo, normal, SSS weight, and ORM (Occlusion, Roughness, Metallic) maps as 4096-resolution PNGs for use in Unreal Engine.
Unreal Engine Setup
Since I was creating a game-ready character, I chose to showcase it in Unreal Engine 5. After importing the character mesh and textures, I organized them into dedicated folders, creating new ones as needed to keep everything structured.
Material Setup
I began by creating materials for each texture set using the textures exported from Substance 3D Painter. The most complex material was the skin. I followed J Hill’s Rendering Characters in Unreal Engine 5 tutorial on YouTube, which helped me implement adjustable parameters for roughness, normal, subsurface scattering, micro-normal, and peach fuzz. I particularly liked the method of using a micro-normal map for adding finer skin detail and using albedo texture to simulate peach fuzz.
After finalizing the materials, I created material instances and assigned them to the respective character parts. For look development, I used a studio light HDRI from PolyHaven and fine-tuned material properties like roughness, specularity, normal strength, and SSS until they looked natural. For the eyes, I used MetaHuman eye mesh and material, modifying the left iris to a blue shade and giving the right eye a cloudy, blind effect.
Lighting & Rendering
Once the materials look were finalized, I created a new level in Unreal Engine for final renders. I added the posed character with updated materials and set up a basic three-point lighting system (key, fill, and rim lights), along with additional lights for the legs and ground. My goal was to replicate the dramatic lighting of the concept art, emphasizing strong directional light and contrast.
To improve the composition, I incorporated assets from Quixel Megascans, using a forest ground as the base and decorating it with rocks, plants, mushrooms, and an animal skull for added visual interest. I also introduced atmospheric elements like background dust clouds (using alpha textures on planes) and floating dust particles created with the Niagara system.
For the final shots, I set up multiple cameras, adjusting the focal length and aperture for each composition. Then I applied subtle color grading using Post Process Volumes and, once satisfied with the overall look, rendered high-resolution stills using Unreal Engine’s built-in screenshot feature.
Conclusion
This project was a lot of fun to work on and gave me a chance to try out a bunch of new techniques. During the process, I picked up some great insights into female anatomy, creating cloth and leather, and character workflows for Unreal Engine. I worked on this project during my free time while managing my full-time job, so it took almost five to six months to complete this project.
There were a few challenges along the way, but most of them were solved with a quick Google search. Some, though, needed a bit more problem-solving. One of the trickiest parts was learning how to create long hair with hair cards. Another challenge was designing the back of the character, as the concept art didn’t provide any reference, so I spent a good amount of time researching medieval quiver straps to come up with a design that looked both functional and visually appealing.
For anyone creating a character for the first time, my biggest advice is to break the character down into smaller, manageable pieces before starting the modeling process. This makes the details feel less overwhelming and helps in planning a smoother workflow. Other than that, just have fun!
A big thanks to 80 Level for the interview and to everyone who took the time to read this. You can find me on Artstation and Instagram.