Generally speaking there are a number of post process we want to hit after we do a rig build. Let’s walk through them.
Most of what we do will be done via MRS Builder.
These items work on a puppet wide basis where as the contextual menu items work by selected rigBlock and context.
Gather Rig Blocks
Use the post call to group all the rig blocks we’ve got laying around in our scene under an easily hideable group. You’d want to delete these for any rig files.
I try to keep my template files at the skeleton state and don’t keep them in the built rig files.
If you want mirroring to work, you need to run this. This call walks our rig and maps our mirror setup following Red9’s mirror setup. It does this by:
- Walking our module/puppet setup to get our hierarchical relationship
- Maps mirror modules/controls it can figure out
- Indexes Controls to follow this order
- Verifies all controls have the Red9
- Gather Space Drivers
- Grabs and space driver objects that aren’t where we want them and puts them in the hierarchy. This is for our dynParent setup. Target objects don’t know where to go at creation and need to be collected at the end.
Up to Date?
mrsBuilder>Post>Up to date?
Rudimentary call at this point. Eventually we’d like this to do more than what it does. What it does do is:
- Check each rig module’s version against the stored __version__ dat on the rig Module
- Let’s you know what isn’t up to date.
Much room for expansion here.
Gather Space Drivers
mrsBuilder>Post>Gather space driver
Clean up call to gather world space dynParent group drivers to our puppet.
- Bake set – makes a bake set (currently targetting Unity workflow)
- Delete set – Same but for deleting stuff
- Export Set – Implemented in Dec 2018. This attempts to gather geo and joints in an export set
mrsBuilder>Post>Is Historically Interesting>
We’re experimenting with this one on Brad (Rigging Dojo) recommendation. We turn off the ihi attribute on all nodes in our scene which makes our channel box much much cleaner. This is our first implementation and could use some work.
WARNING: Current implementation is scene wide
An idea we’re playing with. It generates an part-based or unified mesh to use for modeling ref or a skinning frame
Unified– Creates a unified mesh from all of the prerig loft meshes of the entire puppet so you have one mesh
Unified[Skinned]– …skinned to the bind skeleton
Parts Mesh– Creates a separate mesh per part…
Parts Mesh[Skinned]– …skinned to the bind skeleton
Delete– Delete whatever we have stored as the puppet mesh
Utilities – Contextual
Remember contextual items work per rigBlock based on context. Not puppet wide unless you’re in a masterSelect/below setup.
mrsBuilder>Utilities-Contextual>Rig ----------- Verify Proxy
Creates the proxy mesh you’ve seen. It also replaces the direct control shapes of the rig with transparent proxy mesh shapes for easy selection
You can modify the root geo option on some rigBlocks by the
proxyGeoRoot attributes. See shared settings for more info.
mrsBuilder>Utilities-Contextual>Rig ----------- Reset Controls
Reset all the rig controls of the puppet.
mrsBuilder>Utilities-Contextual>Rig ----------- Query Nodes
Another thing we’re playing with. During rig creation all the nodes created during the rig process are wired to the module so that we can cleanly delete them.
You can query them though note, there are a LOT of nodes. This will be very helpful information as we dig into rig optimization.
Here’s an example report on a leg rig module.
# cgm.core.mrs.lib.block_utils : ---------------------------------------------------------------------------------------------------- # |rigNodes_get| >> aimConstraint : 22 |rigNodes_get| >> blendTwoAttr : 9 |rigNodes_get| >> clamp : 3 |rigNodes_get| >> closestPointOnSurface : 12 |rigNodes_get| >> cluster : 2 |rigNodes_get| >> clusterHandle : 14 |rigNodes_get| >> condition : 67 |rigNodes_get| >> curveFromSurfaceIso : 4 |rigNodes_get| >> curveInfo : 3 |rigNodes_get| >> dagPose : 4 |rigNodes_get| >> distanceDimShape : 6 |rigNodes_get| >> follicle : 44 |rigNodes_get| >> group : 95 |rigNodes_get| >> groupId : 11 |rigNodes_get| >> groupParts : 11 |rigNodes_get| >> ikEffector : 3 |rigNodes_get| >> ikHandle : 3 |rigNodes_get| >> joint : 53 |rigNodes_get| >> locator : 30 |rigNodes_get| >> materialInfo : 1 |rigNodes_get| >> multiplyDivide : 31 |rigNodes_get| >> nurbsCurve : 429 |rigNodes_get| >> nurbsSurface : 12 |rigNodes_get| >> objectSet : 12 |rigNodes_get| >> orientConstraint : 14 |rigNodes_get| >> parentConstraint : 12 |rigNodes_get| >> phong : 1 |rigNodes_get| >> plusMinusAverage : 32 |rigNodes_get| >> pointConstraint : 9 |rigNodes_get| >> pointOnCurveInfo : 12 |rigNodes_get| >> poleVectorConstraint : 1 |rigNodes_get| >> rebuildCurve : 4 |rigNodes_get| >> setRange : 3 |rigNodes_get| >> shadingEngine : 1 |rigNodes_get| >> skinCluster : 4 |rigNodes_get| >> transform : 65 |rigNodes_get| >> tweak : 5 |rigNodes_get| >> unitConversion : 19 |rigNodes_get| >> Total: 1063 | (node: 'L_leg_limbBlock' | mClass: cgmRigBlock | class: <class 'cgm.core.mrs.RigBlocks.cgmRigBlock'>)
mrsBuilder>Utilities-Contextual>Rig Connect ---------- [Connect][Disconnect]
Because we have a separate rig structure from the bind one, this connects and disconnects that setup
Here’s a running list of other stuff we do.
- Delete rigBlock group
- Delete duplicate shader nodes.
- Check paths for relative pathing
And after that?
- We’d skin in a final mesh if we had one
- Throw it to some animators for testing and iterate
- Generate a proxy mesh for a modeler to work from and tweak our template when we got the final mesh and rebuild.
After we rig, we’re done. Right? Right?!
After we think we have everything how we want it, we should check our controls again.
When we think we have it all, then it’s best to do a little test animation or throw it to an animator to get some notes for the inevitable next iteration.