Get that rig a face!

Discuss on the forum
(Public Discussion)

Current Focus

  • FACE! – Working on mDrake’s face.
    • Branch – features/faceModules
  • We built our face modules, we’re gonna push them to our rig.


We’ve built our new modules so we need to roll them into our rig. Let’s make a plan.

  • Base file –
    • Clean
  • Take the blocks we have and push set them up cleanly for a build
    • Eyes
    • Brow
    • Muzzle
  • Do a build and skinning pass on the face to see where we stand and what changes we might need
  • Test mirror setup
  • Alpha release
    • Textures – try

Mesh fixes


  • Clean file
    • Assets/mVariants/mDrake/mDrake_mesh_v04
      • Latest mesh from Dan
      • Clean out all the shaders and stuff
    •  Eyes
      • Resize eye
      • Get clear eyes back in
    • Lids
      • Re-topo some to get better deformation

  • Teeth
    • Resolve size  other issues and get loop back with Dan. Use Morphy’s if need be to try out fuller teeth.
  • Tech
    • Face Settings – register a face setting control and calls to get it
      • Connect to
        • Eyes
        • Brow
        • Muzzle


  • Modeling
    • Iris texture needs sizing to our reference asset
    • Lids
      • Line on texture needs to be tightened so it’s not so high
    • Teeth
      • We need to flesh the teeth more out to the molars.
    • Bag may need to be a little better.
    • Lips
      • Few uv’s got messed up in the last transfer
  • After we have all fixes complete. Unify a clean single mesh  asset
    • May cull out some polies for Unity
  • Rigbocks
    •  Eyes
      • Add more handles

Block prep…

Gonna grab our body temple and setup a clean file for it.

  • Grab last
  • Clean out all the geo, we’re going to reference in our geo for templating purposes.
  • Clean out name spaces from imports over the iterations

  • Reference in our ‘final’ mesh
  • Grab our face templates from our previous work.

  • Take it to our combined template file
  • Reshape our proxy head a bit as we have new proxy mesh from the face modules

  • Connect our face blocks to our MRS setup and then push them to skeleton state to make sure they’re building as expected.

Alright let’s get building…

Test Build

So we have all our blocks at skeleton state. That’s what we need to start testing our building. We need to make sure our face modules work properly with our head as children blocks so we’ll start with the simple.

To do that, I’m going to push my master, spine and head to rig state because all parent blocks must be at the state you are trying to push a child block to. I want my face stuff to rig so all the block parents must be rigged – eye>head>spine>master.

Once we have our spine and head built, we’ll proxy those and then starting walking through the face modules.

So the first thing I’m gonna do is just try building each module through the ui.

  • Brow – builds
  • R eye- builds
  • L eye – fails from a wiring thing I think
  • Muzzle – failing

New rigBlocks, to be expected. We’ll walk through each one. Since the brow is building okay I’m gonna start there with the punch list.

Rig Factory 

There’s a few items we need to address for facial blocks to get things where we want them.

_d['b_faceBlock'] = _buildModule.__dict__.get('__faceBlock__',False)

Storing this on all blocks to have this data going forward. We coupled that with adding __faceBlock__ = True to all of our face rigBlocks. It’s easier to flag them then have a list to maintain.

  • deformNull
    • We create our deform null from our attach point
Getting our proper attach driver

The attachDriver is what we call the joint/dag of a parent module that our current block connects to at it’s root. There’s some logic that goes into it because we don’t want to grab the rigJoint for example because then we lose the ability to have direct control.

There’s a bug to resolve in my finder of attachDrivers, some setups have extra end control and I want my face stuff to track that end point rather than just my end handle for example.

After hashing it out with Bokser we came up with an edge case with connecting to head ends. Because we do want hair and other face bits to follow those in those cases.

To resolve…

  • Added cases on attachPoint and driverPoint calls to change the return if our moduleParent type is head
  • Changed some items in our rigFactory initialization in how the attachDriver and deformGroup are setup
Face animSet

To future proof and add more potential to our animTools we want to have a separate objectSet just for facial controls that can then be registered for fast querying.

Thinking through it…

  • Do we want one faceSet per puppet or should it be per head so that a two + headed asset would have the ability to work by face?
  • Add the new puppetSet to the puppet
  • Add it to the parentModule? Thinking not because you don’t necessarily want to reset the face when you reset the head.

We could of course add logic to check on our anim tool functions but if we can prewire that, all the better.

Double check the face set isn’t included with the rig_delete call because they’re shared.

  • Added check
Per module

We’ll start with the brow because it’s building but we need to do a couple of things to push through the others.

  • Register our moduleParent settings – all face blocks will share the visDirect and visSub attribute with their moduleParent settings control
    • mPlug_visDirect
    • mPlug_visSub
  • Face direct controls visDirect
  • Register face controls with the new faceSet

rigBlock checklist

  • data_buffer
    • new settings
    • check attr plugs
  • rig_controls
    • use proper settings, register section if need be
    • mRigNull.faceSet.extend(ml_controlsAll)

Working through it…

  • Brow
    • standard fixes
  • Left Eye/Right Eye
    • Eye master
      • Was having issues building with head
      • faceSet wasn’t wired to module if it already existed
      • Added master eye to face set
      • default dynParent group should be head
        • Did a simple fix here. Need to get back to. Making note
  • Muzzle
    • Skeleton joints not wiring – Found a bug from a refactor I’d done. New joints were’t being appended to my wiring list. Working now

And we have an initial build…

Now that we’re building I’m going to do a clean full build to skin in and see where we stand and then we can iterate.

Pushing some notes to come back to below:

  • Eye
    • Flesh out lids more for better proxy
    • Figure out how to to iris/pupil setup and proxy
  • Brow
    • Do offset for joint depth and same proxy setup as muzzle or parent the brow curves so they track

Build 1

  • Get all our blocks at skeleton state
  • Skin the mesh and transfer weights from last test file for unity
    • max influences – 4
  • Build and connect

Let’s get to skinning.

Then we add some lids…

Playing with a few methods with ngSkin. So far just had a brow and lids layer. Trying to do a jaw,cheek.lips one now. Always love the assign weights looks…

Bit more play and and we have a decent pass on weighting – at least for alpha. Let’s throw a quick series of poses on it to test.

Build 2 (For Testing Release)

We made notes along the way of working through our last build so we have our final notes for this one.

  • All controls aren’t being grabbed for mirror flipping
  • Some controls not getting grabbed by ui
    • Master look
    • lids
  • Radius attr not getting hidden on
    • Lids
  • Brow controls
    • Move shapes out a little
  • Muzzle
    • Lips – orient handle more vertically rather than along the surface
    • Lips – even up the handles
    • Try bigger mouth move orb
  • Body – add a blendshape bridge for testing tweaks.
  • Head – The normals on that ring of bridge faces need to be set

Next post will be release announcement on a cgmRigs Update.

This kinda works

Copying skin weights from rig to rig

I’ve done several methods of this. When just copying in a new mesh is relatively straight forward enough. This method is where we have two rigs.

Maya’s Copy Skin Weights

Could find a group of settings that worked.


Oldie but a goodie. It’s in the toolkit.

  • Reference in old rig
  • Skin cluster (normal – not heatmap) your mesh to the new rig
  • Use abWeightLifter to transfer


Never really played with ngSkin’s weight transfer stuff. Tried it out. Not sure.

Lofting lids

What with all the lofting I’ve been messing with lately I needed to do a little clean up on the lids. Decided to try it out. It actually works surprisingly well.

  • 5 curves upr/lwr define my shape.
  • Generated initial curves with a couple of methods
    • Locinator and create curve from selected
    • Raycasting curves
  • Then shape the nurbs to the base geo, giving more definition

Tip – Running rebuilds on your curves will give you cleaner surface building.

  • Convert the nurbs to polies, matching the edge lop break down. IT’s better to go higher and cull the extra than have to readd it.

  • Delete some edges and connect to the face.

  • Finish out the back of the lid geo.
  • Mirror head
  • Tranfer uv’s from old head to new
  • Select offending UV’s and relax them back to where they should be
  • Tweak texture for new lids
  • Set normals to face and average
  • And…

New Calls

  • IK
    • ribbon_seal –  Setup for lips and possibly lids to do ribbon sealing like our curve setup
    • split_blends – Part of ribbon_seal

To Come back to…

  • Optimization
    • rigNode connection is pretty slow. Look at way to fix that
  • Face
    • Resolve better breakdown of setting attributes so we can cull down number of gears
  • LIMB – end twist skin joint. Look at an option to have a twist only wrist
    • Reverseable spine would be great for flying/swimming stuff
    • Template
      • Flesh out lids more for better proxy
      • Figure out how to to iris/pupil setup and proxy
      • Roll in new methods from brow/muzzle
      • Add a span specification to the lid curves
      • Try cluster setup
      • Add pulling the new data back to the define handles when deleting template
    • Add full lid setup
    • Master eye
      • Do a better dynParent setup. Did a patch fix for drake build. eyeLook_verify
  • BROW
    • Roll in latest curve/surface stuff from lip setup
    • Do offset for joint depth and same proxy setup as muzzle or parent the brow curves so they track
    • Add
      • Snout setup
      • Tongue
      • Teeth
      • Lip/nose variants
    • Look at possible other template setups – maybe a simpler one or other variable method
    • Prerig
      • look into splitting joint handle numbers
      • Check other control counts
    • Joint
      • Add support for split joints
  • HEAD
    • Aim head
      • subs blocks aren’t attaching to the aim head
      • Head aim not driving twist
Josh Burton

[MRS Project Lead | CG Monks] Josh is an animator turned TD who hails from Oklahoma, pre-undergrad in the Marine Corps, animation basics at Savannah College of Art and Design, cut his teeth in gaming and commercials before co-founding CG Monks and more recently the CG Monastery. The Morpheus Rigging System is a culmination of years of R&D and he is now thrilled to see what users can create, collaborate and expand on with this open source MRS platform.