help on bendy setup


#1

hi! anyone knows how to setup a bendy arm like this:
http://www.duncandonuts.co.uk/bendyarm.html
but the thing is i was hoping to setup the arm using a ribbonspine.
I came up with different formulas using equations from ellipse. but more and more
problems keeps on popping up.
any thoughts?

thanks in advance!

Peter


#2

I built something very similar for my Rapid Rig: Advanced. But unlike the example you showed, my wrist and shoulders “flow” into the arm, rather than making a sharp bend. This was the look I was going for:
http://www.iwatchstuff.com/2006/09/15/horton-hears-who-first.jpg

It’s sort of like the ribbon, but instead I use a NURBS curve (either the curve or ribbon would work), and attach the joints to it using motion paths, then delete the animation on the motion path node, and space out the joints along the path.

The great thing is, I used virtually no math. I have my standard 3 joint chain, then I built a curve on top of that. The curve has 2 points at each end, and then 3 at the middle for the elbow. At the shoulder, elbow, and wrist, I created a cluster to affect the curve. Then, That cluster is parent constrained to the respective joints.

The trick of getting the shape to go from curvy to straight is to simply scale the clusters, which should be aligned with each joint. By scaling the clusters to 0, it collapses the points down, and makes the joints go straight again.

Anyways, this was the method I developed after a lot of head scratching, I am sure there are several. You can see some of the videos of my rig here:

http://www.creativecrash.com/maya/marketplace/scripts-plugins/character/c/-rapid-rig-advanced-auto-rig-for-maya–2

Edit: This is a link to just the arm deformation script I wrote:
http://www.youtube.com/watch?v=D7qeGsBGRNw


#3

Hey Dustin, thanks for going to the trouble of explaining that. Scaling the cluster groups is an awesome idea.

Just thinking about this as I write though I was struck by another thought here. If you use the same basic curve setup but instead keep the motion paths (but disconnect them from time) then you should be able to use the UV value on the motion path to move the locators towards and away from each other.

I think this would then allow you to have an unlimited number of clusters/bones so that you can have the arm do complete loop the loops and s bends and things. When you want it straight you just adjust an attribute that pulls all the UV’s for the motion path locs to either shoulder, elbow or wrist.

As I’m said, not sure about that above since it only just occurred while writing to thank you for the insight.

cheers.


#4

Hey Axiomatic,

Yeah, you can do all sorts of things, because the joints need to stay attached to the motion path, all you do is kill the u value. I guess the only issue with my setup is that the wrist, shoulder and arm drive the NURBS curve, so the joints are limited to moving between the shoulder and the wrist, due to the skin weighting. But I am sure this idea could be expanded on.

There is another thread happening right now on this same topic, and there have been suggestions to use Jason Schleifer’s version from his animator friendly rigging series. I haven’t seen that portion of his series, but I am sure it is an excellent method as well.

Dustin


#5

dustin,

thank you for your insights and it do helped me view things more simple and easy :slight_smile:


#6

Cool!
Just played around with this. Great and easy setup. When moving the joints you just set the motion path U value to the same for start and end, right, so I’m not missing something?
For example, if you have a span of 7 points each joint will move 1/6 down its length.
And you have to attach each joint to the motionpath, seemed I couldn’t duplicate it with any options that would work.

I’m a little confused about the clustering part. Though it’s easy to manipulate the weighting how many clusters do you use and which vertex points are assigned to which.
Also, do you split the arm in 2 curves - Upper and lower arm and set the bend so it will look like it’s flowing through the elbow as in this setup - http://www.duncandonuts.co.uk/bendyarm.html
(though it’s made of splineIK, and must use this way).
If not, I have a hard time seeing how you can control the elbow, as when you want to plant it.

Thanks for sharing!


#7

Hi Geuse, you are correct with spacing the joints along the curve. My description was really basic for what is actually happening, as I have a lot going on. But at it’s core:

  1. 3 joint chain setup; 1 FK, 1 IK, and the “Blending” joints that switches back and forth between IK and FK. The “Blending” joints is the joint chain that the character would normally be skinned to, but I created the curve joints for that instead.

  2. 2 NURBS curves; (use the cv or ep curve tool) 1 from the shoulder to the elbow, 1 from the elbow to the wrist.

  3. The 2 curves have 4 CV’s; one at each end, and 2 inner CV’s. Where you place the two inner CV’s is up to you, however I found they worked best closer to the ends than the middle of the curve

  4. For the upper arm curve, there are two clusters. Both are grouped (just for my own sake), the top 2 points’ cluster group has it’s pivot on the shoulder. The other group is on the elbow.

  5. Repeat for the lower arm, and the elbow cluster for the lower arm can share the same group node as the upper arm elbow cluster

  6. The shoulder and wrist cluster groups are parent constrained to the respective “Blending” joints.

  7. The elbow cluster group takes only half the rotation of the elbow. There are a few ways to do this, like parenting the group to the elbow joint, and then setting its rotation to (elbowRotation * -.5) or use aim constraints so it points midway between the shoulder and wrist.

*Now, the curves should follow the “Blending” arm joints and as any of the arm joints are rotated, the curve should bend with joint.

  1. Attach the joints to the curve with motion paths. Delete the keys on the u value, and space them out accordingly. You will also need to create a locator or use some object for the up-axis, to make sure the joints do not flip and pop. This is the main disadvantage of using the curves instead of a ribbon.

  2. For the “ElbowCurve” joint, (the one that is centered on the elbow) should probably be parent constrained to the elbow cluster group. Putting this joint at the very tip of a curve can cause weirdness. Or, just give it a very small value offsetting it from the end.

*DO NOT PARENT THE CURVE JOINTS TO EACH OTHER, because this will cause issues.

  1. Create a custom attribute called “curve” or something, that goes from 0-1. I have this on my IK/FK switch control, because it is the only arm control I have that is always visible. Then connect that channel to the scale of the 3 cluster groups. So if “curve” is set to 0, the scale of the clusters goes to 0, which stacks all the CV’s on the curves at each joint, so there are no points in the middle of the curve, which makes the curve completely straight.

*It is much easier to set this up with the arms completely straight and along one axis. For my Rapid Rig: Advanced, I had to do quite a bit more work to get it to work properly with arms that could be positioned at any angle.

*Another thing I did is set up multiple curves with multiple controls that affect each other. This gives the animator more control over the exact look of the curve of the arm/leg, in case the curve attribute alone isn’t enough.

This is just off the top of my head, as I do not have my script or rig with me right now. But basically, the curve joints are built on top of the IK/FK joints. Once you’re done you should hide IK/FK and blending joints.

So there’s my trade-secret on “toon limbs”, hopefully it won’t ruin my rig sales! :slight_smile:


#8

Thank you!
Ok, I see. Yes, that makes a lot of sense using 2 points to scale the bend, why would you need any more =).
And of course layering another curve with more cv:s on top is something I’ve been thinking of myself, but I haven’t been really clear as to how to do that. I tried to use a wire deformer, but when creating clusters on the drven curve(the one with alot more points), they will stay at the same spot when the first curve is manipulated. So when you want to offset the second curve’s clusters, they are now way off or really still at their creation position which just looks bad.
I’m not deliberatly trying to make your sales drop, just very curious =) And the simplicity of using curves as opposed to nurbs(where both the u and v-value and the rebuilding of surfaces have an impact of the final result) really makes this so ingenious :slight_smile:

Thanks
All the best!


#9

Alrighty, here are the steps that I took for layering another curve on top:

B1) Follow the previous steps up to and including #6. So For the elbow cluster group, instead of constraining that to the elbow, create an “elbow curve control”, and attach the cluster group to that. Then attach the “elbow curve control” to the elbow. Now you want to give the elbow curve control the 50% rotation (instead of the elbow cluster group from the previous steps).

B2) Attach a “lower arm control” and an “upper arm control” to the midway points of the existing NURBS curves for the arms using the motion paths. Both should have a U value of 0.5.

B3) Create two more NURBS curves that span the upper arm and lower arm, just like in the previous steps. So you will need to create the cluster groups with scales driven by the curve attribute, and everything else exactly the same way as the first curves (which I will refer to as the guide curves). The only difference between the guide curves and the new curves, is you add an additional control point at the center of the new curves.

B4) For this center point on the new upper arm curve, create a cluster, and attach that cluster to the “upper arm control”. Repeat this for the lower arm.

B5) Create the joints that you want to attach to the new curves. Create a custom control with a group node for each. You will probably also need one for the shoulder to get the nice flow out from the torso area into the arm.

B6) Attach the group nodes to the new curves with motion paths and space them evenly.

*By attaching the joints with the control and group, you can fine-tune each joint’s position if needed.

B7) For the elbow curve joint, you can simply parent constrain it to the “elbow curve control” created in step B1.

B8) For the lower arm, to simulate the forearm twist, you can use the front twist in the motion paths.

*At this point, everything is getting pretty complex, so it is important to come up with a descriptive, yet brief naming convention.

I think that covers pretty much everything. You will just have to pay attention to the flipping and up axis of the motion paths.


#10

Very interesting, thanks for sharing =)


#11

Do you remember the Jason Osipa Squoosh rig ?

In my opinion, this technique isn´t hard and works just fine. 

I´m currently using that in my PRS (Preset Rigging Solution) system inside 3Dsmax.

You will end up only one simple math to solve:
the relation between the curve knots relative to the curve length segments (value/3 by default) and how to maintain that while stretch/squash.

hope that helps,


#12

mm, yes.
I’ve been thinking about this, and if the joints are parented to locators which in their turn are attached to the curve, then you must be observant on the ratio so it always is 1 when you don’t want it to squash as you really can’t control it in another way. But even so it seems this beats the ikSpline as you infact can turn off the stretch and have the arms and head parented to the end of the chain so they follow without jerking around. Using the ik spline with stretchy feature you really can’t turn it off, but must control the ratio over the course of the animation which is kinda counterintuitive imo. So with this setup you only need to control the squash.

I will investigate this further and post the progress.

All the best to all of you!


#13

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.