Character Artist Ian McOran-Campbell talked to us about Cinis project, sharing an in-depth breakdown of The Aloadae characters, inspired by historical pieces found across the Mediterranean and brought to life with ZBrush, Marvelous Designer, Substance 3D Painter, and Marmoset Toolbag.
Introduction
My name is Ian McOran-Campbell, I am a Character Artist with a background in design and concept art. I love creating and fleshing out interesting characters. I began my journey as a concept artist, and as concept work began to bleed over into 3d work, I decided to take it a step further and fully realize the characters I was envisioning.
Today I am working in the industry but this latest artwork is part of an ongoing personal passion project called Cinis. Cinis is the culmination of my efforts as not just a character artist but also my first foray into art direction and proper world-building. These characters also function as set pieces and help establish the design language for their own perspective environments and setting in the game project.
Inspiration
I am a huge historical arms and armor fan. A lot of my work, this project being no different, begins with examining historical examples of arms, armor, and clothing. History, I find, can be the best resource for consistent inspiration. My previous work had often taken inspiration from historical Central European pieces.
This project I wanted to do something different and look elsewhere for inspiration. The bulk of the references I gathered hail from the Eastern Roman or Byzantine Empire and into the Ottoman Empire as well. This being not only a huge area of time but land as well I had lots of resources to pull from. I was particularly drawn to the Mediterranean area which was rich with interesting textiles, metalwork, and silhouettes.
Getting Started
My design process begins with identifying the silhouette I find most appealing and will motivate the rest of the process. Silhouettes then break up that shape with internal lines.
I keep my concepts loose as this allows me to still stay creative in the sculpting/modeling phase. I find my most intelligent designs don't overdo the initial design phase and let the process help inform the design.
Modeling
Now, getting into modeling, I like to again revisit the silhouette by just using primitives and rough shapes to create the shape I like.
I use Blender for most everything modeling these days as I find it the easiest to hop in and out of and work iteratively, which is my preferred way of working. I am constantly utilizing Blender in conjunction with ZBrush.
Working in a professional setting I am not often given the luxury of time and skip a lot of these steps in order to get making as fast as possible. In my personal work, I really cherish the early stages and setting myself up as best as possible for something great.
With the silhouette established I am moving onto cloth. Marvelous Designer is my software suite of choice for all things cloth.
In Marvelous Designer, I am only looking to get nice folds and a good simulation. The shape and position I often adjust later as I find it easier to move things around manually in ZBrush after the fact. The important things to include in your simulation are any areas where the fabric would be pinched or compressed.
I use the Pin Box tool to establish the draping in these areas in addition to adding pieces of fabric over top to simulate the layers of the garment I will model later. It is also possible to accomplish some of this with morph targets by loading in your avatar with its components and then having those components morph to the correct locations to pinch the fabric.
I personally like to get in and out as quickly as I can and make changes in ZBrush as I mentioned so I don't normally use this workflow and will do manual adjustments instead.
So now with my rough simulation in place, I perform a modeling pass on the surrounding elements.
I tend to fixate on headgear and this project was no different. I find that a lot of the design time for me goes into the head area. Not only is it often the center of attention, but it also establishes a design language that can be extrapolated throughout the remainder of the outfit. I tried a bunch of different helmet shapes before landing on one.
With a more detailed blockout of the first type of headgear, I am going back into ZBrush and doing a high-poly pass.
Funnily enough, as things usually go for me, I ended up with a totally different helmet by the end of the high-poly phase! For me the design process is ongoing and I am continually tweaking or adding things.
I tend to have my high-polys only carry the base information and any kind of high-frequency details I'll do later in Substance 3D Painter.
I am focused on smooth shape transitions and any large details. For instance, the damage to the helmet and some simple engraved details are all I will include in the high-poly from ZBrush. With the basic high-poly done, I can take the discoveries I have made and apply them to the rest of the outfit. I also went back and added some other cloth elements to the helmet to try and get it to blend in with the more cloth-heavy body area.
For this project, I also wanted to experiment with a new way of approaching chain mail. I was unsatisfied with my usual workflow of just using a smart material in 3D Painter and wanted something that felt more intentional and 3D.
Fellow Character Artist Kaloyan Kalamov was gracious enough to give me some tips on chain mail creation. As per his advice the workflow I ended up adopting involved simply taking a base chain mail section and duplicating it along a curve in ZBrush using Insert Mesh brush. To break that down a bit more, the base section is composed of the weave of the chain mail.
I wanted to recreate a traditional historic style chain mail and went with a typical 6-in-1 pattern. With your base link modeled, you can then orient it so that the links fit together in your desired pattern and can be duplicated and still link together. It's also a good idea to keep these fairly low-poly but to add a loop adjacent to any edges you want to keep harder when you subdivide the links. It's much easier than having to worry about creasing edges in the future.
With this step complete, you need the mesh you'll actually draw the chain mail onto. For the helmet, I wanted a simple aventail so I modeled out the coned neck piece keeping in mind to have the topology as evenly laid out as I could keep it. This will help with having evenly spaced sections of chain mail but is not essential as it can be adjusted later in ZBrush.
Then you can move into ZBrush and convert your chain mail pattern mesh into an IMM brush. Next, the base piece for the chain mail to be drawn onto comes into ZBrush. We will need to make sure our chain mail IMM is set to curve mode and then we can turn our horizontal edge loops on our base mesh into curves.
My personal way of doing this is using the ZModeler tool and creasing the edge loop and then in the curve menu converting creased edges into curves. With my curve now drawn out, I can set the brush scale adjust the spacing for the IMM brush, and draw out the first section of chain mail by just clicking on the curve. You may need to go back and adjust the curve spacing some more to get everything to link up nicely but with that done you then just repeat the process going up the length of the base mesh.
You also may need to insert additional edge loops or slide existing ones around to get the chain mail to link together at the top and bottom. I also always have each individual row of chain mail in a polygroup so I can easily go back and move it around manually to get the fit just right. After that, you can just bake the chain mail onto your base mesh with opacity and it's good to be textured!
This is also a great workflow for having chain mail intersect with other elements as you can have full control of the shape and where each individual link terminates. Also, you will see some clipping in the image, but I am not worried about this as the chain mail is to be baked onto the plane below which does not have any clipping issues.
With chain mail sorted and having a better idea of the overall design language from polishing the helmet a bit further, I then went ahead and began giving the rest of the outfit a high-poly pass in ZBrush.
I kept a lot of the secondary detail out of my high-poly pass as I wanted the challenge of getting believable details in using Substance 3D Painter to try out some new workflows. Keeping everything fairly simple, I always leave out the weave pattern on my clothing and just add in memory folds.
Working with a very rough concept, I like to be able to do lots of experimentation in the texturing phase and so leave myself as much room as I can. I do however consider at least the type of fabric whether it be heavy and thick or light and drapey to come into my sculpt to better distinguish the clothing weights. However, the actual intricacies of the material come in during the texturing phase which I will elaborate on later.
Topology & Baking
With our high-poly complete I'm onto retopology. I wish I had some useful insights to share for this stage but I just use the tried and true method of hoping in 3DCoat, turning on Lord of The Rings, and wading through the tedium of retopology.
With my retopology complete and my sanity waning I can start on UVing. Once again nothing fancy here, I am using Blender for the UV layout, however, I am doing my best to have an even texel density across the UV sets with the exception of small details that may be mipped out in the engine, those get a bit of extra texel size.
I ended up with 9 UV sets and 110K triangles across the whole asset. The assets that needed opacity were arranged into similar UV sets to avoid having too many materials being two-sided in the engine. This is just something worth doing as it is a free performance.
However, there's only so much I can do as we have interchangeable armor pieces. So additionally I also need the UV sets to follow our equipment system as well. It is also worth noting that if I have mirrored UV shells, I will move one of the mirrored UV shells outside of the standard UV containment area. This is so that baking goes smoother and you don't end up with mirroring artifacts.
Following the UVs, we can finally start to see the outfit coming together in the baking phase. I do most of my baking directly in Substance 3D Painter but will occasionally also utilize Marmoset Toolbag for the ability to manually adjust the baking cage. This can be really handy for clothing or anything with peaks and valleys close together.
Baking is a straightforward phase if you have done all the tedious setup.
Texturing
Now onto the fun part and the phase I potentially spent the most time on. I really wanted to create a worn but still colorful look.
The textiles would be a big challenge for this, especially getting them to work together on some level. I wanted the outfit to look busy and cluttered but intentionally so. Material research is key for this phase and I really dove into period textiles and dyes. In my opinion, finding good references is half the battle. After that, it's just about executing.
I was doing this outfit and its variations alongside another more civilian-esque outfit so the textile research carried over between the two projects.
I was mostly drawn to brightly colored intricate fabrics and thought these would be a great way to draw attention to certain areas. I also wanted to use these to help show some of the twisting and turning of the cloth by having the undersides of the fabric be a different textile.
For the actual process of creating the textiles, I experimented quite a bit over the course of creating the numerous textiles seen throughout the outfits. Perhaps the most experimental method was actually photographing textiles from around my house and then using this to make it tile, and this to make a rough normal map from it.
Taking a good photo was tough and required playing with lighting to avoid as much baked lighting as possible. This was mostly used for lookdev purposes though I had one or two good results I ended up using. If I liked the end result but was dissatisfied with the quality I would proceed to a more tried and true textile creation process. I would start by selecting one of the fabric alphas I had previously made just using ZBrush Noise Maker or had purchased from other creators.
There are some great fabric alpha libraries out there that are accessible and produce great results, here is one I often use. In addition to that, Substance 3D has a huge library on its website of various textiles to use as a base. For the complex colorful patterns, I painted a 2048x2048 tiling mask (greyscale) in Photoshop referencing the material I like. Then I took that into Substance 3D Painter and placed my base material alpha in the mask fill layer so I could control the height intensity and the mask in a new fill layer.
I added anchor points to both layers and referenced the mask alpha with colors of my choosing. For the material alpha I also added a subtract layer with a blurry alpha to remove height detail sporadically throughout the fabric. This can help reduce the tiled or overly consistent look for finer materials.
I did a black and gray mask so I could select the different tones using the level adjustment in the fill layer. This is a very playful stage so I also experimented with layer blending options and keeping things loose. It also creates a more dynamic end result.
Also, play with roughness from these zones as well if you want to create a varied material look. For the demo here I just used extreme colors to help demonstrate.
With my colors and base height, I went to roughness. Here I was creating a color and roughness fill layer referencing the height alpha anchor I previously set up.
I included some base color so the roughness stands out a bit more. Then I did the same thing, adjusting the levels till I got something I liked with some contrast so it's visible from a distance.
The last step of my cloth material is edge highlights and grunge lowlights. I did this with one of the edge smart masks from Substance 3D and then added a subtract layer to remove the lows from the height mask. This just helps reinforce a strong textured look but is not always necessary depending on the textile you're going for.
For the grunge pass, I use another Substance 3D smart mask but for Ambient Occlusion this time. I kept this layer fairly subtle as it can easily make the AO too intense and create a stylized look. Depending on the desired age of the fabric I may also elect to add damage around the fabric using another height and color layer to create pitting or thinning of the fabric in areas.
In this example, I used a noise for the first fill layer then a cloud fill set to subtract with a blur slope filter on top, and lastly a subtract layer with my base fabric weave from the anchor point we set up.
This phase is the one to experiment the most and I wouldn't focus too much on the pattern itself but more on its overall appeal across the outfit. This method isn't the cleanest but it's very agile and a great base to build from with more detailed layers.
It's also important to consider the setting as I wanted these characters to be from a sandy environment. I added a dusty gradient coming up from the lower body. I did this using a combination of the ground dirt and cavity rust smart masks with some manual painting on top.
These subtle hints as to what kind of environment the character comes from help flesh out a believable character.
Another useful tool is 3D Sampler. I use this for creating embroidery patterns with this workflow:
I simply just export the final embroidery piece as a material to use in Substance 3D Painter. Here is that same painted mask plugged into 3D Sampler with some embroidery adjustments:
With my clothing textured, I want to share some similar insights into how I go about hard surface details.
Only getting the basic details from the high-poly lets me really get experimental with my hard surface detailing. Once again good references are important and I referred to a lot of Indian armor for inspiration.
It's important also to have a solid starting point aka metal material. You need to have in mind what kind of finish you want. For this project, I wanted a smooth polished but worn surface.
I find the important aspects of a metal material are base color variation with some contrast same with roughness and a layer of metal pitting on top. Edgewear and grunge, I like to adjust once my ornamentation is present so as to have a nice variety of values.
For detailing I often like to start with outlines. This is a great way to break up big shapes and can give it a more human touch. I use a small brush and draw in or use a mask outline filter to get the outline in then add a blur slope filter on top to beat up the line a bit.
When it comes to adding actual ornamentation, I stamp details into the height or normal channel using an alpha brush. Then reference that layer in the micro height/normal channel in my AO and edgewear layers to get a cohesive look. I'll often have separate edgewear and AO layers for my stamp in detail so I can have more control over the levels and intensity. A great overview of this workflow can be found here:
Of course, having a variety of metal materials present helps give a layered look as well. Just like with cloth texturing, it's important to play around with the many filters and layer blending options in Substance 3D Painter until you get something you like. That is the joy of this phase, never knowing what the end product will look like until it's done!
Rendering
With my looks textured I'm onto rendering. I first do a quick rough rigging pass to be able to pose the character for the scene. This is done on the base rig we have created for Cinis. All the additional elements that will end up needing simulation will be handled later by our freelance team. This initial rigging is just for rendering purposes.
The Aloadae was done in Marmoset Toolbag instead of Unreal Engine. While both are real-time I believe Unreal Engine provides a better end result with more control however the setup can be laborious. Unreal Engine is also my go-to for lookdev as all my personal work is specifically for a game built in Unreal Engine.
The Aloadae was done in Marmoset just to save time and to be able to easily direct lighting. I find the many different lights, light settings, and mainly materials in Unreal Engine more time-consuming to set up. So for this scene specifically, I wanted to have it be dark but still show off as much detail as possible.
We have a top-down main light source with a few bounce light sources and a rim light. With Marmoset, I like to tone down the environment lighting and put in lights for bounce light just so I have more control.
I also did a quick painting for the background image just something to draw the eye in. This can be a nice way to frame a character and give some more insight into their background.
In terms of rendering settings, I keep everything pretty standard just tweaks to sharpness and noise settings.
Conclusion
From start to finish this project took about 6 months. I worked on other things in between as I like to come back after a break to stuff like this for a fresh set of eyes. In terms of actual work time, this project was about 2 months and has 4 different looks with quite a lot of variations.
For me, the biggest challenges were easily the material creation – 30 or so diverse cloth materials with complex textile patterns. It really helped me flesh out my material creation pipeline and was a load of fun.
Cinis, my passion project and what these outfits were created for, has been my main source of continual growth as an artist.
I would highly recommend to all aspiring artists out there to get involved or create your own long-term project that will challenge you to create finished work that you yourself are passionate about. I have enjoyed and grown the most from the challenge of taking on art direction, concepting, and creating assets simultaneously.
To talk a bit more specifically about what Cinis is, it is ultimately the game I always wanted to play. A multiplayer medieval sandbox with a focus on directional skill-based combat. You can follow along with our progress on Twitter or Discord.