Creating a Stylized Viking Warrior in ZBrush and Substance Painter
James Hyun did a breakdown of his stylized character Viking Warrior made during the course Stylized Characters in 3D at CGMA.
Hi! My name is James, and I’m a 3D Character Artist from South Korea. I focus on making stylized characters and props for games and animation. I started learning 3D at Rochester Institute of Technology, where I earned my BFA in Film and Animation (focusing on 3D Animation). I graduated in 2017, but it wasn’t until early 2019 when I transitioned from trying to make it in 3D animation to focus on 3D modeling.
Before I started modeling and sculpting, I spent a little bit of time freelancing in feature animation and advertising post-graduation. I was lucky enough to contribute to Blue Sky Studios’ 2017 film Ferdinand as a Stereoscopic Technical Assistant. I also got to get my hands on a whole bunch of projects ranging from TV and online ads for brands like Verizon and Cinnamon Toast Crunch, content for billboards in Time Square, etc. as an Assistant Editor at a post-production company called CHRLX.
I recently finished a remote freelance contract as a Junior Character Artist with Stalwart Games, a game studio in LA, so I’ve been focused on personal projects these days to grow my portfolio and skillsets. I recently finished my latest character piece Egyptian Mage, check it out here. I’m also open to new job opportunities!
Viking Warrior: Goals
I took Hannah Kang’s Stylized Characters in 3D course from July to September of 2019. I was going into the class with a generalist knowledge gained from university, and some extra modeling know-how learned from YouTube and Gumroad tutorials. I wanted to put my accumulated knowledge and skills to the test and make sure what I was doing was fit for studio production. With Hannah’s professional modeling experience at Legacy Effects and DreamWorks Animation, I thought the class was perfect for me.
Our first week’s assignment was to come up with a handful of concepts that we wanted to sculpt, and the Viking concept was not actually part of my initial selection. In my efforts to make the most out of each character I tackle, I have a small list of guidelines that the concept I choose should meet. These requirements include points such as “does the concept have hard surface elements?” and “is this concept going to challenge me in a way that I haven’t been pushed before?”, etc. To be honest, none of the initial concepts I brought to class hit the nail for me. I was paying a premium for this course and had this valuable opportunity to get one on one time with an industry professional, so I wanted to challenge myself and give it my all. So in week 2, when we were supposed to start blocking the concept of our choosing, I instead continued my search and stumbled upon Viking Warrior by Kim Sunhong on ArtStation. The moment I saw the design, I instantly knew I had to give it a shot. It was beautiful, it was complex, and it had a back view, which really helped out. The character was just detailed enough that it would pose a challenge, but still doable if I pushed myself and made the most of class.
Approach to the Character
I’d say my ZBrush workflow is nothing out of the ordinary: low res blockout – high res dynamesh sculpt – retopology (typically in Maya) – high res projection onto the retopologized mesh – finish high res sculpt on retopologized mesh.
Earlier in 2019 before taking the CGMA class, I had taken a full stylized character and hard surface tutorial by Matt Thorup (aka the RedBeard) and an anatomy tutorial by Rafael Grassetti. These really helped me learn a typical ZBrush pipeline and basic anatomy before getting into the CGMA course. It also gave me more opportunities to ask Hannah questions pertaining to my character specifically and get information only possible in a closed environment like a class, rather than spend time on generic knowledge you can get outside of class. You can learn typical workflows and anatomy on platforms like YouTube and Gumroad, but discussing project-specific techniques for a particular type of hair (as an example) can only be done when you have direct access to a mentor/instructor.
Because the Viking concept was a little more on the realistic side of the spectrum, Hannah and I did extra work on the character’s face to stylize it a little more and fit the purposes of the class. I also approached the fur on the character in a more stylized fashion (rather than using hair cards or Xgen) as I had never done stylized polygonal fur before and it was one of the challenges this character presented. A blobby base shape of the fur was placed appropriately and detailed with Simon Chapman’s Fur Brush set. To keep the character from looking overly noisy and maintain a stylized look, I made sure to vary the shape and sizes of the fur clumps, laying down the larger clumps first and filling the gaps with smaller tufts after.
Overall, I tried to find a balance in the detail level to be believable but not necessarily photoreal. I think my personal sweet spot is that “stylized but not overly cartoony, and realistically proportioned but not photoreal” look if that makes any sense to you. This meant my character might include more detail than your typical “stylized character”.
Smaller details would be added later through textures, but any larger surface detail that cannot be tiled (such as stitching, pores, etc.) was sculpted in ZBrush. While these details can be done in a texturing suite such as Substance Painter, I personally had more access to tools in ZBrush for such purposes at the time. Since then, I have slowly been amassing more tools for Substance Painter so that I have flexibility in what stage I add surface details. Whether you add details in the sculpting phase or texturing phase, they both have their own pros and cons.
UV mapping was done in Maya just before posing the character when she is still in her A pose. Nothing out of the ordinary, I try to pack the UV map as efficiently as possible without overlapping and keep separate materials grouped together. This wasn’t a game character so there were no worries for how many UV sheets were being used.
Back in ZBrush, once the character is posed with the Transpose Master tool, I pick a subdivision level for each subtool that is high enough to retain the shape and larger details of the mesh but would not bog down the texturing and rendering process. I export out this version of the character as a .fbx file to use in Substance Painter and UE4. I also baked the normal and height maps from ZBrush to use in Substance Painter. Any masks and color maps I painted in ZBrush will be exported for texturing as well. Bakes can be done within Substance Painter too, but at the time of making this character, I was more comfortable with baking in ZBrush. It’s all up to you in what pipeline you use!
Like I mentioned before, my characters aren’t super cartoony, and considering the detailed nature of the concept, I tried to pack in as much detail into the textures as possible without going overboard. Having “just enough detail” is a fine line to ride and is something I still struggle with today. I wanted the character to be beaten up with wear and tear from her previous battles. You’ll find fabric and leather patterning, dirt grunge, scratches, splatters, stains, blood, etc. all around which were done with a mixture of customized Substance Painter materials/smart materials, purchased alpha textures, and hand-painted methods. I’ve personally gotten a lot of mileage out of Travis Davids’ tileable texture packs for adding detail on almost any surface.
For the hard-surface elements, once the overall shape of the model was made, I gave it a generous amount of subdivision levels. Then, I masked the shape of the design and simply pushed it in or out with the 3D gizmo. Make sure the mesh has clean and even topology when doing this so that the pushed faces won’t cause too much aliasing and require minimal cleanup. I often like to start hard surface elements in Maya rather than in ZBrush due to Maya’s more comprehensive topology manipulation tools, but ZBrush 2021 is supposed to have added new topology features so maybe I’ll be able to keep the process entirely in ZBrush with the new update. I didn’t retopologize afterward to conform to the design at the time, but in hindsight, it would have been a good idea for optimizing the mesh.
For her hair, I started with a rough block out to get the overall shape. Then, I smoothed and retopologized the block out to get the underlying shape that the hair strands would be placed on. For the hair strands, I used the RB Flat Hair Brush, provided in the course by Matt Thorup I mentioned earlier. For her shaved side, I simply placed geometry inside the character’s head and pushed out where the shave would be.
I like to render in real-time due to its time savings and near-instant feedback. Yes, traditional render engines can give better image quality, but my lack of patience, increased visual fidelity, and time savings keep me allured to working in real-time. I’m personally a firm believer that with the development of technology (especially real-time ray tracing!) there will be a convergence of traditional and real-time rendering sooner than you think!
Anyway, Viking Warrior was rendered in Unreal Engine 4.23, the latest version at the time. The lighting setup started with a base studio HDRI plugged into the “Sky Light”. I added two directional lights for the key and fill lights respectively, and two vertical “Rect Lights” on the rear left and right sides of the character for rim lighting. For supplemental lights, I added a small “Rect Light” in front of her face, and a larger and wider one on the floor looking up. The “Lightmass Importance Volume”, “Post Process Volume”, and the “Sphere Reflection Capture” objects are also critical in getting pristine renders.
One thing to note is that for all the textures used on this character, I forced the texture mipmap levels to be lower than the default values, thus producing higher quality textures in the viewport even when the camera was far away from the character. While this can create unwanted visual noise particularly in lower resolution renders and video, for the high-resolution static images that I would take for my portfolio, it was the perfect solution. While you can completely turn off mipmap levels per texture, I personally reduced the mipmap values in the master materials. You’ll want to decide for your particular project whether you want no mipmap levels at all or if you want to reduce the mipmap level visible based on your camera/viewport. This video by Elias Wick was one of the many that helped me figure out mipmap levels:
For the actual raw renders from the engine, I used the “High-Resolution Screenshot” function at roughly 6K resolution. Why so high? Mostly just because I can and to have more information when doing touchups in Photoshop. In hindsight, 6K was probably overkill and ate up more file size than necessary. I’d recommend sticking with around 4K resolution unless you have the processing and storage headroom and like super high-resolution images (I mean, who doesn’t like high-resolution images?).
For the turnaround video, I used the “Sequencer” feature and exported it at 2K resolution. A group was created for the character mesh and keyframed to rotate 360 degrees for the turnaround. To render in the “Lighting Only” view mode, you’ll have to open the Level Blueprint and enter the command “viewmode lightingonly” in the “Command” section of the “Execute Console Command” node. Then, plug the “Event BeginPlay” node into the “Execute Console Command” node, compile, and render from the Sequencer.
One of the challenges with this character was figuring out how to get the highest quality renders possible from UE4. Since I was only concerned with visual fidelity, I pushed the poly count, texture resolution, lighting quality, render resolution, etc. all to the max that my PC could handle. A lot of time was spent tweaking mipmap levels, antialiasing methods, light settings, etc. and fighting with glitches, engine quirks, and small mistakes. Also from my understanding, the default anti-aliasing method in UE4, Temporal AA, doesn’t even work when exporting videos from the sequencer or while in-game. Why is that the default AA method? I’d personally recommend you change that to FXAA or MSAA in the Project Settings section.
The lighting itself tends to pose challenges for me as well because lighting isn’t my specialty. The end results usually work out as long as I put in enough time adjusting and testing but I often go through a process of self-doubt in the beginning when things still look ugly (which is similar to my sculpting process too). I start off with the typical three-point lighting setup and build up to a more complex system.
It’s been almost a year since I finished the Viking Warrior, and while I’ve learned so much since then and there are aspects that I would have done differently looking back, it is still one of my favorite projects. It helped me get my first character artist job with Stalwart Games, and I am very grateful to Hannah for all her help during and outside of class. Further thanks to fellow artists and former CGMA classmates, Jason, Ahmed, and Joseph. We all still stay in touch and this connection and networking has been one of the valuable benefits of CGMA.