Node Based Pose Space Deformer V.1
////////////////////////// WHO ////////////////////////////////
///////////////////////// WHAT ////////////////////////////////
This file allows you to base your corrective blendshapes on the pose, rather
than just a rotation of the joint.
///////////////////////// WHY ////////////////////////////////
This works great for the parts of the body which get a lot of movement in all
3 axis, such as hips and shoulders. Where you can not isolate just one axis
of rotation to drive your blendshapes.
This file was inspired by Michael Comet's Plug-in for Maya.
Unfortunately in my production pipeline, 3rd party plug-ins were prohibited,
which pushed me to create this node based equivalent.
///////////////////////// HOW ////////////////////////////////
Import my file into your scene. You will get a group "PoseSpaceDeformerGRP" which will contain a nurbs sphere
"poseSpaceDeformerFallOffSphere" and a locator "PoseLocator".
Based on your import options you might get another group on top.
Import this setup PER corrective blendshape, so if you have 4 corrective blendshapes that will be triggered
using my setup, you will import this setup 4 times, repeating all the following steps for each blendshape.
(A nice interface and a script which automates all of this will come in the future)
Pose your character into a problematic pose.
Create a corrective blendshape for this pose.
Grab the group of my setup ("PoseSpaceDeformerGRP") and snap-move it to
the joint that was rotated to give you the given pose.
This will position the sphere right on top of the joint.
Rotate the group so that the sphere's white area and a locator are roughly aligned with the joint
EXAMPLE: If you snaped the group to the "Hip" joint, you would want to rotate it
so the white area and the locator are pointing towards the "Knee" joint.
Orient constrain (with offset turned ON) the locator to the joint to which you point-snapped the entire group. Make
sure the the locator doesn't move when you constrain it, keeping "offset" ON in constraint's options might help you.
Now when you rotate the joint, the locator will move with it, rotating around the sphere.
At this point, the basic setup is done. You can now directly connect the "Weight" attribute on the locator, to the
"weight" of the corrective blendshape, for the given pose.
/////////////////////////// HOW IT WORKS ///////////////////////////////
So when you rotate the joint, whenever the locator on the sphere moves towards the white area, it will gradually increase
the weight of the blendshape.
As it moves away from white into black, it will decrease the blendshape.
Locator's World position is being translated into UV coordinates of the Sphere through "ClosestPoinOnSurface" node.
In turn those UV coordinates get the color information ( 0 - 1 ) from a ramp which is assigned to the sphere.
This gives you a nice fall off which you can change by tweaking the ramp texture.
You can also paint your own falloff textures onto a sphere, but that would require an expression to receive the color info,
rather than a node. It might be included in the later versions.
//////////////////////////// ADVANCED ////////////////////////////////
With this setup you can also use either a twist or a motion range of a joint to drive the blenshape in a addition to
the color falloff of the sphere.
"Type" attribute specifies either "Twist" or "Range"
Connect one of your joint's rotation axis to "Joint".
If you are not going to use either of these, just keep it at "Twist" and the default values of "Min" 0, "Max" 1
and "Joint" 1.
This will drive blendshape from 0 to 1 where your specified "Min" value would be equivalent to 0 and your "Max" will
be equivalent to 1.
EXAMPLE: "Min" 15, "Max" 45
If your Joint is rotated in whatever axis you connected to "Joint" attribute, by 15 degrees or less, you will
get 0 for the "Weight". If the joint is then rotated to 45 degrees or more, it will give you 1.
And between 15 and 45 it will give you a value between 0 and 1.
This will drive blendshape from 0 to 1 where your specified "min" value would be equivalent to degree range
in positive and negative degrees, staying in which will give you 1. And "max" value is the range in degrees
beyond which you will be getting 0.
EXAMPLE: "Min" 15, "Max" 45
If you joint is rotated in whatever axis you connected to "Joint" attribute, within -15 to 15 degrees you will
get 1. If the joint rotates above 45 degrees or below -45 it will give you 0.
The range between 15 and 45 OR -15 and -45 will be equivalent to the 1-0 range.