Non flipping Shoulder/Bicep twist -> Help needed, please!


#1

Hello everyone.

I’m currently rigging several characters in Maya.
Everything is working great, the only thing I just can’t get worked out is a non flipping shoulder / bicep twist (same for the Thigh). I’ve tried several methods, like for example point constraining a joint to the upper arm joint and then connecting the Y and Z rotations to the arm, or parenting it under the arm and then in Hypershade apply a multiply divide node andmultiply the x rotation by -1.
I tried using an aim constraint, and even had a setup where I would use a locators rotation as upvector and set driven keys on it, but although this helped a little, the problem remains … as soon as I get close to gimbal lock (which obviously ca’t be prevented for every possible pose) the setup goes haywire.

I’ve searched the net for a solution, and I’ve found a few threads with people who have one, but the threads are closed and the solution wasn’t made public, or the old files are gone.

I hope some of you know of a way to couter the flipping problem and are willing to share, or even give me a hint in the right direction.

Any help is greatly apreciated.

I’m attaching two really simple versions, just to demonstrate the problem …


#2

If you’re familiar with the ribbon spine setup, you can follow along with this:

http://animandmel.blogspot.com/2007/11/so-heres-ribbon-spine-i-rigged-up.html

Its something I wrote, that augments the abilities of the ribbon spine to allow for twisting beyond 360°. That may help…never tested it in production though.


#3

What MolemanSD7 wrote should do the trick. But it really depends how you setup your arm joints. make sure you are getting clean rotation values. sometimes orient constraints give values between 180 and -180 causing stuff to flip unexpectedly. Even if you use an augmented ribbon spine but are giving bogus values it will flip.


#4

Thanks for your quick reply, Moleman. I guess I’ll first figure out how your setup works, as i don’t have the Fahrenheit DVDs, and it seems their shop is down at the moment. I’m still a little unsure on how I would attach this setup to the shoulder but I’ll play around with the idea for sure and if I come up with a solution, I will of course post it here.

@mberglund:
What do you mean by giving false values? Would you use something different than Orient constraints?

Thanks for you help,

Alex


#5

I use the blender node. It will take the rotations of joint A and the Rotations of Joint B, blend them together and put the result into joint C. You do this through the connection editor or hypershade. here is a link to sean Nolan’s website, he has a good video to show how to set this up. http://www.snolan.net/2008/01/07/29/


#6

Right-on! I love Nolan’s site. Its really inspired me and given me some good ideas for things in the past. I just wish he’d post more…


#7

Yeah, I understand the concept, and I think I could rig up the spine setup you’re talking about (wich is something I’ll do next, as ist relly looks powerful).

I just seem to not be getting the connection to my problem. What I want to to is to have the first twistbone on the Bicep to not twist at all (in x, assuming x is pointing down the joint), no matter how I rotate the upper arm, the shoulder should always be pointing up, or if the arm is on the side of the body, be pointing to the side.

What I have is that it either flips over when I rotate past 90 degrees down, or front. There must be a way to fix that, right?

Thanks again for all the great info so far!

-Alex


#8

Yeah, i understand. The answer is a much sought after. The link I posted is for a spine but it can be changed for an upper arm twist and forearm twist without flipping.

Here is a post that has a lot of good discussion http://forums.cgsociety.org/showthread.php?f=54&t=451463&highlight=shoulder+roll.

Aaron Holly’s DVD’s has a ribbon spine solution for the arms, that works really well. If i remember correctly he connects the rotations of the upper arm to ribbon joints and uses a Multiple Divide node to multiple the rotation by incremental values. the first joint, the one nearest the shoulder, he muliplies by zero so it never rotates, the rest are .25, .50, .75 to get the distributed twisting.


#9

I remember following that thread, but it still seems scarce on details. I couldn’t even clearly decipher the high level concept he was mentioning…how to avoid gimbal altogether. From the video, it just looks like he’s rotating in local space. Berglund, can you clarify his concept?


#10

Thanks for the link!

Yeah, I figured some people were looking for a solution. I think I might be on to something that would work for me. I’m at work right now, but I’ll put up a file when I’m back home.

Cheers,

Alex


#11

I’ve been trying to figure out what Victor uses for non-shoulder roll, so far I can’t say. I think he is rotating in local space but has something else that is driving the twist. All i’ve come up with is something similar to Holly’s ribbon spine, without the ribbon part, and it works well for me. The distributed twist from the shoulder to the elbow.


#12

Hello and thanks again for your replies!

I think I might have come up with something close to a solution for my problem. Again, I first want to get more control over how the first bone in my bicep twist setup twists, then take care of the remaining twistbones. (lots of twists for one sentence ;))

With a normal setup where I try to eliminate the twist of the first twistbone (by for example connecting the Y and Z rotations to the driving UpArm bone and leaving the x blank etc.) I get a flip when the system either rotates 90° from the TPose to the front/back OR up/down, which is of course sogical as we hit gimbal lock. BUT, you might want to have your characters Arms swing down a bit more than just straight down or front, and if your bone flips 180° at that moment it might look really weird.

I’ve tried and tried to get around that by using set driven Keys, or expressions that, based on the UpperArm joints rotation would do something to the first twistbone but nothing worked … of course, because i was relying on the rotations, which get sort of unpredictable when I hit gimbal lock.

Now what if I didn’t rely on rotations at all for the joints twist?

So I’ve come up with this partial solution(which is probably nothing new and far from perfect, but I didn’t think of it before and i though maybe it would be a nice starting point for people with the same problem) :

I create 2 locators at the position of my bone and freeze their rotations. One of them ( loc_Aim ) I move down the arm (like to the elbow) and parent constrain it to the UpperArm, the other one I move slightly up. Then I Aim Constraint the first twistbone to the loc_Aim ans use the other one ( loc_UpNode ) as upnode.

This gives me a system that works alright, but flips around the y axis if aiming straight up or down.

Now, to prevent that I looked at how I want my joint to be oriented at different Arm poses. Here comes the tricky part I haven’t cleaned up yet, as i might try to work some conditions in here to get nice and clean poses all the way. But for now I continued by writing an expression for the loc_upnode, that alters its x position relative to the loc_Aim’s position in Y (and again, that’s just a start).

This gives me relatively clean predictable results and the system flisp only when the arm would already stick deep in the body :wink:

i hope this makes senese somehow, I basically try to control the different stated of the joint, by looking at the quadrants the loc_Aim is in.

the expression I used is this:

[font=Courier New][size=1]loc_UpNode.translateX = loc_Aim.translateY* (-0.1)

[/size][/font]

I’m attaching the test file for you to check.

I’ll try and play around with that a bit more. Also, next on the list is getting something like your awesome spine (@ mberglund) in there, to prevent the rest of the twistbones from flipping.

Looking forward to your feedback,

Alex


#13

I quickly messed with your file. A better way to fix the upNode flipping would be to do this.

  1. duplicate the upArm joint, and delete children.
  2. connect the upArm ry,rz,tx,ty,tz to upArm_dup
  3. break the expression on the upNode, and parent to the upArm_dup.

It seems to work well for this example, i’m curious to see where you take this. Good start so far!


#14

if you’re using a regular IKrp setup, put a locator just outside the elbow skin section so you can grab after skinning, shift-click the IK node, Constrain - pole vector

hope this helps. learn about constraints. interesting stuff.

now can someone tell me why there’s only ONE spine node seemingly available for use in FBIK. more than a little annoying, or am i missing some really big secret in assigning names to the skeleton? can’t find that info a-n-y-w-h-e-r-e.


#15

Here is a playblast of my non-shoulder roll and bicep twist solution. The first segment of the cube would (the one closest to the shoulder) doesn’t roll at all but the joints further down the arm do. The arm setup is a simple three bone, fk/ik switching. Whenever i test a new twist distribution setup i always apply it to a switch setup to make sure it works correctly.

Whistler2k: Is this the type of solution you were looking for? or did i miss the point entirely. (…it happens sometimes…)

http://faithofthefallen.wordpress.com/non-roll-shoulder-setup/


#16

Alex that’s a nice solution to get a zero spin rotation. It would be a bit difficult to propagate the blend further down the arm with the same degree of precision with this setup though and of course there’s the issue of crossing the up vector plane but in general could be a handy setup in a lot of cases.

mberglund it would be interesting to see another capture with a more complicated range of motion test. If the shoulder roll is based on your spine setup than I could see of a few cases where it would have unstable behaviour seeing as you ultimately get your spin from the local X Euler value.

There’s really no easy solution for this problem. It’s been a pet peeve of mine and I’ve been researching possible solutions for a while now. I’ve ended up writing my own custom constraint that decomposes the quaternion rotation into direction and spin allowing me to apply either of those elements individually or combine them as I see fit. Because I am using a dot product in my calculations to figure out the angle of the spin I only get 360 degrees of freedom (-180 / + 180) but I am working on a solution to make it 720 and more. Most likely I would have to perform some sort of a cash though similar to Maya’s No Flip constrain option to achieve this degree of freedom.

I’ll post a play blast of the result sometime tomorrow.


#17

Howdy,

Well, I don’t know how you’d set this up in other applications, because I use my own rigging plugins that I’ve developed for Cinema 4D. But, the solution I use to keep that first joint at the shoulder stable works pretty good. The way I set it up is using 2 aim constraints, one on the first joint of the twist chain, and the other to control the up vector of the first aim constraint.

For example to set it up for the left arm:
First, I set up the second aim constraint on a dummy object just above the right shoulder, which targets the right shoulder and has the left elbow as its up vector. The reasoning for this is that in a biped character the left elbow would never cross over the position of the right shoulder. Go ahead, try to touch your right shoulder with your left elbow. It can’t be done! :smiley:

So now the aim constraint above the right shoulder is stable. It will never flip because its up vector will never cross over its position. Its up vector (the left elbow) will always be on the left side of the dummy object.

Next I add an aim constraint to the first joint of the twist chain on the left arm and have it target the left elbow and use another dummy object for its up vector. This second dummy object is parented to the first dummy object above the right shoulder.

Now the up vector for the first joint in the twist chain of the left arm always moves with the left arm, and since it’s located above the right shoulder, it will never cross over the target (left elbow) for the aim constraint on the left arm’s first twist joint. :slight_smile:
http://www.cactus3d.com/NoFlipShoulder1.mov

As I mentioned, I don’t know how you’d set that up in the application you use, though. :blush:

If you give it a try, I’d be curious to know how it worked out for you. :wink:

Adios,
Cactus Dan


#18

Yea, yea, I know. Hard to post anything new when I don’t use Maya on a regular basis. But glad I’ve been some help to stir up new ideas :thumbsup:.

Great topic here. One thing I do that is pretty simple with the shoulder is to dup the shoulder joint, delete the children and call this new joint something like shoulder_notwist. Connect the shoulder rotate channels to the shoulder_notwist channels EXCEPT for the channel that twists. Transfer the weight from the shoulder to this new joint and then start smoothing it out to distribute the weight down the bicep. Now you have two joints there to distribute the weight across the shoulder.

-Sean


#19

I promised a capture so here it is. I just have the shoulder doing some of the arcs that would more often then not screw up your roll joints. The roll is propagated properly starting from zero spin at the top of the shoulder joint.

The setup is as simple as applying a constraint to the roll bone and choosing a few options.

Capture Link


#20

ShadowM8: When the arm is to the side parallel with the body and rotates forward, why does the bicep twist?