How Now Brow Cowl?

MRS : Landing | Members | Queue | Forum | DocsLibrary | How

Discuss on the forum
(Public Discussion)

Current Focus

  • FACE! – Working on mDrake’s face.
    • Branch – features/faceModules


As we begin this next min sprint it is again a good thing to see where we stand and where we’re going. We’re going to do that by:

  • Grab the our version mDrake asset face I did a few months ago and see what we liked and didn’t like
  • Make notes.
  • Grab source data (joints)
  • Make a plan

Where are we staring from?

This is the test face I was working on a few months back before deciding to get mDrake upgraded. You can play with  the face if you like. So cracked it open to see what was working well and what needs to be addressed during this next push.

  • Joint count – this works well for a Unity face for what we want.
  • Direct controls – Definitely need. For Morpheus 2 I was doing ray casting against a skull cage to generate. Think we can do better for shape casting those.
  • Muzzle – Enjoy what this adds to pose-ability. Will be keeping
  • Brow
    • The center driving so much wasn’t too popular with testers so will keep more localized
    • Ribbon in general works great
    • Wanna go ahead and add inner brow controls as well as center.
  • Lips
    • Not thrilled with the seal setup, will revisit during push



That’s great and all but what do we need to get mDrake in your hands as well as establishing the framework for generating more rigs quickly.

Initially I was going to just do the rig setup by hand but we talked about it and it made more sense to take a little more time and do it right for faster iteration on this asset and others going forward.

  • Brow rigBlock
  • muzzle/lwrFace rigBlock
  • Skinning data

Brow RigBlock

As we have a framework from our alpha test we need to look at what data we need to make that happen and start digging in. I’m staring with the brow as it is a much simpler setup than the lower face


Starting with our base, we sketch out what we wanna do.

  • Using the new two point vector setup will help quickly define the base data and vectors of the brow
  • I’ll need to add a self mirroring setup for our default as both L/R sets of data are in a single block rather than mirrored blocks and this the first that will have that.
  • With future assets we might want just a single side brow, or not have a center brow with some creatures. As such this will be a fullBrow block profile and we’ll have a one sided one or other variant eventually
  • Need a way to specify joint modes as well. For our first pass we want a fixed count based off our target markers more than likely though working through things might change that.

With a plan in place, let’s get rolling.

First as this is a new block we need to identify our initial attributes in addition to our standard ones on most blocks:

  • browType – [full:side] enum for future proofing
  • params – Gonna play with reusing this from our lid setup
    • paramStart/paramMid/paramEnd
  • browSetup – [ribbon:undefined] another future proofing enum
  • numHandlesBrow – number of handles per side. If we have a full brow we automatically do a center
  • numJointsBrow – number of joints per side
  • profileOptions – Going to try storing some base data I don’t want a user messing with to a json so the ui doesn’t mess with it and they have to really want to mess with it to get at it.
  • Optionals
    • addBrowUpr
    • addTemple – 
    • addEyeSqueeze –

Working through it

  • Mirroring – the self mirroring concept is a new one as we have block mirroring already.
    • Classing handles as cgmControl to access base mirror ability
      • mirrorAxis,index,side set on creation
    • Added a first pass on mirror_define call. Need to resolve how to access via the ui


This is playing around trying to decide how many points of data you need. The loft won’t be there till the template state but helpful to visualize.


After a bit more play, we decided to move the these handles to the template state and just use the bounding box for define.


Because of our work playing around in the define phase. We have a leg up generating our handles.After that we need to:

  • Create our curves
  • Cluster those curves to the handles
  • Create our loft



After playing with it a bit. Take another quick iteration

  • Added visualization for the start,mid,end paramater
  • Generate a clean left/right curve to be able to generate our joint chains
  • Removed joint labels on some handles to clean things up visually


Because of our work playing around in the define phase. We have a leg up generating our handles.After that we need to:

  • Handles
    • Generate
    • Setup aim
      • Normal up from surface
      • Aim back down the chain
    • Setup name tags on these to help
  • Joint helpers
    • For first pass, just matching our handles. Need to add different joints counts later
    • Aim back down the chain
    • Need to name tag these to make joint naming easier
  • Wire
  • Setup for mirror
    • mirror Call



Just need to take our joint handles and make joints.

  • Need call to find parent attach joint – BLOCKUTILS.skeleton_getAttachJoint
  • In the end I’m trying a one one one jointHandle to one joint setup and are simply matching the created joint orientation to those handles and copying the name tags.


The rig process covers multiple states so I’m gonna walk through them one by one as I make my build. First think through what we want the setup to do.

  • Create handle joints
  • Make our rig joints and segment/ribbon joints
  • Create our shapes – some of which come from our rig block
  • Setup our ribbon
  • Add a few masks  on options we want to allow through
Data Buffer

Our initial data/logic checks to see what we need going forward so we don’t have to to if/then as much

  • Nothing fancy
Rig Skeleton

Pretty straightforward.

  • Make our rig joints
  • Sort them to left/right/center dicts
  • Map our segment, bind and rig joints
  • Create our handle joints
    • Create from our shape helper, copying over name dat
    • Match orientation of the handle helper
    • Use that orientation for the joint
    • Position to the masterGroup of the shapeHelper
Rig Shapes
  • Handles
    • Shape parent our shape helpers to the dags
  • Direct controls
Rig Controls
  • Register controls
  • Found I need to find the parent settings control to get that plug – do in dataBuffer?
Rig Frame
  • Build our creation dicts
    • joint chain
  • Setup the ribbon
  • Check parentage
Rig Cleanup
  • Few defaults, final toggles



Quick Relook

After getting a new module building, we take another look


  • Controls weren’t getting mirror tagged
    • This was a finickier thing than thought but something bound to come up for face stuff. My handles weren’t getting wired to the the appropriate message lists being looked for. So we need to put them in order and
  • mrsAnimate balking at brow
    • Note – make sure all controls are tagged back to the rigNull. Need to loop back and check the eyes.
  • Write mirror_self call
    • Added mirror self to the ui

Drake to fix list

  • Eyes
    • Ball scale/position slightly off
    • Iris texture – scale down 10% in size keeping pupil size ratio to iris
  • Lids
    • Going to need to retopo some to get better deformation

To Come back to…

  • Optimization
    • rigNode connection is pretty slow. Look at way to fix that
  • LIMB – end twist skin joint. Look at an option to have a twist only wrist
    • Reverseable spine would be great for flying/swimming stuff
  • BROW
    • split brow (no center), sided
    • Template
      • 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
  •  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.