By Tanvir Islam
Discover Tanvir Islam’s in-depth character creation process for his image, Khlotharius
The purpose of making Khlotharius involved a few things, including testing my character rigging pipeline and transferring the whole light and shade pipeline from Maya to Houdini’s Mantra renderer. In this tutorial I will try to explain how I started in ZBrush and ended up rendering in Mantra.
Step 01: Concept
Blizzard Entertainment’s characters have always inspired me, and I’m a big fan of all The Lord of the Rings films, so whenever I plan a character these kinds of detailed ideas pop out from the back of my head. Keeping that in mind, plus collecting some shape references and design motifs of ‘elements’ such as wind and fire, I created these motifs. They’ll be used to design the armor details later. For the character himself, I collected some anatomy references from the internet, using Google and Pinterest. I tend to use my memory for anatomy sculpting for a little stylization, but whenever I get confused I turn to references.
Step 02: Starting from a sphere
If it’s a personal project I always start from a DynaMesh sphere in ZBrush. Using the Standard, Move, Snake Hook, Inflate and Smooth brushes, I create the basic form of the figure, as pictured.
Step 03: Further sculpting
To build up secondary forms, I love to use the Clay Buildup brush in combination with Alpha06. Using this technique, I create all the secondary forms, like bony landmarks and muscle fibers.
Step 04: Retopology
Now it’s time to do the topology. For topology I primarily use ZBrush’s ZRemesher for the body, and then take the mesh into Maya. But before exporting, under the ‘Export’ section of the Tools menu, deselect ‘Grp’.
Step 05: Setting the scale in Maya
Now I import into Maya, one of the most important steps to do is setting the scale of the mesh. If the figure is six feet tall, then we should scale it to that measurement. I usually set the unit of measurement to feet and scale the figure to match the height I’m looking for. If I don’t do this step now, I’ll have trouble getting perfect displacement effects, lighting and rigging later.
Step 06: Making polygroups
Now I bring back retopologized mesh back into ZBrush and assign some polygroups for later use of the hide/show function and UV mapping. Make sure you also store the Morph Target. The model’s now ready for adding micro details like skin wrinkles and pores!
Step 07: Adding surface noise
Before going into fine details, I distort the model a little bit with some surface noise. Start with the higher noise scale and lower strength. Each time I apply the surface noise to the mesh; I lower the noise scale and increase the noise strength. It’s best to start with a lower subdivision and increase it each time you add more noise, but this might inflate the model each time. So, in some places, I make use of the Morph brush and masked areas. To break up the secondary forms more, I use the Inflate brush with Alpha63 and Depth Gravity Strength set to 60.
Step 08: Sculpting skin details
For skin pores, wrinkles and cross-hatching detail, I use the Dam Standard and Pen A brushes with ZSub on, and the Standard brush with Color Spray settings using various alphas. With the help of the brushes pictured, and some custom alphas, I create all the skin details.
Step 09: Exporting UVs into Maya
For the UVs, I have the help of ZBrush’s UV Master plug-in. Under the UV Master settings, I turn on the polygroups which I created before. This gives me a decent UV. I export the low resolution mesh into Maya, making sure to deselect ‘Grp’ under the Export menu, as I did previously in step 4. If you don’t do this, the model will be exported in chunks. In Maya, I arrange it into four UDIMs (UV tiles) with some UV changes.
After this, I export the model back into ZBrush. As there are no changes made to the mesh, keeping the tool open in ZBrush at its lowest subdivision and simply importing the UV modified mesh into ZBrush will do just fine.
Step 10: Sculpting the armor
There are a few awesome techniques for creating hard-surface accessories, which wouldn’t be possible or efficient without ZBrush. I’ll try to explain a few of them. To start with, we need a base, which can be extracted from the body as follows.
First we need to duplicate the SubTool and mask the area to extract the mesh from. Use Ctrl+W to assign a polygroup. Now we need to smooth the jagged line of the polygroup border. For this I use the Smooth Groups brush from the Smooth brush collection in the Lightbox. Draw around the jagged polygroup border and hide the other polygroups. Under Tools > Geometry > Modify Topology, press ‘Delete hidden’, but before applying this remove or freeze all the subdivision levels. Now use ZRemesher with its default setting. Next, choose the ‘Half’ preset under ZRemesher and press it several times to get the polycount you think is suitable. Adjust it according to your needs.
From the Stroke menu, under Curve function, select ‘Border only’ and press Frame Mesh. This will give us a guide curve at the border. Select the Curve Tube brush, click on the existing guide curve, and apply DynaMesh. Smooth the jagged polygroup border and apply DynaMesh as we did above. Unwrap using UV Master, and now we have a clean base to which we can add detail. I select a white color and fillObject.
Step 11: Detailing the armor
Now we can PolyPaint the mesh using the Surface Noise function, with custom image along with UV enabled. We are going to use Surface Noise just to extract color from a custom image. Set the Strength to 0, Mix Basic Noise to 0, Color Blend to 1, and the color to black. Now apply noise to mesh.
I apply a mask based on color intensity and hit Ctrl+W to make a polygroup. I duplicate the SubTool, hide the other polygroups, and delete hidden. I use ZRemesher with its default setting and extrude with ZModeler. Now I’ve got something with better topology. I use Crease Polygroup, subdivide twice, then Uncrease All. Finally, I subdivide again to get a cleaner edge. With the help of this technique, I create all the armor pieces.
Step 12: Making a stitch
First we need to create a Curve Insert brush with stitch mesh. Start with a poly converted torus and shape it into letter ‘C’. Align it in a way so that it looks like letter ‘I’, or based on your needs. If it’s lying on a surface, then align it that way. From the Brush menu, select ‘Create InsertMesh’. From the Stroke menu, choose Curve Mode. Now we have a stitch that can be applied to the character’s clothes.
Step 13: Creating cloth
Now I’ll create some fabric. First I do the ‘Group by normals’ to separate the facing surface by polygroup. I divide it and hide the other groups, then shrink the visibility. I use the Curve function’s ‘Frame Mesh by Border’. This way I get the guide curve a little inside the surface, which is the perfect area to place the stitches. Later it will be used to create stitches with the Curve Insert brush.
With the Insert brush, click on the guide curve. Under the Brush menu, use the ‘Imbed’ slider to set the height of the Insert Mesh placement. Use the ‘CurveStep’ slider to set the distance in between each stitch. Now with more work we can bring out a nice stitch detail. Under Curve Function, you can use Smooth to remove distortion on the guide curve. If any weird result appears after changing the CurveStep value, try pressing Smooth once and then click on the guide curve using the Insert brush. You have to be careful because it also changes the placement of the guide curve little bit.
Step 14: Final accessories
The belts are created using the CurveStrapSnap brush, and the chain accessories were created with the help of various Insert brushes. The hood and clothes were created using Maya’s nCloth, then brought back into ZBrush for detailing. I used the Surface Noise function with a custom alpha image. To UV map all the belts, strips, armors and cloth, I follow the same procedure I used for the body.
Step 15: Displacement output
This character has four UDIMs so we have to follow a special workflow to output any map from ZBrush. We have to create polygroups based on these UDIMs. From the Polygroups rollout, press ‘UV Groups’. Now every time we output any map, we have to show only one of these polygroups at a time. At this point I am more concerned about displacement. I output all the displacement maps using following settings.
Step 16: Exporting into Houdini
With the help of a special workflow for UDIM in ZBrush, I output all the maps. I want to check if all my displacement details have came along nicely in Houdini, so I export all the meshes into Houdini. I create some basic lighting to check the displacement and also created a Mantra PBR.
Step 17: Houdini shaders
I assign Houdini’s mantraSurface shader to the body and make a special network to use the four UDIMs’ displacement maps with the shader. For this we have to double-click on the mantraSurface to get deep into the shader and find the displacement section.
I create the five nodes shown in the image, and connect them accordingly. Under the default displacement section which comes with mantraSurface, you will find textureDisp already connected to luminanceDisp, RGBDispChannel and texture_value. Disconnect them from textureDisp and connect them with the ‘add’ node which we created just now. I also change UV Transform’s ‘Translate x’ value based on the UDIM number. I use a value of 0 for the first, 1 for the second and so on.
Step 18: Testing the displacement
As the scale of the model is based on real-world scale, I’ll have less trouble getting the displacement and detail which I already achieved in ZBrush. Here you can see the settings for the displacement, and test renders of the model with and without displacement.
Step 19: Texture painting
I texture the body using a mix of image projection and hand painting with the various masking features that ZBrush provides. While texturing I use ZBrush’s skinShade4 shader. For image projection I use ZBrush’s Spotlight function. First we have to import a texture from the Texture menu. Select the texture and press ‘Add to spotlight’. The Lightbox might pop out, but turn it off. Now we’re in texture placement and editing mode, so place and edit the texture using the circular manipulator.
Now we need to use two important shortcuts: Z and Shift+Z. Shift+Z will enable and disable Spotlight mode. After turning Spotlight on, the ‘Z’ key will switch between image-editing and painting mode. For the Standard brush, we must enable ‘RGB only’ to project color. If ZAdd/ZSub is enabled it will project detail as well. This way I project images to most of the areas of the body.
Using the Standard brush with the Color Spray setting and Alpha58 (or a custom alpha), I use the ‘C’ key to color-pick from existing projected textures and fill the white gaps. This way I get a vibrant color effect from the brush, which is like a real skin texture.
Step 20: Texture detailing
Now with more careful painting, I finish the texturing using various alphas and colors. While painting these areas I choose dark colors to paint the cavity areas compared to relief areas. For this I lower the subdivision and apply ‘Mask by cavity’, then blur the mask once, then sharpen it again. Then I go to the highest subdivision and start painting.
Step 21: Painting hard surfaces
For hard-surface texturing I use ‘Mask by cavity’ the same way, but in addition to that I use two extra brushes. I use the TrimDynamic brush with RGB turned on only, which constrains the painting at the edges only. With this we can get a torn edge effect. I also use the Pen A brush, which creates lines from thin to thick and is good for scratch effects.
Step 22: Color maps
Later on I’ll use these maps as masks for creating layered shaders. Pictured, you can see the color maps for the body. For the specular map, I combine the desaturated color map with the displacement map, then painted and adjusted a few areas in Photoshop.
Step 23: Area lights
For the lighting setup, I use four area lights. All the area lights’ attenuation is on, and the sampling quality is increased for a quality render. One environment light uses an HDR image (marked in the yellow box).
Step 24: Further shader setup
I double-click the mantraSurface shader I created for displacement and open the inside network section. I follow the same workflow for the UDIM that I followed for displacement, but this time I connect the ‘add’ node to the surface model’s ‘sss_clr’.
Step 25: Further test renders
These are few settings I use for the mantraSurface shader to create skin for the body. Pictured are skin shader tests rendered with the color and displacement maps only, and finally a skin shader rendered with the color, displacement, specular and attenuation color maps.
Step 26: Rendering cloth and accessories
See pictured my render settings for the metal and leather surfaces, and some close-ups of the rendered surfaces, including the stitched border detailing and elemental motifs designed at the beginning.
Step 27: Adding facial hair
For the beard I separately output the face as a null to use it as reference to the fur node. Now I created a geometry node, and under it, I reference the ‘OUT_beard’ using the Object Merge node. In this part I minimize the area more, just to keep it where the beard should be. I paint unnecessary areas and delete based on color.
I create a point node to add the normals so that the curves align with the surface’s normal. I create a scatter node to scatter points on the surface. Then I duplicate the lines using ‘Copy SOP’ on this surface. At the end, I add a Curve Groom node, which will later be used as a guide curve. After adding Curve Groom and grooming the curve, the beard looks more flowing and natural.
Step 28: Using fur nodes
Let’s create a fur node. Under the skin tab I choose the ‘OUT_beard’ as skin mesh and Curve Groom as a guide. I hide the guides I created before and set the fur parameters as shown in the image. I use the color map for the tip and root color of the fur material, then set the reflection settings as pictured. The results are shown in the test render.
For the eyebrows and eyelashes, the same technique was used, but for the cloth and armor padding, no guide was needed ? just fur with a different appearance setting. With the combination of fur and cloth displacement, a nice soft cloth effect is achieved.
Step 29: The final render
For the final image, I didn’t do any pass rendering, just simple color corrections and some iris blur for close-ups in post. These renders are straight out of Houdini Mantra.