Tip:
Highlight text to annotate it
X
In the previous movie, we created an IK/FK hybrid elbow solution
to pose the forearm portion of the IK arm using an FK control,
which lets you rotate the forearm using a pinned IK elbow.
In this movie, we’ll create a flexible shoulder rig to allow animators
to push the range of their character’s expressions.
Start by opening the file “26-0-Character_Rigging_part26_start.mb”
or by using your own file from the previous lesson.
A shoulder rig is necessary to really sell a lot of poses, such as a shrug, a slouch, and a reach.
Based on your animation requirements,
you can create either a rotation-based or translation-based shoulder rig,
or even a hybrid solution that integrates both.
While a rotation-based shoulder might be more anatomically-correct
and allow a specific range of motion, a translation-based shoulder allows a broader range,
which gives animators more freedom.
Here’s we’ll focus on a simple translation-based shoulder with squash and stretch.
We’ll start with a basic joint chain consisting of two joints.
We want the shoulder to be perfectly in-line with the arm,
so create a joint and point snap it to the upper arm joint.
Middle-click to bring up a manipulator and adjust the joint in the X and Y axes
so it's positioned similarly as shown.
Now create a second joint and point snap it to the upper arm again.
Rename the two joints "leftShoulderBase_result_JNT"
and "leftShoulderEnd_result_JNT" respectively.
Now let’s cut out our geometry.
Like the neck in part 7, we’re going to make use of the existing edge loops
to divide the shoulder rather than making new cuts.
Change the geo_LYR’s display type to Normal mode,
then select the faces around the shoulder.
We've included a quick select set in the scene file linked below to help you pick out the exact faces.
Go to "Face" mode, then use the Polygon Menu Set's Mesh > Extract command
to separate these faces from the torso.
Find the resulting geometry objects in the torso_GRP.
Delete the history on their parents and rename the two objects
"spine7_GEO" and "leftShoulder_GEO" respectively.
Unparent spine7_GEO and re-parent leftShoulder_GEO
to the leftShoulderBase_result_JNT. Move their pivots to their respective joints.
Delete the leftover group.
Now you can rotate the shoulder by rotating the joint.
To enable translation control over this shoulder, we’ll create an IK handle.
Because the shoulder‘s joint hierarchy is so simple,
a single IK handle will do rather than an IK spline.
We can use an ikSCSolver in this case since we don't need access to a pole vector,
lke a knee or elbow control.
Create one from the leftShoulderBase_JNT to End_JNT.
Rename the handle and effector appropriately.
Next, create a locator named "leftShoulder_LOC" to act as a temporary control.
Point snap it to the upper arm joint and parent the IK handle under it.
We’re going to want to be able to stretch the shoulder like the arm.
For this, we’ll use techniques seen in part 23 of this series.
Set up a distance node to measure the distance from the base to the end of the shoulder.
Rename the nodes appropriately
and re-parent the length end node to the leftShoulder_LOC.
Then use a modified version of our leg and arm stretching script
to set driven keys at its normal length and two times its normal length.
You can find this script with the scene files linked below.
Use the Graph Editor to make the driven key animation tangents "Linear"
and set "Post Infinity" to "Linear" as well.
Next, we need the geometry to scale properly, so select the leftShoulder_GEO
and leftShoulderEnd_result_JNT objects. Open the Node Editor and display the connections.
Create a Multiply Divide node and rename it “leftShoulder_normalize_DIV”.
Use it to divide the leftShoulderEnd_result_JNT’s
"Translate X" attribute by its default value.
Then feed that into the geometry’s "Scale X" attribute.
Notice that the geometry doesn't scale inline with the locator.
This is because our spaces are misaligned.
The shoulder joint is pointing down at an angle while the geometry is straight.
Fix this by creating an empty group named "leftShoulder_GEO_GRP"
and rotating it in the Front view so it aligns to the joints.
Then parent it under the leftShoulderBase_result_JNT,
and parent the geometry under that.
Finally, delete the old connection to the geometry
and create a new connection to the "Scale X" attribute of your new group.
There, that's better.
Now let’s create a proper control for this shoulder by duplicating either the elbow or knee control .
Delete everything under it, as well as its custom attributes and rename it appropriately.
Position it above the shoulder geometry.
Now, we’d like to rotate and scale this more appropriately for the shoulder.
Since we locked and hid these attributes earlier,
we'll have to use the Channel Control window to unlock and unhide them
by adding them to the "Keyable" and "Non Locked" lists.
Add the "Visibility" attribute to these lists as well.
We’ll rotate it so it faces up and at a slight outward angle, and scale it down a bit.
Although this control resembles our knee and elbow,
remember that it's not actually controlling a pole vector constraint.
Thus, we should move its pivot to the upper arm joint.
We'll freeze the transforms here since the shoulder does have a natural neutral state.
Now lock and hide the "Rotate" and "Scale" attributes we previously unlocked.
Parent the leftShoulder_LOC under this control and then hide it.
Now the control curve controls the shoulder.
For a final bit of cleanup, create a "shoulderVisibility" attribute
on the leftArm_settings_CTRL and connect it to the new control's visibility.
Then lock and hide the "Visibility" attribute,
and add the control to the body_LYR.
Finally, hide all the locators, IK handles, and measurement nodes.
We’re done for the shoulder rig.
In the next movie, we’ll connect the arm and shoulder together,
incorporating them into the body’s root_transform_CTRL,
and cleaning up our arm rig based on our rigging checklist.