If you’ve tried importing MetaHumans into MotionBuilder, you’ve probably found yourself looking at a face smeared across the screen like something from a horror movie. Not exactly the realism we’re going for!
But don’t worry – there’s a quick and easy fix using a little known MotionBuilder tool that’s been hidden in plain sight for over 20 years!
The Issue: MetaHuman Face Mesh Skin Weights
When you move your MetaHuman away from the centre of your scene, some of the vertices in the face aren’t skinned correctly to the joints in the head, creating this stretched or smeared effect. This usually means there’s some kind of problem with the skin weights.
Understanding Skin Weights
The what now? Skin weights attach your character’s mesh to the skeleton rig. Each vertex in the mesh, the points where the lines intersect in your mesh, is given a skin weight value that tells it how much influence a particular joints has over it – or to think of it another way, how much the vertex should follow it when it moves. For example:
- The vertices furthest from a joint pivot will usually only be skinned or weighted to a single joint with a weight value of 1. This means these vertices will only move when that joints moves, keeping everything looking solid.
- Vertices nearer the joint pivot will be skinned to the joints either side of the pivot point with a weight value that adds up to 1 – this could be an equal split of 0.5 and 0.5 near the pivot and 0.7 and 0.3 for these vertices further away, until we get back to the joints weighted at 1.0. The idea is to create a smooth blend between the position of the 2 solid sections of the mesh – kind of like a drinking straw when you bend it.
Diagnosing the Problem
So, knowing this, if we go back and look at our face mesh, it looks like the skin weights haven’t exported correctly and some of the vertices have ended up skinned to an object that stays at the centre of the scene – this can happen if a bone is missing and the weights get assigned to another joint causing the stretching we’re seeing here.
If we move the “FaceMesh” null, there’s no stretching. But if we move “root” or any other bone above it, we get the stretching. For some reason, it looks like some of the vertices in our facemesh are getting skinned to the FashMesh null, which is far from ideal.
After a bit of digging, it looks like the FBClusterMode on the object is being set to “Total100” rather than “Normalize” when it gets exported from Unreal. This means MotionBuilder is expecting skin weight values on the object to be between 0 and 100. Which is odd, because the skin weights in Unreal are normalized between 0.00 and 1.00!
What’s even weirder is, the skin weight values on the objects in MotionBuilder are normalized between 0.00 and 1.00!?!?! And weirder still is the fact every object you export from Unreal has the cluster mode set to “Total100”, but none of the issues. It’s only the face mesh and only those specific vertices.
The Fix: Using the Skins Tool
So to try and fix this in MotionnBuilder I decided to blow the dust off an old tool I’m not sure many people know about let alone use, and that’s where things got even weirder…but in a good way.
Way back in MotionBuilder 6, I think – that’s about 20 years ago – Autodesk introduced The Skins Window! The Skins window lets you adjust the skin weight directly in MotionBuilder – similar to Maya Paint skin weights tool, but with sliders instead of a paintbrush.
Just the job! The plan was to use the tool to change the weight vales on the stray verts to 1 so they’re skinned to head joint and Job done!
But it turns out it was way than that!
As soon as I dragged the FaceMesh to the skins window, it instantly fixed the problem. As easy as that! All you have to do to fix the skin weights is:
- Open the Skins tool by navigating to Window > Skins.
- Alt+Left-Click+Drag the face mesh into the Skins window.
- And that’s it! Fixed.
What’s Happening?
I’m not exactly sure, but based on another quick bit of python investigation it looks like simply adding the mesh to the Skins window changes the skin cluster mode to “Normalize”, which uses skin weight values between 0 and 1 – just like a skinned mesh exported from Maya.
Maybe the exporter in unreal is setting the wrong skin cluster mode during export? Something for Epic?
Final Thoughts
And there you have it—a quick and easy fix in MotionBuilder using a 20 year old tool you’ve probably never heard. Or have you? Do you use it yourself to fix this issue or do you use another method? Let me know in the comments below.
If you’re ready to dive into the world of MotionBuilder for your next project or career move, check out my MotionBuilder courses below.
Happy editing!
Leave a Reply