View Full Version : Shoulder deformation problems -- mayday

07 July 2007, 01:26 PM
I've been learning how to use Maya for about a month now, and this is my first time trying to properly rig and bind a character. I made a simple model of a cat to test it out.

The problem is... whenever I try to twist the shoulder, it goes all weird and pinchy.

Reading around a bit on the internet, I figure that this is a pretty common problem but -- how do I fix it? I can't find an easy way to do it!

Here's a close up.

I tried making a ring of joints around the problem area and driving its transforms with the rotation of the shoulder joint, but that only works to a certain extent...

And it looks even worse when I rotate it the other way.

How do I get it to look better?
Thanks for helping a newbie in trouble!

I have a couple of other questions, too.

When I build my skeleton, most, if not all of my joints initially end up locked in X. Why does that happen? I have to go and unlock them all the time.
Some of my joints have their axes pointing in weird directions. Most notably, my ROOT joint is off in some weird angle. How do I fix this? It means that my FK spine doesn't bend straight...

Thanks again!

07 July 2007, 10:09 PM
Yeah, thats a really common problem. Ive tinkered with a few different setups. A good base is

but ive found that hitting gimbal will throw it off.

Some key things (most mentioned in the tutorial):
-Edge looping / flow of the shoulder is important
-Use of the Clavicle
-Twist joints in the upper arm

And finally, if your going to animate an unnatural pose/motion, expect unnatural results. So be careful when severly twisting the shoulder past its limit.

07 July 2007, 12:05 PM
Thanks! That link was very useful!
I had a kind of homemade IK-FK setup that was sort of unecessarily complicated, though, so I opted not to add extra joints and so on. I just carried on fiddling with what I had earlier and it will do for now. I'll keep that stuff in mind for next time, however.

One question, though -- I added those joints later and parented them to the shoulder joint, then grouped them and added the group as an influence. Is there a way to mirror that whole thing to the other side? I couldn't figure out how to even mirror the joints properly, so I ended up sort of trying to adjust it by eye and then having to re-key it and re-paint the skin weights. It's rather a bother.

Thanks again, you were a great help.

07 July 2007, 03:43 PM
Well, the first thing I notice right away is the model is not built to twist in the shoulder region at all. If you want a good deformation when twisting, the topology needs to flow in a way that supports the twisting area.

The best solution I can give in your scenario would be to add in an extra joint at the position of the shoulder. Parent the joint to the clavicle and then either use a constraint setup or expression to control the twist. I'd say in your case, your shoulder twist should be about 10% of the actual arm twist, possibly even less. Weight the shoulder region up to the shoulder twist joint, blending it into the arm where the biceps would be and then tweak it as you begin twisting.

Create an attribute on your clavicle control as well called TwistFactor from 0-10 (float values), and pass that information into your expression for controlling the twist.

Pseudo Code:

float $twistFactor = `getAttr clavicleCTRL.twistFactor`;

shoulderTwist.rotateX = shoulder.rotateX * $twistFactor;

08 August 2007, 12:53 AM
Well, technically our shoulders don't twist very much in the socket. There are muscles/ligiments and such holding the area in place. Look at your arm when you rotate it like that, and you will notice the shoulder doesn't move very much, it appears that the bicep area is twisting much like the forearm does. So, to mimic this action, set it up much the same way you would a forearm rig. I usually put my twist joints outside the hierarchy and just constraint them so I don't have to worry about IK and effectors, etc.

So, extra twist joints. Also, to reach that pose, you have to rotate the forearm as well.

08 August 2007, 09:05 PM
Your shoulder is Gimbal locking, which has everything to do with rotation order and clean skeleton setup. It is happening in a really basic pose which tells me the joints that you are driving with the IK chain are not well set up.

No amount of SDK or connecting fixes based off your rotate X is going to help you in the long run because it is rotate X that is flipping with the gimbal lock.

What to do. When setting up your arm/shoulder, make sure X (or whatever twist axis you choose) is running down the joint (pointing at the elbow). I like it better to be zero'd out, some don't care. Make sure you have set prefered angle on the IK joints and the arm is planar (for elbow bending considerations). Set your rotation order to be in the least obtrusive place. Generally speaking this will either be above or forward of your base position. to figure it out manually rotate the shoulder in only Y or Z (assuming X is the twist and set to solve last ie XYZ or XZY). When Y and Z line up together, you are gimbaled and that is the position that will flip when the IK drives the skeleton.

There are more complexe setups to deal with Gimbal, but to get to them, you have to master the basics first. Once you have a clean setup, you'll be able to derive twist joints off of your shoulder twists to get better looking deformations.

CGTalk Moderation
08 August 2007, 09:05 PM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.