In today’s post we will take a look at the result of my research.
My profound belief in Maya was that the most efficient way to achieve performance and ease in maintenance was to build a custom component dedicated to one specific task.
To pursue this goal i build and wrote around 300 customs nodes over the last 4 years ( with some solver, manipulator and other Maya elements mixed in ).
It is my joy and pleasure to feature the Muppet node.
Taming anarchy and complexities:
Following the rise of computer power , memory and multi-threading capability, our character rigs have become quite complex.
(to open this picture at its original size click on the image above)
In such a case its not unusual to find more than 10 thousand nodes in your asset file.
This can introduce bigger file size, slower rig evaluation and time required to load animation .
( between the 2 graphs above which one do you think evaluates faster even in the latest parallel evaluation framework?)
Evaluating rigs over 100 frames per seconds:
This project started as a simple practice to convert legacy python prototypes into more refined c++ components .
Several time, i spend some time refactoring my network design in order to control in a more optimal way how the data will flow .
After some experimentation, it started to make sense to pack as many elements in the same node:
- The main system controls 99 output bones
- has build-in ik/fk serial blending rig
- controls limb segment, ik arcs and twistReaders.
- exposes stretchy limbs
- has internal limb/spine ik solvers.
0 – Source file and credits:
In order to let people compare results i will use a publicly available rig:
the MorpheusRig2 from cgmonks [http://www.cgmonks.com/tools/maya-tools/cgmtoolbox-2-0/](mrv2_m1_animateBeta_01_02112016.mb)
My research focusing mainly on body rig the file was heavily modified and stripped down to expose the common functionalities you expect for the general silhouette animation.
1 – Serial chain blender:
One common design one can met in Maya is the infamous ik/fk chain blending .
The basic idea for using 3 chains was historically to overcome some limitation of the default ik solver ( which have basic fk mode blending). Its also one of the first element a beginner can study :
- how for example to implement a squash and stretch limb module
- What about space switching?
Instead of sticking with blendColor to mix some input values I always was interested by the PairBlend node which was release after Alias acquire kaydara ( around maya 7 and the HIK solver first integration attempts) .
The important part here is that its respecting your data type and as such does not introduce any kind of unitConversion node .
It was working quite well , but i felt compelled to improve / reduce the number of nodes to manage. What i wanted to address was how to operate on a list of input pair values.
That was the start of my first chain blender : the blendQueue Node(shameless plug : https://circecharacterworks.wordpress.com/download/)
As an interesting side study i did implement a sequential blend mode which was useful to blend from neutral pose to start animation pose in the context of cloth simulation.
Some year later i made some observation and took some notes of what i need to improve in my chainBlender nodes.
It was time to write a milkShake node:
Usually the first rigging layer is related to the asset motion. Depending of your project , industry and time constraint this hierarchy will roughly mimic skeleton and real life anatomy.
One common pattern is to layout your character in neutral position in relation to animation sharing/retargeting: the T-pose
Another school/ point of view is to get the entity in relaxed state in regards to deformation , closer to the most common state: its the A-Pose (for example in video game you might want your character between a t-pose and walking/idle position).
Usually we organize and fit this skeleton into the render mesh, and in order to manipulate and restore the skeleton to its bindpose most people introduce intermediate groups which enable them to simply set the channel attribute to zero to reset the their pose.
Resetting hierarchies can be done in Maya very robustly with the DagPose command and node (thats you will find on skinned bone construction history with a default name of bindpose…)
Taking advantage of maya joint/transform node design we can also set the initial rotation of the skeleton components into their rotate axis or joint orient attribute (if their type is a joint)
The only missing attribute to cover all my need was an offsetTranslation attribute.
This can be implemented in a custom transform node or you can hack maya hikEffector node usually used in HumanIk motion capture rig.
In motionbuilder to emulate offset animation controller present in 3dsmax you can set pre/post rotation property and write your value in the rotatePivotTranslate.
Thats why i felt it was necessary to reproduce the hierarchy state inside the chainBlender. The translate/rotate offset enable the character to be set in A-pose without intermediate components and will play an important role in streamline rig evaluation.
This node output bundle rotation/translate and even matrix attribute and can be connect to any other regular maya node.
2 – Twist Segment:
3 – Twist Reader:
4 – Bending limb through arc nodes:
5 – Homebrew ik 2 bones with stretchy parameters:
Controlling the data flow and pruning cycle design:
Challenging Motionbuilder humanIK:
What about rigs without nodes? a peek at manipulator: