Sprint | Updating Face Blocks Continued

The original sprint post was getting too long.  Split to this one.


Continuing the plan of add mDrake has been out a few months and needs an update to the new build setup as well as some other bits to make it more useful.


What do we need to do?

  • Face | Finish the muzzle block



Got busy with some gigs and had to drop for a bit. Nose plan…

To loft…

To planning lips…

  • Spent a good bit of time playing with how I want to lay out the lip and bridge patchde and ended up with this above which I now have to implement
  • Dealing with lots of data is complicated and rework is to be expected.
  • Went back and added mouthbag data on the define state which I’m going to use for our final loft

Pass 4

Got a decent pass on the lower face. Now to do a pass of fixes.

  • Need to split the bridge. Wip example here when I was testing
  • Need to add lipPlane and lipOver split
  • Hide define curves


  • Make the lip over it’s own patch
  •  Attrs
    • numBridgeSplit
    • numLoftJaw_u
    • numLoftJaw_v
    • numLoftLip_u
    • numLoftLip_v
    • numLoftNose_u
    • numLoftNose_v


  • Need a simple call for splitting a surface to new curves so….wrote one




Did a pass of looking if I could hit my mesh target and found I’m going to need a couple of more handles.

So, back to another pass…

Pass 5

Not happy with the way things are flowing.

  • Added the arc curve
  • Split the bag/lip lofts to two

To do

  • Generate the handle data for the peak of the lower, then add that to the lower loft setup


New attrs:

  • numOverLipSplit | count for splitting the over/under

Got a decent pass but I’m not happy with the flow. I’m going to start with #1 and if that doesn’t hold up I’m gonna redo the cheek/jaw loft like #2.

Pass 6

Going to call this good for now. Reworked the patches and the flow is better. Not perfect but good enough to move forward to prerig…


Started digging into to prerig to see where things were. Couple of notes

  • Previously I was hard fixing at 3 controls per side. Fixing this
  • I like the new handle/offset setup from brow work I want to add here. This will however require a new loft to slide over the both lips.

Pass 1

  • Added attach loft during form call for my new handle setup from brow
  • Adding some attributes
    • controlOffset
    • jointDepth
    • numLipControls | changing this to numConLips
  • Questions
    • Any reason we’d need differing control counts between upr/lwr?
  • Refactoring out some of the calls for making the handle stuff. Took some iteration but it’s holding up
  • Working through lips
    • Implementing brow handle thing
    • Need to generate per anchor handle data
      • lwr will share ends with upr
    • Finish refactor of that call from brow for lip
  • On brow I’d been orienting the follow group to the surface which is a bit funky. Instead I think we orient to the anchor. Feeling better and less flippy.
  • For corners, for now assuming top pos is the corner. May want to revisit this at some point for different corner setups.

New anchor/handle setup

Want to write this out a bit for myself so I don’t forget how it’s setup. Some changes from brow pass:

  • The surface didn’t hold up as a good up for dragging things around the surface so we’re using the anchor.

To the meat…

  • Anchors
    • Generate the count
    • Create anchors
    • Get data in lists to be able to curve across
    • Generate a driven curve through these which we’ll attach drivers to
  • Handles
    • These are generated position wise initially.
    • Group is created which tracks our surface to get position. The driver for this handle is the anchor but it stays on the surface
    • It orients to each’s respective anchor
    • Under the track point is a joint offsetGroup and a control offset group which pushed the handle and joint handle above and below the surface
    • these are connected to the jointDepth and controlOffset attributes on the block
  • Joints
    • These use the same driver curve from the anchors
    • Drivers generated and attached to that curve
    • Rest of the setup is the same as handles except for orient
    • Current implementation of this is they aim right/left towards center
    • The up axis is the closest anchor which act as local pole vectors

Pass 2

  • Moved the lip joints to directly follow joint curve from handles rather than surface. Felt better
  • Added sneer
  • Added standard anchor to handle setup for chin,cheek, nostril
  • Factored out combo call for those to make adding one off handles easier
  • Joint setup working


Step push into skeleton to see where we stand.

  • Joint links weren’t being found. Forgot I’d changed the tags
  • Need to account for handle/joint setup
  • Joint lists aren’t being enumerated which we want for cleaner naming
  • lip corner we want to be named as such
  • Direct shapes on lips not being honored

Back to prerig

  • Add enumeration to handle/joint chains


  • Make sure new stuff is honored
  • To get the direct shape wiring
    • add a connection from the shape handle to the targetJoint


  • Gather direct shapes and joints in usable dicts


  • Push the shapes

First build successful.


  • mid lip controls – see how that follow is setup
  • Sneer | not getting setup properly
  • Lip direct controls not using correct shapes

Pass 2

  • Add blendable driver on nose for muzzle
  • Add aim back to corner on handle chain, maybe when only one handle is present?
  • Attribute multiplier for cheek push/pull

Cheek push

So, doing the simple sdk setup wasn’t going to allow for flexibility. Tried looking at a way to do that to no avail. Instead…

  • We setup remapValue nodes to get 0,1 values from our drivers and threshold attributes

Bokser Gig


  • Single joint setup was messed up from the workshop update. Fixed

Project X

  • LIMB, SEGMENT, HEAD – bugs from define handle work for facial stuff
  • LIMB –
    • Form | reworked the aim to be more stable for folded limbs. Main handles are now the up targets for their subs
    • Some edge cases still get the joint orients flipped. Just fix via cgmJointTools till fixed. Just watched for crab like legs.
    • Same for the rp twist fix on frame call. It flipped depending on setup
    • Proxy cast is off on
    • End orientation not matching orient helper didn’t feel intuitive. For now, it will exactly match it
    • May need a new flag for primary proxy cast axis
  • General
    • Reworked rp pos to just use the newer up vector call
  • IK
    • handle | now sets preferred angle on call due to bug with extreme folded chains flipping
  • WING
    • Initial temp setup





This has been a hard concept to iterate through. It keeps coming back up as not quite working how I want.

  • The baseSize for a profile should be in the baseDat and not just set via value

Change Log





  • NEW – SDK dags
  • NEW – Space pivot support
  • Bugs


  • Proxy mesh gen – change over to new system
  • Attr Mask implemented


  • BUG | Fix for nub not building as expected for a Bokser project
  • BUG | Fix for lever shape not using the loft shape variant



  • sort_dag | simple call to rorder passed dags or by selection those dags under the detected parents. Implemented to ui as well


  • get_evenSplitList| Generate a split side list. Assumes right to left values, splits mid out if odd


  • New loft curves
    • loftCircleHalfUp/Down/Pos/Neg | will see about adding to loft setup. Mainly wanted for eye lid control shapes for now


  • get_surfaceSplitCurves | splits a surface to new curves
  • get_shapeCurve | get a curve from a surface with offset option


  • get_pos_by_linearPct | call to get pct position between two points

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.