Shoulder rigging


#1

I hate shoulders. How do people handle rigging them?

The main problem is that most IK systems treat the arm as if the shoulder has three degrees of freedom. It really doesn’t: it bends and swings, but twist happens in the upper arm, not the shoulder. Three degrees of freedom means there are multiple ways you can orient the shoulder for a given pose, which makes corrective blend shapes a nightmare.

I’ve tried working around this by extracting twist from the shoulder, so rotating the shoulder joint leaves the (bound) shoulder alone, and instead just twists the upper arm twist joints and elbow. It treats the shoulder joint as a twist joint (so it can receive some or none of the twist). That actually works really well: twisting the shoulder simply twists the upper arm and gives only a slight or no twist at the shoulder itself, effectively reducing the bound shoulder to two DOF. This makes deformations make more sense and makes correctives much simpler.

However, you still need to be able to twist at the elbow, since IK systems expect to be able to (and for FK systems it’s a natural thing to want to do too). So, now I’m looking at extracting twist from the elbow and combining it with any twist on the shoulder. I haven’t started on that just yet, but essentially upper arm twist is the combination of shoulder and elbow twist (in the coordinate space of the shoulder), and lower arm twist comes from the hand.

I’m sure these are all solved problems, but I haven’t found any competent info on the subject, so I’m curious how people approach this. The shoulder seems like the single most complex major joint system for rigging.


#2

I’ll assume that you’re rigging in Maya.

When you create an aim constraint, if you set the world up type to None your object’s rotations are controlled by a quaternion (instead of vectors and cross products) which flip at 180 degrees in any direction which is very useful for corrective blendshape sculpting.

To implement it, simply create a group and give it the same world space matrix value as your shoulder, parent it to the clavicle and create a “quaternion” aim constraint using the elbow as the target.


#3

That’s what I was talking about with extracting twist from the shoulder–an aim constraint was my first approach for this, though I replaced it with a better approach that just uses a bit of quaternion math (http://bindpose.com/maya-matrix-nodes-part-2-node-based-matrix-twist-calculator/). But that’s only a part of the problem, since you still need to apply the twist at all joints or it’ll break IK systems which expect to set a specific rotation at each joint.

I’ve worked out a rig that extracts rotation at both the shoulder and the elbow, adds them together and then applies them both to the upper arm. It gives the same pose as the underlying skeleton (the hand ends up in the same place), while avoiding having the “extra” degree of freedom that causes problems. It treats the shoulder as a twist joint, so I can put a little twist on the shoulder or none at all. It’s annoyingly complex right now (quaternion math for the shoulder twist, a traditional aim constrained vector and angleBetween for the elbow to get twist relative to the shoulder, and then carefully piecing the rotations together), but it seems to work pretty well so far.


#4

I don’t think you need anything special for elbow.

Harry pointed out how you could do one part of the problem, but there is still something that I would suggest you to add.
What you could do, and I suggest you to, is to create a ‘drive’ chain and to do all the fancy stuff there. In the end, you want to connect your drive chain to deform chain, but there will come trick with shoulder. If you, for example, have shoulder_drvJnt->elbow_drvJnt->wrist_drvJnt and all of them got some kind of inputs from other chains that are exposed to animators, you want to connect in some way that driveChain to deformChain but exclude shoulder_drvJnt. What you should do is create another joint/setup on that place that handles twist isolation and rotation. Keep in mind that you do want some twist to happen, and even just plain twist isolation from aim could work I don’t fully like it because you won’t get that much realistic behavior. Also, you do not want all others ‘non-twist’ rotation to be translated 1:1 to your deform chain. You want, some kind of, blending/adding twist in specific arm position, and others rotation not fully to be applied, and with that we are touching a PSD reader topic. When you pull arm from straight down pose to a T pose, and then you move your arm towards, you will want to get some shoulder to twist outwards, but in controlled manner. Kind of hard to explain with text.

Let’s hope I didn’t misunderstood you and that my answer is, somewhat, helpfull. Kind of hard to explain with text.

Cheers,
Arman.