Mouth, Nose, Jaw

Discuss on the forum
(Public Discussion)

Current Focus

  • FACE! – Working on mDrake’s face.
    • Branch – features/faceModules
  • Specifically, going to be doing the face by hand and writing a connector for the setup to be able to easily plug it in to rig updates on Drake until we finish the rest of the face blocks.

mDrake

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 starting 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

 

Needs

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

Muzzle RigBlock

The lower face is a bit more complicated as we have a lot more moving bits we need data points for.

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

We’ll be continuing to use the point vector setup but to much greater use.

  • Lips – we’ll star with the basic setup. I’d like to play with defining the inner lip line at some point but it might be better for template phase
  • As there’s so many moving bits we’ll move through one chunk at a time.
    • Jaw
    • Cheek
    • Nose
    • Mouth – cause it’s simple, right?!

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. Since this is a pretty complicated block we’re also going to make some attributes be added only when certain options are set. For example, only need numbers of lip joints when you’re making lips

  • faceType  – [default:muzzle:beak] enum for future proofing
  • muzzleSetup– [none:simple] enum for future proofing
  • noseSetup– [none:simple]
    • nostrilSetup – [none:default]
    • bridgeSetup – [none:default]
  • jawSetup – [none:simple:slide]
    • uprJaw – bool
    • chinSetup –  [none:default]
  • lipsSetup– [none:default]
    • lipSealSetup – [none:on]
    • numJointsLipUpr
    • numJointsLipLwr
    • paramUprStart
    • paramLwrStart
    • lipCorners – bool
  • teethSetup– [none:single:double]
  • cheekSetup – [none:default]
  • tongueSetup – [none:single:ribbon]
    • numJointsTongue

Working through it

  • Simplification – Because there are SO many parts of the face we need to worry about I’m going to try to simplify the define state to as few as possible
    • Nose – single circle maybe? could generate other data from that
    • Mouth – either single curve or two define points
      • lip corner
      • maybe hinge like partial cylinder to define the lower edge of lip?
    • Jaw –
      • chin front, jaw corner, jaw top?
  • Block scale driving positions – Scale shearing is usually an issue with just parenting dags. Instead, I’m going to try parenting driver dags and then point constraining my regular dags to those. May work, may complicate things.
    • It was going to complicate things so instead I setup a scaleSpace concept where by a dictionary I can define a vector position in that scale space for a starting position while still keeping  clean translates on my handles.
    • Resizing the bounding box helper and redefining recasts those handles.
    • Feeling pretty good
  • Contingent attributes – Played with the idea of contingent attributes that would only add under certain conditions but when I dug into it it just seemed like over-complication. It would gum up the ability to easily verify a block to make sure it had all the attributes unless I added even more calls. Instead I think better attribute filtering in the ui is the answer and is something we need to get back to at some point.
  • Define curves – Started playing with define curves for the initial layout
    • Added a new call to BLOCKUTILS to refactor this process.

 

Here was my initial plan on define plotting some points in photoshop.

And here’s where I ended up after a bit of play.

Jaw

Gonna start simple. The jaw is a relatively straight forward setup – a single joint, the proxy form to generate our curves and we’ll also add the muzzle handle for this pass.

Define

Already iterated a bit on this above but I ended up with

  • Jaw top
  • Jaw – the angle point where the jaw meets the neck
  • Chin corners and chin mid – For  a while I just had the sides but I added the mid in for now. May cull that one back.

Template

For the first pass on the template for the jaw I want to keep it really simple as I don’t really have plans to do an elaborate jaw proxy. I’m gonna try to keep it relatively simple.

  • Added a way to sort the handles by handle tags.
  • Figured out how to add new handles
  • New loft setup
  • Played with variable handle adding
  • Thought – thinking we can maybe cull that center chin define handle… come back to it

 

Prerig

  • Need a muzzle handle
  • Jaw shape
  • Jaw joint helper

Working through it…

  • The extra handles from template – maybe they should attach to the define curves?
  • For the dag/shape setup
    • Store to stateNull
      • tag+JointHelper
      • tag+ShapeHelper
    • shape to dag – shapeHelper
    • dag to shape – dagHelper
  • Looped back to template:
    • Added an under jaw loft curve to better shape the jaw geo
    • Made the define state curves obj.template rather than hide

Skeleton

  • Just need a jaw joint from our jointHandle

Easy peasy. On to rigging our jaw and muzzle.

Rig

Let’s walk through the rig again

Prechecks
  • 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
  • Make our fk jaw
Rig Shapes
  • Parent shape our prerig jaw shape helper to our fk joint
  • Muzzle – make a dag at the dag helper, shape parent shape helper to that. Copy name tags and store
  • Direct controls
Rig Controls
  • Register controls
  • Still need to resolve settings stuff with a faceSettings
Rig Frame
  • Parentage
  • Setup Muzzle
  • Jaw
Rig Cleanup
  • Few defaults, final toggles
Proxy Geo
  • Duplicating our jaw loft and converting to poly

Nose, Cheek

Now that we have our jaw going we’re going to build on that.

Define

We already have our base here so we can just move forward

Template

Alright, we worked through some of the tech last time so this should hopefully go more quickly.

  • Chin – I’m not sure we need chin a chin shape or if it will be address with what we end up with the lips so I’m going to skip that for now
  • Cheek – We already have this from our jaw shape
  • Nose – This will take some working through it as the nose is much more complicated than the cheeks

Before delving in execution I played around with different loft setups and got something I’ll be starting with. Playing around with this makes me miss Lightwave. There was a modeler I remember way back who just modeled with splines and patches and I never really got it. Took a long time but it’s finally clicking.

So for this setup we need to generate a few items

  • Nose to cheek surface
    • Need some mid handles between nose and
  • Nose surface
    • Quite a number of handles needed. Will see where we can cull.
    • Loft curves
      • noseUnder
      • noseBulbUnder
      • noseBulb
      • noseBulbTop
      • bridgeStart
      • bridgeTop

With our plan in place, time to get hopping.

Working through it

  • Recolored define handles to make them brighter and differentiate from template handles
  • Removing cheek/nose bridge helper handles from define to simplify setup
  • Define state handles not saving
  • Refactored some calls out for cleaner coding where possible
    • Setup a couple of subcalls all with dicts indexed to the handleTags I’m using
    • Resplit and get pos – This one will take a series of handle points, make a curve and then split along that curve populating my positional dict with needed data
    • Curve gen – This one creates cuves with clusters following the handeTag keys I give it
    • Loft – This one creates my final lofts from the curves which also have their own cure string Tags to easily work with them

 

And a little liceCap…

Prerig

  • Need handles/shape helpers for
    • Nose base
    • Nostrils
    • NoseTip
    • Cheek

Working through it…

  • Using the surfaces to offset my handles and sink the joint helpers (need to roll this to brow to sink the joints)
  • Had to fix the loft direction on the jaw by reversing the loft curve order.
  • Trying to hide joint labels on prerig handles to clarity
  • Add mirror setup to prerig handles
  • Adding a couple of more attributes to make the nostrils and nose tip conditional
    • numNoseTipJoints
    • numNostrilJoints
  • For the dag/shape setup
    • Store to stateNull
      • tag+JointHelper
      • tag+ShapeHelper
    • shape to dag – shapeHelper
    • dag to shape – dagHelper

And here are our shapes and joint helpers…

Skeleton

Make joints

  • Cheek
  • Nose

Easy peasy. On to rigging our jaw and muzzle.

Rig

Let’s walk through the rig again

Prechecks
  • 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

  • Added a little better code to clean up gathering the enum values
Rig Skeleton
  • Working through the bigger storage bits
  • Pretty much every joint will need a seg/fk/driver. Maybe just call them all drivers and be done?
Rig Shapes
  • Parent shape our prerig jaw shape helper to our fk joint
  • Muzzle – make a dag at the dag helper, shape parent shape helper to that. Copy name tags and store
  • Direct controls – refactored this a little
Rig Controls
  • Register controls
  • Still need to resolve settings stuff with a faceSettings
Rig Frame
  • Parentage
  • Nose and cheek – setup ups some drivers to get the muzzle fall off with them. Imagine we’ll iterated some more next pass
Rig Cleanup
  • Few defaults, final toggles
Proxy Geo
  • Duplicating our nose loft and converting to poly for a simple visual. Need to loop back later to do the chunks for the joints.

Lips and chin

Now it’s time to move to the really difficult.

Define

Lips are not a simple structure and we need to find at least a decent way to define then and iterate moving forward to simplify where we might.

Working through it

First thing I did was redefined my face and started iterating. After playing a bit I made a few changes to try it out.

  • Added a upr/lwr lip define handle
  • Then I added a upr/lwr peak and back to define things

Better but there’s still a more we need as a base because how lips meet is important to understand in definition so we know how to template and build.

  • Add different coloration on the lwr/upr lip curves to make them more visually distinct
    • BLOCKUTILS.create_defineCurve – added color support
  • Parent the sub define handles to the mains
  • Add upr/lwr corner front back setup to help resolve that

 

Better still. We’re gonna try this out. However I do want to resolve how define happens. How I was calculating the rigBlock bounding box was a little odd. Refactored my values to work it a more sensible manner.

  • The rig block handle being positioned over the nose by design is odd as it gets in the way of other items . Tried a few things and ended up with the idea that you put it at the bottom front corner of the lower face
  • Added dagLock to curve creation
  • Other cleanup

Quick Sizing demo.

Template

It’s gonna be hard. But cool. let’s get rolling….

  • Lips  – These will be complicated but we did a lot of the leg work during nose in figuring out sub handle placement
  • Chin – I’m not sure we need chin a chin shape or if it will be address with what we end up with the lips so I’m going to skip that for now.

Working through it

So to start off I did a little playing with what I had to see what I need to generate.

  • Lip surfaces
    • Need some mid handles – One beta user asked for three in the split rather than two so we’ll probably try that
    • So the main curves we’ll do 3 splits, we’ll try to keep the others at two to keep thins somewhat simple
    • The lower lip main curve resolves at cornerFront, upper at cornerPeak
    • We’ll have to generate the outer points
  • Chin surface
    • I’m not sure if we need new handles or not, we’ll play with it. In the meantime, I looped back and added it to the define state
      • Also added a few visualization lines for that.

 

Did some iterating…

  • Playing with  different loft setup settings. I kinda like the feel of the uniform poly setup
  • Need to bring in the chin
  • The lip corner I’m still not thrilled with and need to iterate.

Calling this the first pass done for lwr template. We can iterate it more later.

And a lice cap.

A few thoughts for next iteration.

  • Try attaching sub handles to define cage for more intuitive positioning
  • Try this partitioning

Prerig

  • Need handles/shape helpers for
    • lip handles
    • Mouth move
    • lip joints
    • chin handle
    • chin joint helper

Working through it…

  • Initial pass after rework from lip push
    • Jaw surface had been flipped in the last change
      • Went back and added a reverse/no reverse setup for the loft call
    • The muzzle handle/joint got messed up from moving the rigBlock handles position. Instead I think we’ll use the top front bounding box position or maybe just the nose peak
    • Size of the muzzle handle shape is really small
  • Chin adding was simple
  • For the lips handles
    • We need to generate our offset joint curve that runs through the lip
    • Thought 1
      • Thinking our best bet is to use our front/back loft curves and make a new loft and take the .5 u value of that loft and offset it…let’s try it…
      • offsetCurveOnSurface – this doesn’t seem to be what we want as we can’t specify
      • dead end…
    • Thought 2
      • Generate our base data by using average positions of the section handles
      • Use those positions to make new upr/lwr curves
      • These become our dag handle positions
      • These joint handles will be the handles driving our split curve at skeleton state
      • orient the chain to… a new surface or try the lip
      • So that didn’t work quite right either. So new path…
    • Thought 3
      • Winner winner chicken dinner
      • Generate our corners from an average position of our main corner handles
      • Get our front curve and vector offset
      • Split that curve to get our new handle points
      • Generate a new curve from these positions plus our corners
      • Vector offset that curve pos/neg to get our new loft cuves
      • Loft those curves to make our surface to get our normals to orient our handles sensibly.

  • Aight we have something working, gotta check through things
    • We need to split our positions to left/right center
    •  Handles
      • Position
      • Orienation
      • Name tags
      • Wire
    • Joint Handles
      • Create and snap to the masterGroups of their respective handles
    • JointCurves – need to make joint curves from the jointHandles
    • Added to rigBlock
      • numLipControls – to set how many lip controls we want. Currently must be even. Meant to specify without the corner count so that 3 controls would be
    • Mouth move
      • Our dag we want to be positioned so the lip joints can roll around the teeth.
      • TO get a good position for this first pass we’re trying this
        • Width between lip corners to get size of our orb
        • Position that back in z half that distance
      • For the shape we’re just using a simple dumbell
    • Work through mirror tagging for self mirror

Skeleton

Make joints

  • Lip
    • Use same split method and keys and for this first pass just make joints from the control handles
  • Chin

Easy peasy. On to rigging our jaw and muzzle.

Rig

Let’s walk through the rig again. What do we need to setup?

  • Lip ribbon
  • Lip seal
  • Mouth Move and those drivers from alpha rig
  • Chin
  • Look at adding cheek offsetting from jaw movement
Prechecks
  • Add lip setup and chin
Data Buffer

Nada this go round

Rig Skeleton
  • Parsed through handle processing from brow base
Rig Shapes
  • Mouth – dag/shape setup
  • Chin – dag/shape
  • Lips – similar to brow setup
Rig Controls
  • Register controls
  • Still need to resolve settings stuff with a faceSettings
Rig Frame
  • Mouth move
    • Setup jaw space follow
  • Lip corners
    • Setup up track points – one to jaw space mouth, one to mouth move
  • Lip side controls
    • Setup ribbon to attach side controls to
    • Create surface
    • Skin
    • parent
    • Name
    • Attach non main handles to these
Rig Lip Segments
  • Setup driver segments
    • Took alpha work and used as a base
  • Lip seal
    • Refactored some of the alpha work
    • Worked through the split seal a bit but it needs more work still
  • Parenting
    • Surfaces
    • MidSeal Marker
    • trackBlends
    • Drivers

 

Rig Cleanup
  • Few defaults, final toggles
Proxy Geo
  • Gonna take another stab at this for easy facial prototyping. Going to try just converting all the existing lofts to meshes and skinning those with heatmapping to our rig joints

Going Back

Now that we have a building setup I wanna take a quick look on what I have time to address and/or need to before closing this chapter for the time being.

  • Jaw settings by default I’m thinking rather than using the master
  • Check the mirror setup.
    • Muzzle control not registering with the block
      • mirror_get has no cgmDirection so it’s not quite working
  • The lip corners I think we benefit from some extra control like I did with Morpheus 2. I’m gonna try it and see if it’s better.
    • First attempt was to make them push against one another but after playing with it it makes more sense for the upr/lwr to not reverse values on the same side
  • Cheek
    • Wanna take a quick stab at auto cheek movement. A student in the facial session I just wrapped with Rigging Dojo did a simple setup with the cheeks and jaw and I found it interesting and so worked it in. Thanks Donavan!

 

Next post will will be on rolling these blocks into Drake.

Drake Pass 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
  • Tech
    • Face Settings – register a face setting control and calls to get it
      • Connect to
        • Eyes
        • Brow
        • Muzzle

New Calls

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

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
  • SEGMENT
    • Reverseable spine would be great for flying/swimming stuff
  • EYELID
    • Template
      • 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
  • BROW
    • Roll in latest curve/surface stuff from lip setup
  • MUZZLE
    • 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