Learn How to Work on Skin & Hair Using Unreal Engine

Sana Almusalli Alawadhi shared a thorough breakdown of the Drift project, explaining in detail how to create hair using XGen and showing the process of texturing skin.

Introduction

Hello everyone, my name is Sana Almusalli Alawadhi, I am an Emirati character artist who has just finished her studies at Think Tank Training Centre. As a kid, I always loved to draw, but as I grew older and started to think of ways to live through my hobby, I came across 2D concept art creation, which seemed very appealing to me at the time. However, after a couple of years of trying to learn and make concepts, I realized I enjoy the process of recreating concept art in 3D more than creating concepts in 2D.  

Most of my knowledge and skills have come from where I studied. I started with a few 2D and 3D courses from CGMA, followed by 3 years at Howest University where I learned a lot of my general knowledge in regards to 3D asset creation, basic rigging, and some basic programming. And then finally Think Tank Training Centre where I learned a bulk of my knowledge in regards to 3D character creation. 

Prior to the Drift project, I worked on a few other school and personal projects where I tried to learn various things. I always try to focus on a few specific things with every project I work on, so for example the previous project was more focused on Marvelous Designer and improving my modeling skills in regards to organic and hard surfaces. This project was focused on improving my skills in sculpting the likeness, the expression, the textures, the hair, and the final presentation along with lighting. 

The Drift Project

The Drift project was the final assignment I had to do at the Think Tank Training Centre. I was tasked to recreate a 3D character from a concept art along with Denis Melenets, my mentor, who had been an amazing mentor and I am really grateful for all the guidance and feedback that he has given me while creating the character.

As for the concept, I decided to go with one of CABORO’s Team Drift designs. The Drift concept stood out to me as a really fun and interesting design. It included a lot of things I really enjoy making, like shoes, a rifle, a backpack, and an interesting outfit along with such a dynamic pose and such a cool-looking character.

One aspect I really liked about the concept was that a few of the elements were from real life so I was able to get really good references. Some examples would be both the Adidas shoes and the rifle and I also felt that the character seemed a bit similar to Michael B. Jordan so I was able to use him as the likeness. I was also able to have a bit more creative freedom with the other parts of the concept which was fun to recreate. 

Head

Since one of my focuses was on the likeness, expression, and texture of the head, I decided to use base meshes so I didn't have to spend too much time on the retopology and the UV aspect of it. So I ended up using a head I had gotten from the 3D Scan Store and the body was brought in from MetaHuman. 

I originally wanted to use both the head and the body from MetaHuman since I could use the rig to create the pose and the expression. However, I decided against that since I wanted to recreate the expression myself so I could learn more about sculpting expressions and so that I could easily use the HD details of the head textures from 3D Scan Store. I then used Zbrush to try to create a likeness of Michael B. Jordan to get it as close as I could with the help of my mentor, Denis Melenets. 

Hair

For the hair, I started with a simple blockout in ZBrush to be as close to the concept as I could. Once I was happy with the block out, I exported it to Maya so I could use XGen to recreate the hair. I used the twists of hair as my guide to add XGen guides through them.

For the modifier, I used the techniques shown in these videos by Trigon and Hadi Karimi. Trigon shows his workflow and how he creates the fade for his project, while Hadi Karimi shows a timelapse of how he created the dreadlocks. I took in most of what I saw from those videos and tried to adjust modifiers to match my character’s twists and fade.  

Outfit

I started making the outfit, the glove, the socks, and the backpack using Marvelous Designer. I was able to get some patterns online for the shirt and the shorts, which I used as a baseline to recreate the garments. I then took a bit of time to adjust the size and the designs to match the concept more. 

During the outfit creation, I decided to go for the posed version rather than posing it later. Since I hadn’t tried creating a character this way, I was interested to see how much detail I could get by going for the posed version from the start.

I originally wanted to use the MetaHuman rig to pose the character, however, I was having some issues with importing that to Marvelous Designer, so I decided to use Mixamo to get a quick rig that I could then animate instead. 

So I uploaded the body into Mixamo to get a rigged body, I then downloaded the body from Mixamo without any animation and brought it into Maya. I did have some issues with the skinning which I then adjusted and then finally used the rig to pose the body.

I felt like creating an animation to morph the outfit from A-pose to posed would be easier to manipulate. So I created an animation where at 0 I have the A-pose and at 120 frames I had the posed version. I then exported the body with the rig as an FBX and imported it in MD as FBX with the animation. Once I was in MD, I hit record in the Animation Editor and the animation would play while simulating the changes to the clothes. You can also slow down the animation or even add some wind which I also like about this method. 

I later added some extra meshes which would help me create some more realistic tension points for the garment. 

For the backpack, I created a super quick base in Marvelous Designer, which I then brought to ZBrush to adjust as my blockout, and then took it back to MD as an extra avatar so I can keep checking the MD backpack to it as a reference. Once I was happy with the sections and details I had added in MD I then took it to ZBrush and tried to add as much detail as I could. 

Marvelous Designer to ZBrush

I like to use the workflow Jayson Fitch taught us in his CGMA course, which is using the MD meshes to retopo the flat 2D meshes, transfering the detail to the 3D mesh, and then adding thickness in ZBrush. 

For this workflow, the UV needs to match the 2D arrangement so that we can later transfer the UV based on world location. 

  • In MD go to the UV editor, right-click, and select Reset UV to 2D Arrangements 
  • I have to export 2 versions of the outfit:
    • The 3D version
    • The flat 2D version
  • In order to get the 2D version 
    • Select the garment in the 2D window 
    • Right-click in the 3D window
    • Select Reset to 2D Arrangement (Selected)

I then take the exported mesh to Blender to create a better topology so that I can sculpt on it.

  • When creating my outfits in MD, I like to use Layer Over or Layer Under for my garments to add more details, but when I am creating a retopo version for sculpting, I only work on the visible layer.
  • The pink mesh is the low poly version I made on top of the 2D garment that I brought in from MD. I like to use the shrink wrap modifier in Blender so I can follow the 2D mesh
    • I also like to use the offset Above Surface so that I can see the mesh properly
  • Using the Mesh Data Transfer plugin made by Maurizio Memoli, I first transfer the UVs from the 2D mesh, then transfer the shape from the 3D mesh using the UVs we just transferred. 

The source is the HP 2D mesh with the UV – we want to transfer the UVs.

The source is the HP 3D mesh – we want to transfer the shape.

Subdivision by 5 because when we add thickness in ZBrush, we will need to reconstruct subdivision.

  • Apply the subdivision and then re-transfer the shape again
  • Export to ZBrush and check if reconstructing the subdivision works
  • If so then add thickness using PanelLoops
  • Mask the polygroups in the inner part of the clothing
  • Grow the mask a bit and blur the mask
  • Smooth out some areas by the smoothing brush
  • Add memory folds and seams and any other details that are needed
1 of 4

For the shoes, I started with creating blockouts in ZBrush and then once I was happy with the detail placement and the silhouette of the blockouts, I would go to Blender and fix the topology for the HP and add smaller details.

I really enjoy using Blender since I can use the modifiers, so I can continue to change some parameters for a while before I have to commit to it. Parameters like the bevel size, the thickness of a mesh, or the subdivision amount. 

1 of 8

Rifle

As for the rifle, before I start modeling the mesh, I like to gather around my references for the sides and if possible for the top and bottom as well. I like to add these images into Blender as Reference meshes.

After I am happy with the references, I start with the modeling. There are 3 types of workflows I like to go by to create weapons:

  • The first would be by creating basic meshes with a low number of polygons and then using modifiers to create the high poly. I like to use the mirror, bevel, and subdivision modifiers. I like this workflow since it allows me to make quick modifications to the silhouette, the shape, or the bevel of the edges if I need to.
  • The second one is the boolean workflow, which I like to use when there are more complex details that would take longer if I use the first workflow. I like to create the necessary meshes for the boolean operation in Blender and then take the mesh that has been cut into ZBrush so that I can use DynaMesh and Polish to create a less sharp cut. 
  • Another method I like to use is by creating a blockout in ZBrush and then taking the blockout into Blender. This is mostly for visual purposes, just so I could understand the plane changes and the flow of the meshes a bit more accurately when I am having difficulty understanding some shapes. 

I used the boolean workflow for the meshes with the pink materials. 

The accessories were also made in Blender, using the array and curve modifiers.  

Retopology

The retopology was done with Blender since it has a few modifiers and tools that I find useful. 

For some of the meshes, I was able to use the same mesh that I had used to create the high poly, while for others I had to start from a single face and extrude it till I had a low poly that I was happy with. 

  • I enjoy using the shrink wrap modifier, I like to increase the offset above the surface so I can see a bit better. 
  • I also use the sculpting tool to either use Slide Relax to smooth the topology without affecting the silhouette or use a few other tools in Blender like Space and Relax to space out vertices or to relax them.

For unwrapping, I used RizomUV, which my mentor, Denis, introduced me to. I absolutely loved it, it was a great tool for quickly creating good and optimal UVs since it has many shortcuts which I like to use and it was actually fun to UV with. It also had a nice packing tool with a lot of different settings which could be used depending on your needs. 

Texturing

Skin

As mentioned previously, I wanted to use a 3D head from 3D Scan Store (HD Male 3D Head Model 43) so I could take advantage of their textures. In addition to that, I also rebaked the cavity, curvature, concavity, and the normal map in Marmoset Toolbag so I could use them in Substance 3D Painter. Since I wanted to render the final piece in Unreal Engine, I needed a few more channels to make the skin more realistic. I added a translucency map (sss) for the opacity node in UE and the Detail Normal Map.

I then applied the textures I had from 3D Scan Store, the base color, roughness, cavity, and specular map. I also added the original normal map but only to some areas so I could increase the areas that felt like they needed more after the baked normal was added. 

I started with removing some of the wrinkles and excess stubble in the texture. I then started to adjust the base color to match my concept better. 

I then added in some damages and light bruises to add some extra detail to add more story to the character. 

Skin Material in Unreal Engine

I changed the shading model to Subsurface Profile and selected one. I duplicated an existing Subsurface Profile so I could adjust and edit it if I wanted to later on. 

  • Base color: Base Color texture map is multiplied by a 3 vector parameter (for tint color)
  • Specular: using a contrast and a multiply node to adjust the Specular texture map, which is then multiplied by the cavity map
  • Ambient Occlusion: using a contrast node to adjust the AO map and then multiplying by the cavity map
  • Roughness:  Roughness map is multiplied by a parameter to adjust the map if needed. 
  • Metallic: Metallic map
  • Normal map:

using the FlattenNormal node with the normal map so I can increase the intensity of the normal map if I need to.

I also use a Detail Normal map (using TexCoord to adjust the tiling) with a FlattenNormal node to decrease the intensity on the areas based on the Detail Normal Mask. This is then connected to another FlattenNormal node to adjust the intensity of the Detail Normal Map.

1 of 6

Fabric

Before I started the texturing of the outfit, I first gathered some references of how I would want my end result to somewhat look like. I also like to add some notes to my references so I can note down the things I like that I would like to add to mine as well: things like mud, dirt, markings, scratches, oil marks, maybe sweat marks, or even gradients. Once I am happy with my references, I then start to work on the textures. 

For the fabric texture, I used a Smart Material that I had created using the lectures from Jayson Fitch during the CGMA course. 

  • I started with the Base Color and added the fabric rough material from Substance 3D Painter
  • Added the color variation
  • Then added the pulls and heathering and pilling
    • These were done using vertical texture maps like the Anisotropy texture map stretched in either the vertical or the horizontal axis
  • Then added some creasing and memory fold in the height channel 
  • Added some color and height to the stitches and their borders
    • These were previously baked as material IDs in Marmoset Toolbag 
  • Added some additional coloring using baked maps
    • I like to use the AO, Curvature, Cavity, and Convex to add very subtle lighter or darker coloring to the texture
    • I also like to use some vertical gradients to make it lighter at the top and darker at the bottom
  • Added the dirt and damage to the fabric 
    • I like to add some scratches, some mud or dust or sun damage here
  • Adjusted the color using the HSL on a passthrough layer to match the concept in UE
  • I rebaked the AO so that there would be some shadows where other meshes are very close by

I used this workflow on the shirt, shorts, backpack, pouches, and the glove. 

Fabric in UE:

Change the Blend mode to Masked and the Shading model to Cloth.

  • Base color:  
    • Non-Fabric Mask: for parts that aren't fabric so that the fuzz does not affect these parts
    • Fuzz: using the Fresnel node to be multiplied with a 3 Vector (tint)
    • The Fuzz is then multiplied by the Non-Fabric Mask 
    • Base Color is multiplied with a 3 vector (tint) and added to the Fuzz minus the Non-Fabric Mask 
    • Used a desaturate note with a one minus to add a parameter to adjust the saturation if needed
  • Metallic: metallic 
  • Specular: 1 vector of 0.45
  • Roughness: the roughness map is used in a Lerp node so that I can control the lightest and darkest if I need to. It is then added to another Lerp node with the Detail Normal map as the alpha 
  • Cloth: the translucency map is multiplied with a Vector 1 so I can edit it later on
  • Ambient Occlusion: using a DNM to add extra AO to the fabric. This is then multiplied by a 1 vector node and into a Lerp with the AO texture map.
  • Normal map
    • I used a Detail Normal map (using TexCoord to adjust the tiling) with a FlattenNormal node to increase the intensity 
    • used the Lerp node with the normal map so I can remove the Detail Normal map on some areas using the Detail Normal Mask
    • Used the Blend Angle Corrected Normals to add the Normal information together
1 of 6

Rifle

For the rifle, I mostly used Eugene Petrov’s Handgun tutorial. I focused on the plastic material at first and then on the metallic materials. I started with the Base Color and material, added in the pattern/grains, added a lot of color variations and roughness variations, and then finally added some dirt/dust/damage. 

I used J Hill’s tutorial for converting the XGen to be used in UE, but this is the summary of what I did:

XGen to Unreal Engine

  1. Select the XGen hair in outliner
  2. Select Generate, select Convert Hair to Interactive Groom 
  3. Select an interactive groom, in the Attribute Editor go to the SplineBase and change the CV count if needed. I changed some of them to 15 
  4. Select the interactive groom, go to Generate, select Cache, and then export Cache Options
  5. Change the Cache time range to the current frame, otherwise, you will have an extra animation Groom in UE 
  6. Export into your UE folder. I created a hair folder to put mine in
  7. I created my hair material using the material J Hill shows in his tutorial
1 of 7

Here are the steps to bind the hair to the head using Blueprints while the head moves with either blendshapes and/or animation in the Sequencer:

1. Create expressions in ZBrush using layers and then export them to Maya:

    • In my case, I had 3 meshes for the head. I had a smiling mesh, a smirking mesh, and a blank expression. 
    • Select the expressions you want to have as blendshapes (in my case the blank and the smirk expressions) and then select the main mesh you want to use in UE (smiling expression in my case)
      1. Make sure the main mesh is the same expression you used when creating the XGen hair, otherwise, the head will have some clipping issues with the hair in UE
    • Go to the Animation Set menu 
    • Deform -> Blend Shape options -> disable In-between and apply
    • You should see the blendshapes in your Attribute Editor of the main mesh
1 of 3

2. Create a basic rig and animation for the head along with the eyes, teeth, and tongue:

    • For the animation, you can either make an actual animation or just set keys in the timeline in Maya so UE can detect an animation. 
    • I couldn't get the blend shapes to show in UE when I didn't have any animation so I added some keys at Frame 0 and Frame 120. 

Since I didn't want any animation for my head, I only set the keys as you can see from the screenshot of the animation window editor. 

3. Export as FBX in Maya and import to UE as skeletal mesh:

    • Select all the joints and the meshes (head, eyes, mouth, etc.)
    • Export as FBX
    • Make sure Animation is enabled
1 of 3

4. Change the rotation of the animation sequence:

    • In the Asset Details, in the Transform Tab change the import rotation 
    • And then click on Reimport Animation
    • In my case, the Y is 90 because I believe I have my Maya World Coordinate system as Z up. 
      1. You might have to experiment to see which axis you might need to rotate in. 
      2. An easy way to check is to take your head animation and add it to your level; if you see that it is not rotated properly, you need to change the import rotation.
      3. You can manually rotate it to see which axis you need to change the import rotation to.
1 of 4

5. Create a Blueprint animation for the blendshapes:

    • Select the Skeletal Mesh, right-click, select Create, and click Anim Blueprint
    • In the Anim Graph, add a Default slot node to the output pose 
    • In the Event Graph, add a Set Morph Target node 
      1. Add the morph taget/blendshape name in the Morph Target Name
      2. Right-click the Value and promote to Variable
        1. Change the Variable Name
        2. Enable Expose to Cinematics
1 of 3

6. Create binding of the hair with the skeletal mesh:

    • Make sure to import them with the correct rotation, otherwise, the binding of the hair to the skeletal mesh will have the wrong rotation!
    • If you forgot to import with the correct rotation, right-click groom in the content folder, click Reimport, and change the rotation there
    • For my groom, I had to change the rotation of Z by 180 and the scale by -1. You might have to experiment with the level to see which way you need to rotate and scale yours.
    • Right-click the groom file, create bind mesh, and then bind to the skeletal mesh 

Here are the videos I used to help me create the groom bindings: 

1 of 2

7. Create a character blueprint to bind the hair to the mesh:

    • Right-click in the content folder, click on the blueprint, and then the character
    • In the Components tab, click on the mesh 
    • Go to the Mesh tab and add your skeletal mesh asset
    • Go to the Components tab again, click on Add, and then type in Groom 
    • Click on the Groom, rename it, and add the groom asset and the binding asset 
1 of 5

If the groom mesh disappears, you need to go back to the skeletal mesh and in the Asset Details and enable the Skin Cache Usage.

7. Adding the blueprint to the scene to create a sequence:

    • Create a sequence in the level 
    • Add the character blueprint to the level 
      1. Select the blueprint in the outliner and in the Animation tab change the Animation Mode to Use Animation Blueprint and change the Anim Class to your Animation Blueprint (whatever you have it named as)
    • Drag the blueprint from the outliner to the sequence 
    • Click on the track button (+ symbol), click Animation, and click on your animation
    • Click on the Blueprint’s track button again and click CharacterMesh0 from the Components
    • Click the Track of the CharacterMesh0 to get the Animation Blueprint under Anim Instance
    • Click the Track of the Animation Blueprint and select the Blend Shapes
      1. You can manipulate the blend shapes here and you will see the expression change in the level 
      2. You can now key the values of the blend shape for your sequence
1 of 7

Rendering

I originally wanted to use Marmoset Toolbag for the renders, however, my mentor suggested I try it in Unreal Engine, and I’m so glad he did!

I struggled a bit at first since it had been a while since I had used Unreal Engine but once I got back into it, it was getting really fun to experiment with the materials and to see my character in UE. 

I started my project using the MetaHuman project available in UE since I wanted to replicate their character details and have something to compare my character to in regards to skin and fabric. Once I was happy with the result of my materials, I started creating a new level with my lighting. 

Before I started I knew I wanted to create a few different renders, one without a background and another with. I wanted to create some moody lighting with the one for the environment since I wanted to improve my presentation and lighting skills. 

I used a level from MetaHuman to help me start with the lighting, I then rotated them and adjusted the location and intensity to match my scene more. I also added a couple of extra rect lights in some areas to make it pop more.

As for the render in the alley, I used the same lights from the previous level and then added a lot of directional lights that I would disable and enable each render. This was also labeled so I could come back to it if I liked a certain lighting more than the other. So in the end I ended up with 9 lighting scenarios. 

1 of 2

I didn't change anything from the Post Process Volume, however, after I was done with the renders, I tried to experiment with the contrast and noticed the renders would look better with some. So I decided to edit the photos later on where I added some contrast. 

Conclusion

The Think Tank mentorship program was for around 4 months, and I took an extra 2 months to complete the project. My main focus during this time was to learn and experiment as much as I could, so I ended up taking a bit longer with this project. 

I faced a few challenges while I was creating the project, the main one was how I could animate the head while preserving the location of the XGen hair. This took a lot of trial and error and I had to read a lot of forums and watch a few videos since I kept having some problems along each step. But I’m glad to have been able to complete it how I had originally wanted to. 

My advice for beginner character artists would be to keep learning through videos and tutorials online with each step and each project. I found that doing so has helped me learn the most and has helped me level up my work the fastest. During this project, I watched a lot of really good videos and tutorials through YouTube, ArtStation, Gumroad, and Flipped Normals that helped me with creating this project. 

Lastly, I would like to thank 80 Level for giving me this opportunity, and another huge thanks to my mentor Denis Melenets, who has helped me throughout the process of creating this project. Thank you, everyone, and hope this article will be of some help, please don't hesitate to message me on ArtStation if you have any questions. 

Sana Almusalli Alawadhi, Character Artist

Interview conducted by Theodore McKenzie

Join discussion

Comments 0

    You might also like

    We need your consent

    We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more