# Discussion: bendy arms, uniform or non-uniform

I’m finally taking the step to plunge into mGear and thought to bring something up I’ve been thinking about lately. Namely ribbon rigs. Do mGear use these or something else for bendy limbs?

When you create a nurbs surface to use for a ribbon as in bendy arms, the locators or joints that are attached on the surface are not evenly distributed along its length. Now, in some cases this is what you want. Maybe even most of the cases. But I’m thinking in other cases you want the joints to be evenly distributed along the surface which isn’t possible with nurbs out of the box.

So I’ve set up this ribbon which I can blend the locators to be either standard parameterized or moved into evenly spaced 0-1 range along the surface.
I hope my two images helps to push my point across.

https://imgur.com/mgH92Ni

https://imgur.com/c6jdrhq

I’m wondering what you think and if this already exists in mGear? Is it useful to have or is it just me?
I see there’s a node called percentagetoU, but I’m not sure how that works. It seems it should give me the U-value of a surface by giving it a value of 10%. Is this something that could be used for this. To pipe this into the U-value of the UVPin constraint so it will always be at 0.1 of the surface?

1 Like

I’m not aware of any ribbon stuff in mGear. Mostly it seems to be motion paths and custom curve constraints.

This seems useful. One thing I do is use a closestPoint script to match locators to the correct UV position and then connect them. Then it’s easy to use transforms to have clean uniform spacing, and I don’t have to calculate any UV offset.

I don’t exactly remember what percentageToU is, but I assume it just maps 0 to 100% to 0-1 UV range. It will still distort to the surface, as far as I remember.

Thank you for the reply.
In my setup I created a curve on the surface(as this give me the 0-1 range of equal distrribution) and added locators to it using motion path. Then broke the U-value expression connection and put in a value(0.1, 0.2, 0.5 etc). Created pointOnSurface constraints for each locator to output the U-value which I piped into a blendcolors node which went into the UVPin constraint for each joints U-value, so I can switch between the two distributions.
It sounds like you do it a little differently, skipping the curve on surface altogether?

I will look into the mGear rig and see how the curves works there. Maybe this ribbon setup has just become obsolete with new custom curve constraints.

Thanks for clarification of percentageToU. This is what it seemed like to me too.

1 Like

I don’t think so. They both have their place. The curves in the lips for example, pull their influence across the whole curve. I replace the curve with a ribbon so the pull happens only between CVs. (I loft the existing curves.)

Your way of distributing with a curve is cool. It would work even on a bent surface. My technique is better for straight surfaces, or transferring existing positions to UV.

I’ll be diving into mGear to use as the base with the idea of creating custom components where I want a different setup. Is this the approach you’ve taken or are you building your setup on top of the base rig as in lofting the curves created by mGear? Manually or by scripting, but after the rig has been built.

The main idea of why I do it this cumbersome way instead of just using a curve is because the joints are always correctly oriented on the surface and don’t flip. I’ve found it’s difficult to get all that working properly with twisting by using a curve alone. I don’t have to control their orientation or think about them flipping(at least so far). But I also wanted the benefit of uniform distribution you get from a curve. Maybe I could replace the motionpath locators to a pointOnCurveInfo node, but it’s nice to get a visual feedback of the U values from the curve.

One thing I do is use a closestPoint script to match locators to the correct UV position and then connect them. Then it’s easy to use transforms to have clean uniform spacing, and I don’t have to calculate any UV offset.

and

My technique is better for straight surfaces, or transferring existing positions to UV.

Could you go into more detail of what it is that you do and when do you use it with straight surfaces?
I understand it as such: You start out with a curve with locators attahed. You duplicate the curve and loft a nurbs surface. Transfer the locators using the closestPointOnSurfaceInfo(breaking the connection to the original curve) or is it a script called closestPoint?

I think that’s it. I’m away from computers at the moment.

Nothing is connected. I place or use existing transforms. And then connect the transform and my ribbon into that closestPointOnSurface node just to sample the UV value. Then delete the node and connect it via uvPin or matrix constraint or follicle (whatever you like) with the sampled UV values.

1 Like

I see, thanks for clarifying!