Modeling a Fantasy Character
Triggerfish animation studio character artist Sam King shares how he made two version of the same character
In this making of I will show you how I created two versions of a character using ZBrush and Marmoset. Everything was done at the game division of triggerfish animation studios.
Step 01: Concept art
I got some concepts to work from. I asked the concept artist to give me some pull outs so I could see what I needed to start building in ZBrush and Maya.
Step 02: Sculpting
All sculpting was done in ZBrush. I started each ZTool as a sphere or box and then modeled into their forms using DynaMesh. I find it easier to model hard surface high polygon objects such as armor in traditional 3d programs, so these elements were modeled in Maya. They were modeled first as high poly objects and then brought into ZBrush and detailed further there.
The brushes I use most often in ZBrush for large form sculpting are the Move tool, Clay Tubes, Clay, Trim Dynamic, and Flatten. For finer detailed work I use the Standard brush, Standard brush with alphas, Dam Standard, HPolish to smooth off hard surfaces and Orb_Cracks for dents and wear.
Aspects like the chainmail, some buttons, and clasps were made using alpha masks in the surface tab of the SubTool or a projected alpha stamp while using the Standard brush. Some of the larger buttons were placed with the insert multi mesh tool. Items such as the pouches, shield, and helmets were sculpted independently so I could concentrate on the finish. They were then all merged into the final SubTool at the end of the process.
Once most of the large forms and details were complete I needed to transfer my DynaMesh tools across to ZTools with subdivision so I could add more detail.
For this process I duplicate the tool, ZRemesh and then subdivide a couple of times. Using project I then project the DynaMesh sculpt across to the divided version and then have the ability to sculpt on this new mesh with more polygon subdivision and detail.
Next I also sculpted some ground for presentation; since there was no concept art for this I did a couple of quick pencil sketches to figure out the layout. Then I used the same process as above; rough DynaMesh objects to get the shapes and then pushed across to good stepped ZTool for more detail and finally a ZRemesh for low topology mesh and Cleanup in Maya. At this stage I also baked out a Displacement map in ZBrush using the Multimap exporter. The Multimap exporter is a great tool to use. It creates very nice displacement maps if you ever need them. This would be used as a height map to drive some dynamic tessellation on the ground geometry later on in Unreal.
Step 03: Retopology and UVs
For the retopology I used ZBrush and Maya, and for the UV unwrapping I used 3D-Coat and Maya. For the retopo mesh I took the final ZTools and then crunched them down to a decent ZRemeshed result. With enough playing around with ZRemesher you can get decent results to start working on in Maya. Unfortunately the spiral loop issue does still persist, but it is less prevalent now with the ZBrush r7 update. The adaptive size button in ZRemesher can drastically change your ZRemesh result.
The ZRemesher guides tool can let you draw your own topology lines on the mesh; this is very handy. The curves strength in the ZRemesher tab will control how much ZRemesher follows these curves that you have laid out with the ZRemesher guides tool. If all else fails, there is an alternative algorithm that you can use for ZRemesher. Hold Alt and then hit ZRemesh and you will get a different result. You can also hit ZRemesher multiple times, varying algorithms if need be, to get a smoother and lower polygon density result.
After some back and forth with ZRemesher I would then take these low topology meshes and clean them up in Maya.
The base character model with weapons and helmet added came out at 28016 triangles which is a good current gen triangle budget. The whole scene including the ground came to a grand total of 40386 triangles.
For UVs my initial stage for unwrap is 3D-Coat, which has a fantastic toolset that converts a typical unwrap process of a few hours into a few minutes. I am a huge fan! After the unwrapping with 3D-Coat I took the mesh back into Maya and organize the UV Islands, I generally like to rotate my islands upright - it feels a bit odd texturing upside down. I also give a little more UV space to high priority aspects like the face, shield and chest boss. Less important object such as random belts and undergarments get less space. Some time is spent arranging these islands into a nice tight UV layout. It is like a puzzle, you can also use the nudge or lattice modifiers in Maya's UV layout to fill up unused spaces, but be careful you do not stretch your Uvs too much though. Check your model UVs with a checker material often to make sure the layout looks ok.
The character model was set out with two core UV sets: One UV set was all soft materials and was based on an Albedo/Spec/Roughness/Normal material shader. The second set was all hard surfaces, specifically metals. It was set out in the metalness work flow of Albedo/Metalness/Roughness and Normal maps:
Step 04: Texturing
Maps were baked from the Highpoly model onto the lowpoly model using XNormal. Primary maps that were baked and used for the texturing process were:
- Normal map - Used as a Normal map and also used to generate various utility maps such as detail maps
- Ambient Occlusion Map - Used as AO, plugged directly into the PBR shader
- Cavity map - Can be used as a dust/dirt crevice control map and sometimes added to the AO map
- Bent Normal Map - Can be used for lighting in the RGB channels. Don't use this trick too much with PBR shaders though; it's more of a stylized texturing trick
- Curvature map - Great as a control alpha map to apply things such as edge wear
- Vertex colors map (For ID map or any PolyPainting if used)
- Translucency map (Head only) - used as a thickness map for SSS skin
Textures were created in Photoshop, 3D-Coat, and the Quixel Suite. Most character textures were authored at 4k and then crunched to 2k for the final game model. I used NDO from the Quixel suite to edit my Normal maps and curvature maps. From the map converter in NDO I create a series of detail maps from broad to tight detail from my Normal map that I use as masks on solid color layers to add effects such as edge wear and dirt inside crevasses; these were vital maps and very useful. Curvature maps are great to use as masks to bring in dirt to the crevices of your texture. I made sure the map was driving a solid color layer so that I could easily shift the colors later on in case I needed to make changes. Making the texture work flow as non destructive as possible would make changes in the future very fast and it also made making the evil version of the characters texture extremely fast to make.
Once I had constructed the majority of the texture in Photoshop and Quixel from the various bakes I took the PSD into 3D-Coat and added further detail where needed and fixed any seams on all maps, including the Normal map. In future I think I will probably go further into Quixel or with 3D-Coat as they are both great texture suites with full PBR ability, but for this project, Photoshop with some help from these two did the trick.
Step 05: Evil version texture swap
I also made an evil version of the original character. The use of very limited new items and then tinting or repainting some textures would achieve this new character with as little new work as possible.
- A second texture swap and a few new assets was produced to create an evil version
- A new helmet, pauldron and mace was sculpted for the evil version, and textures were created
- Two maps were updated, the metal / armor map set and the props set for the above items
- The base fabrics and skin map set was simply tinted or repainted and the geometry did not change
Some spikes were modeled and fitted onto the texture sheet. They were then placed on the character's armor to give him more of an evil look. The Albedo Map is one of the maps that controlled a lot of the new look of the evil version, and it was a very fast process to change due to using solid color layers controlled with masks.
Step 06: Setup in Marmoset
A simple rig was set up in Maya and then the character was imported as a triangulated posed mesh into Marmoset Toolbag 2. Most shaders were based on the Quixel Suite presets in Marmoset as that is what I had worked from in Photoshop.
Armor and weapons were set up as a metalness shader with their own maps.
Soft surfaces, skin and fabrics was set up as a Spec/Roughness shader with their own maps.
The skin was the most complex material as it had maps piping into Marmoset's skin shader to get a nice soft skin effect in render. For the skin the usual maps were used such as Albedo, AO, Normal, Roughness and Spec, but then a Subdermis, Translucency, and Fuzz maps were used as well. XNormal can bake a thickness map and I used this as the base for my Translucency map. This would mimic the slightly transparent areas of thin skin on the character such are ears, nostrils and eyelids.
Lighting consisted of a default IBL set to a very low intensity, this acted as a generic base fill light. There was one primary key spotlight set of to the side of the character.
Four other point lights were added as fill lights or kickers to illuminate parts of the character that were hard to see. These lights often had very soft shadows or none at all. I would love Unreal and Marmoset to have some form of light linking in the future, but it seems there is none for now. Screen space Ambient Occlusion was put on, but at a very low setting. Small amounts of bloom and screen vignette were added too, but I wanted the asset to speak for itself, so these were kept fairly low.
Step 07: Final Marmoset grabs
Here are some final outputted screen shots of the good and evil version of the character as seen in Marmoset Toolbag.
Step 08: Final presentation in Unreal Engine 4
The character was also put into Unreal Engine 4 to see how it looked in a production engine. I also added the ground I had made earlier for the character to stand on. Instanced grass was painted on the ground in UE4 and the displacement map was applied to the ground with adaptive tessellation turned on.
Step 09: Conclusion
Special thanks to these people for the helping me on this project:
- Faghrie Coenraad and Ruan Else - who helped me by modeling / sculpting and texturing the weapons.
- Lynton Levengood - For the great concept art.
- Paul Lombard - For tech support on the rig and support in Unreal Engine.
- Triggerfish games division - We did this pipeline test on site at the studio, thanks for the opportunity.
Thank you for reading this tutorial. If you have any questions were I was unclear, feel free to contact me at:
samking3d (at) yahoo.co.uk