View Full Version : stretchy IK arms - shoulder joint scaling in the opposite direction?

05 May 2011, 06:16 AM

I've been working on a rig and have another issue with it. Google has returned nothing helpful.

Using maya 2011. I have a character with a stretchy IK arm setup using utility nodes and distance tool, the distance is plugged into input1x of MD, (input 2x is my global scale expr), distance into cond, MD into cond color if true R, output into blend colors, reverse into blend colors, on/off boolean into blender, output of blend into scale X of joints (as X points down the joint chain).

Also, have an IK/FK blending arm, IK joint chain, FK joint chain, bind joint chain. Simple setup really. Have tried plugging the scale operation into both the bind and IK joint chains and same result.

The issue here is that when the shoulder scales I get weird distortion in the character's arms because it's scaling in the wrong direction or something weird. If I scale it to -10 in X for example (after breaking the connection... yep it does it with or without the scale setup) - which is the wrong direction anyway - the joint connection graphic going from shoulder to elbow joint (showing the connection between them) actually diminishes from the elbow, so if I scale it out sufficiently, the connection will only be displayed half way as if there's a hidden joint in the middle of them both. The problem is that even if I scale it positively, it STILL happens.

Does not occur with the elbow, or forearm.

Any help much appreciated. Another interesting thing I just found is that if I scale on Y, once it hits negatives, the entire arm inverses from the elbow.

I am using the same setup for the legs... works fine. Had it happen on other characters too if that brings up any possibilities of error in my non-stretchy setup.

05 May 2011, 07:03 AM
Try unchecking the segment scale compensate on the joints.

05 May 2011, 11:28 AM
Hey :)

Thanks for the tip - did not work unfortunately =(

The connection display graphic stopped resizing inappropriately but the joint doesn't scale out at all.

05 May 2011, 09:37 PM
without seeing your rig, this could be a tricky one to help on, however, if you are only scaling the X, why not set it up to control the translate X instead. The setup is similar, but you wont get any unwanted scaling issues passed down the chain.



05 May 2011, 10:43 PM
Hi there,

I don't know that setup and see no reason to learn a new one when this one *should* work fine. I've noticed no matter how I set it up it appears that the graphic scales smaller whether the scales work fine or not so disregard that.

I will post the character/rig.

Still working on various things but... any critique in general is also welcome as I'm self taught in rigging.

Thanks so much to anyone who'll take the time to help me :)

I have a feeling it might be how I've setup my ik/fk blending arms.

05 May 2011, 03:09 AM
edit: ignore this post, still need help on above tho

05 May 2011, 08:07 AM
I still need help =/ Rigs due tomorrow morning... and it's 8pm here.

05 May 2011, 04:57 PM
Frankly speaking your approach is not the good one.. You should have your stretch aspects on the IK setup joints...and transfer the transforms to the bind joint by constraints only. U need not connect the inverse scale etc..
Get the distance value and feed to the MD input 1x.. connect the Same value to MD input 2x.
Then get ur cond node.. Connect to the jnt ScaleX

05 May 2011, 08:57 PM
I know that... It's that way because I was experimenting =(

The proper way still doesn't scale properly either.

05 May 2011, 12:23 AM
This may help you:

Or you can do it as an expression.

if (armIK_Controller.Stretchy == 0)

//Stretch Expression
if (armDimensionShape.distance >= x)
Shoulder_JNT.scaleX = armDimensionShape.distance / x;
Elbow_JNT.scaleX = armDimensionShape.distance / x;
Forearm_JNT.scaleX = armDimensionShape.distance / x;
Shoulder_JNT.scaleX = 1;
ELbow_JNT.scaleX = 1;
Forearm_JNT.scaleX = 1;

else if (armIK_Controller.Stretchy == 1)
Shoulder_JNT.scaleX = 1;
Elbow_JNT.scaleX = 1;
Forearm_JNT.scaleX = 1;

x = the distance between the should and the wrist.

I usually make it so the you can turn it on and off, so on your arm controller make an attribute that is called stretchy.

Hope this helps.

05 May 2011, 12:48 AM
Hey guys, thanks so much for your help... it is solved now! :)

Here's what I did wrong: I connected it up before it was bound the wrong way and noticed the problem, fixed it the way shinyprem said to, and thats when something else must of gone wrong because it was still doing it. Just reset it back to how I did it in the first place and now it works. I'm so out of practice :(

Anyway, all fixed thanks to you guys.

CGTalk Moderation
05 May 2011, 12:48 AM
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.