Creating Realistic Character Inspired By 12th-Century Mongolian Warriors
Sands Kopaei broke down the creation of his Warrior of the East project, taking us step by step through his pipeline and sharing practical advice along the way.
Introduction
I'm Sands Kopaei, a 3D Character Artist working in the games industry. Projects I have contributed to over the years include WWE 2K26, Apex Legends, Star Wars Jedi: Survivor, PGA Tour, Diablo Immortals, Watch Dogs: Legion, and Watch Dogs 2.
I started my journey in 3D art in 2014 at George Brown College's Game Art program in Toronto, Ontario, Canada. My first industry job came in 2015 when I was still in school, and since then have been steadily working on various games and genres over the years. I spent most of my time outside of work taking classes, working on personal projects, and constantly pushing myself to learn and enhance my skills in various software related to character art.
Getting Started
Growing up, I was always fascinated by the ancient and medieval periods, specifically far east. This piece draws from some of my favorite novels, series, and games, such as Romance of the Three Kingdoms, Netflix's Marco Polo, and Ghost of Tsushima. I had a couple of goals in mind with this piece; I wanted to see how far I could push the quality of my sculpts in ZBrush and try my hand at offline rendering. Given that most of my professional experience has been in real-time rendering, the idea of using a renderer such as Maya's Arnold was a very appealing challenge. My secondary goals were to further familiarize myself with Maya's XGen for all the grooming required and use Marvelous Designer to simulate fabrics in between rigid pieces.
Modeling
I always start my characters with a blockout. This is where I carefully study the concept art and/or any related reference material. In the case of this character, I wasn't following any specific concept art, in which case the block out also serves as a design stage. The main goal with the blockout is to map out the design, the outfit, armor, etc. The goal is to be able to have a holistic view of the character to plan the modeling phase. It's important to keep the block out loose and fast; you do not want to spend too much time in this phase, as it is throw-away work.
Once I was satisfied with the design, I used the blockout as a guide to start modeling. My modeling process is divided into 3 separate categories:
- Assets that do not require cloth simulation;
- Assets that require cloth simulation;
- Grooms.
I always model pieces that do not require simulation first, as I may need to use these pieces during simulation as collision objects (Example: the belts overlapping the hanging fabrics around his waist). Leaving the grooms for last to ensure hair/fur strands conform to all the pieces of the character.
My general workflow involves extracting geometry from the block out using masks in ZBrush, followed by ZRemesh to get a clean topology. I then use the ZModeler brush to modify topology as needed, add thickness, and creases. Once I'm satisfied with the base geometry, I add subdivision levels and sculpt the details. I use layers often in ZBrush to keep secondary forms and high-frequency details separate for more control later during texturing and rendering.
Tip: I often use temporary UVs to apply details precisely on my model during the sculpting phase. For example, the gold details on the helmet were done by creating a circular UV map of the base helmet. I then copied and arranged the detail alpha in Photoshop over the UV layout of the helmet to create a black/white mask and applied it to the helmet in ZBrush as a texture. Then I used the mask by intensity function inside ZBrush, followed by the polygroup by mask function. This is followed by isolating the polygroup that contains the desired detail, deleting hidden, and proceeding with ZRemesh and the rest of the standard process mentioned above.
All the clothing pieces are made in Marvelous Designer. Adjusting and editing patterns to get the desired simulation results. Once the attire is in a good place in Marvelous Designer, I bring in the rigid pieces as secondary avatars and simulate the fabrics against them. This creates an organic and realistic interaction between the fabrics, the belts, and the armor. The Marvelous Designer simulations are then exported to ZBrush and go through the standard ZRemesh process mentioned above and further sculpted to add secondary forms and details, along with a wear and tear pass.
At this stage, the high-poly model is complete, and it's ready for the groom work. I used Maya's XGen for all the grooming. When it comes to XGen, it's imperative to have a very organized file structure and naming convention. Always start by gathering as many references as you can and spend a good amount of time drawing your XGen guides as precisely as possible. Always view your guides from various angles and follow the C and S shape rules for every guide. Ensure the guides are never flat from any angle and always have a C or S shape. Apply your modifiers carefully and avoid using more than 3 clump modifiers per description whenever possible.
Tip: In order to visualize my grooms during the modeling process, I like to use ZBrush's FiberMesh for a temporary placeholder groom. This will allow you to have a complete visualization of the final model while finalizing the high-poly details.
Tip: While grooming is considered part of the modeling process, I advise tackling it during your texturing phase. It's much more efficient to be doing your groom work once you have your look-dev scene set up to review the progress of the groom with quick renders.
My go-to software for topology work is TopoGun 3. I do sometimes leverage ZRemesher first before going to TopoGun to speed up the process. All the UV work for this project was done in RizomUV. I separated my model into parts and used the UDIMs workflow for more control over the texel density of each piece.
Texturing
I start my texturing process by first doing a color and material blockout pass. There are many different material types with varying surface information. For example, metals can have a wide range of reflectivity, from a sandblasted metal to pure chrome. While capturing realism is important, creating an appealing visual target from an artistic perspective is just as important. By doing a texture block-out pass, I get to experiment with not only colors but also reflectivity values of each surface to find a combination that is both realistic and artistically appealing.
Once I have settled on my colors and material types, I begin collecting references for each material type. At this stage, I move away from the model and create a library of base materials based on the types of surfaces I need. I created materials such as lacquered leather, painted metals with varying wear/tear, rust, and scratches, dirty cotton, etc. I added any surface details that would define the age and state of the material in these base materials.
I used a 2mx2m square for each material. For a character model, 2m x 2m is a good amount of material to cover almost every piece without the need to be tiled too many times. This allows me to place more unique details, such as mis-coloration, grunge, and dirt in these textures without worrying about them being repeated too many times on the model. The base materials created in this manner can be reused across the model and in future projects. It's a good habit to approach your textures in this manner, both professionally and for personal work. After a few assets, you will have a large material library to significantly speed up your texturing workflow while maintaining consistency and quality.
Now with references gathered and a base material library created specifically for this project, it's time to head over to Substance 3D Painter. I used a standard PBR Color/Metal/Roughness/Normal for the armor. Anything with skin uses a displacement map workflow and is textured in Mari. Hair and fur were textured procedurally using the Arnold hair shader.
I start by baking all the required maps from high-poly to low-poly in Substance 3D Painter. I bake in 4K resolution and paint in 2K for better performance inside SP. Once I verify the bakes are clean, there is one more step before starting the painting process.
It's a good idea to set up a look-dev scene with neutral lighting to progressively check your texture work with quick renders. Since Arnold is my renderer of choice for this project, I started by setting up a SkyDome in Maya using a neutral studio lighting HDRI. I complemented the SkyDome with a simple 3-point lighting setup. Created a turntable, a simple floor, and a backdrop for catching shadows. It's important to use neutral lighting and make sure your HDRI doesn't have high contrast. This makes for a suitable environment to look-dev and adjust texture values as you work. Now you can export your textures and set up your shaders inside Maya. I used Arnold Standard Surface Shader for this project. With all this set up, you can start painting and texturing the asset inside Substance 3D Painter, and exporting your textures will automatically update your textures inside your look-dev scene for quick progress checks as you work in SP.
Tip: A good way to achieve more realistic results with your textures is to sculpt some of the larger details in your model and only rely on the high-frequency details to come from your textures. For example, in the case of leather, I have sculpted some of the larger and more pronounced leather creases during the sculpting phase and rely on my base materials for the smaller leather grains.
Rendering & Lighting
Rendering the armor was a straightforward transition from the look-dev scene to the final render scene, as all the pieces use the Standard Surface Shader in Arnold. For the skin (head and hands), I created a shading network inside Hypershade in Maya for finer-tuning control. I used region masks to separate various regions of the face, such as cheeks, eyes, mouth, chin, forehead, tip of nose, etc. These masks were then used to control the intensity of Specular, Roughness, and Displacement textures on the model associated with each region of the face. The Displacement map is an RGB texture where displacement detail is stored in the Red channel, tertiary details are stored in the Green channel, and micro details are stored in the Blue channel.
I used Arnold's aiMultiply and aiLayerRgba nodes to combine the masks while maintaining separate control inputs per region. Setting up the skin shader network in this manner allows for precise control during look-dev. It allows me to easily change the glossiness of the eyelids or specular value of the forehead area, or even make micro details of the cheeks or nose more pronounced by simply adjusting the input values for each region. This is a much more efficient and faster way to fine-tune values of the skin parameters to achieve the desired end results without needing to constantly paint and update textures.
Lighting the final scene was also a transition from the look-dev scene. I replaced the studio HDRI with a desert HDRI and lowered its intensity. I set up a 3-point lighting scheme again, but this time I used warm lights for Key and Fill lights, while using a cool light for the Rim. When it comes to lighting, less is more. I try to stick to as few lights as possible. Once I was happy with the position, angle, and intensity of the lights. I added a couple of small area lights to specific areas. I used light blockers to mask off areas where I wanted no light or dimmer lighting. The final render scene consists of a SkyDome and 5 Area lights. There is no post-process applied to these renders other than a small exposure increase to brighten the images slightly, they are raw renders from Maya's Arnold.
Conclusion
The biggest challenge I faced with this project was planning and organizing all the different moving parts and workflows, and making sure they all came together and were compatible along every stage. Keeping organized file structures, using precise naming conventions, and keeping file iterations helped tremendously along the way. One of the key lessons I learned in this project was how to balance levels of detail in your textures to achieve more realistic and artistically appealing results. It is easy for artists to get carried away with details and want to ensure all their details are read from a distance. This is a trap that can make your models look very noisy and difficult to digest. It is important to remember that not every detail on your model should be visible from every distance, some details should only be visible to the audience in close-up shots.
My advice to those starting their journey in character art is to remember it's a marathon, not a sprint. There are many different disciplines and specialties required to be a character artist, and learning all of them at the same time can get overwhelming. Compartmentalize your learning journey, focus on each subject matter separately, and take your time learning. And of course, never stop learning, always be a student of the craft.