Mirroring Control Shapes Across a Rig

I feel a little embarrassed asking this as this is one of these things one should know how to do at the very beginning - but I can’t seem to figure out a reliable way to do this…!

Does anyone have a technique for easily mirroring control shapes across a rig? I have some unique shapes, which I’ve managed to mirror over before - but keep forgetting how I get there eventually. In an ideal situation, the whole thing would be scripted… :stuck_out_tongue:

For the rig I’m working on in particular, I have the controls parent constrained in (it’s nesseccary for how I’m doing it) and the orient of the joints and transforms stored in a group node.

I’ve fiddled around with various methods, yet I still can’t seem to get this right!

Sorry for the beginner question. :frowning:

Thanks!

EDIT:

Okay I feel like an idiot now. Is it really as simple as taking my control group and mirroring the the scale and rotations in the axis I’m flipping it in? :stuck_out_tongue: It seems like something I’ve tried a million times before but never worked! Haha!

EDIT No 2:

Nope. Still not getting this. It is such a headache! So yup. A solid working solution still needed while I fiddle around with channels. :frowning:

Also, maya is giving me lots of annoying micro values with my FK/IK joints due precision issues. Is there any easy fix to this - or is an 100% scripted rig the only way to avoid this?

Thanks again.

[QUOTE=Wuffles;15976]I feel a little embarrassed asking this as this is one of these things one should know how to do at the very beginning - but I can’t seem to figure out a reliable way to do this…!

Does anyone have a technique for easily mirroring control shapes across a rig? I have some unique shapes, which I’ve managed to mirror over before - but keep forgetting how I get there eventually. In an ideal situation, the whole thing would be scripted… :stuck_out_tongue:

For the rig I’m working on in particular, I have the controls parent constrained in (it’s nesseccary for how I’m doing it) and the orient of the joints and transforms stored in a group node.

I’ve fiddled around with various methods, yet I still can’t seem to get this right!

Sorry for the beginner question. :frowning:

Thanks!

EDIT:

Okay I feel like an idiot now. Is it really as simple as taking my control group and mirroring the the scale and rotations in the axis I’m flipping it in? :stuck_out_tongue: It seems like something I’ve tried a million times before but never worked! Haha!

EDIT No 2:

Nope. Still not getting this. It is such a headache! So yup. A solid working solution still needed while I fiddle around with channels. :frowning:

Also, maya is giving me lots of annoying micro values with my FK/IK joints due precision issues. Is there any easy fix to this - or is an 100% scripted rig the only way to avoid this?

Thanks again.[/QUOTE]

dont know exactly what your ssking as i dont know what your rig looks like, but copying or mirroring over curves to another side is justd duplicating all tthe controls you want mirrored, grouping them in 1 group, make sure that the local rotation axis is on the center of the scene or atleast the center of the mesh you are rigging and then set the axis you want to mirror over in -1 on the group.

then ungroup all the objects, freeze transforms where necesarry or regroup objects that have a rotational value on their local rotation axis (best to create an empthy group and parent constraint that to the curve and delete the parent constraint, then parent the curve onto the empty group) clean all the curves from consraint nodes and such and then recreate the constraints as they are on the other side of the rig.

as for the micro values, what types of values does it give? if these values are 0.00001 or less (0e**** numbers then it is not really a porblem thats just maya having problems finding the exact value maybe because of the complexity of te rig or amount of nodes attached)

hope this helps a bit. its a short version of the explenation as i use it most and my understanding of how maya works

good luck

Thanks for the response peerke!

It seems like it should be that easy, but I was having trouble perserving the mirror rotations with the groups, especially where the orientation in the joints is set to behaviour - meaning that X points in the opposite axis. I have groups to zero out the controls and perserve the values, and everything can look good until it is parented in - then things can flip or go crazy.

I’d mirrored over the controls I had but it took a lot of fiddling of values for some reason. I just wondered what the step by step process would look like copying the curves over. I think the step I might have been missing was the parent constraining bit, after you’ve grouped and flipped the curves, to reorient the control groups into the same LRA as the joint.

As for the micro values, yes - they are like -0 or 0.0001, 0.0003 and such values - it’s just irritating having messy channels. Though I am sometimes getting more unpleasant and larger rotations like 0.346 etc with my IK chains. I guess this is due to the nature of IKs. What is the exact cause of this? It must be something due to the planar nature of IK joints or such - but I’m also getting this in IKSplines.

Thanks for your help! :slight_smile:

[QUOTE=Wuffles;15989]Thanks for the response peerke!

It seems like it should be that easy, but I was having trouble perserving the mirror rotations with the groups, especially where the orientation in the joints is set to behaviour - meaning that X points in the opposite axis. I have groups to zero out the controls and perserve the values, and everything can look good until it is parented in - then things can flip or go crazy.

I’d mirrored over the controls I had but it took a lot of fiddling of values for some reason. I just wondered what the step by step process would look like copying the curves over. I think the step I might have been missing was the parent constraining bit, after you’ve grouped and flipped the curves, to reorient the control groups into the same LRA as the joint.

As for the micro values, yes - they are like -0 or 0.0001, 0.0003 and such values - it’s just irritating having messy channels. Though I am sometimes getting more unpleasant and larger rotations like 0.346 etc with my IK chains. I guess this is due to the nature of IKs. What is the exact cause of this? It must be something due to the planar nature of IK joints or such - but I’m also getting this in IKSplines.

Thanks for your help! :)[/QUOTE]

i dont know if you are able to post one of those rigs you mention online or an example of it, it sounds to me like your doing something wrong in the fundamentals of the rigs to get those big messy values.

and the mirroring can still apply, but then you need to scale/rotate the transform in the direction you want, put a locator on its local rotation axis and then select the control vertices and with either scale or rotate selected(whatever option you used first) to give the curve its original position/form. its a bit of a hassle but at the moment i cant think of another way to do this

edit:
the other option may be to create an empty group, parent constraint this one to the control, delete the parent constraint, discrete scale or rotate this group until it has the desired axis, parent the control in this group and freeze the controls transforms

Cheers - thanks for that! That’s pretty much what I’ve been doing with my control shapes, but fiddling around with the CVs and trying to get them to match is super annoying. The second method sounds useful though, and I’ll try that one out to see what works.

Yeah, I’m aware that I must be doing something wrong with my FK/IK switching to get values like that. My arms and legs are fine with their values, but I’ll need to take a second look at the IKSpline chain to really see what wrong. :\

I’d like to post the rig online when I’m finished it - but I don’t think I can right now as it’s part of my university project.

Thanks for your help so far - I feel really nooby for asking all this stuff - but it takes a lot of mistakes to learn what to avoid and how to do things properly.

Late to the party, but:

When mirroring for behavior the aim and up axes are negated on the opposite side, so if you know the aim and up vectors of the original control (if you build the control off of an oriented joint, then you can grab the aligned worldspace axes and use them), then you can flip controls in that way with an aim constraint.

Myself, I tend to be very lazy, so I use one of two other methods:

  • Create and snap a joint to the control.
  • Run Maya’s mirror joint, with behavior selected.
  • Duplicate the control and snap it to the joint, then delete the joint.

The other thing you can do, which is one of my favorite recent tricks, is duplicate and snap the controller to the joint it’s meant to control on the opposite side. Then use the PyMel commands to copy and set the points:

import pymel.all as pm

ob = pm.ls(sl=True)[0]

## you'd likely do a real snap here like pm.delete(pm.parentConstraint(ob, jointTarget)), but this gets the message across
dupe = pm.duplicate(ob, rr=True)[0]
pos = pm.xform(q=True, ws=True, rp=True)
pos[0] *= -1
pm.xform(dupe, ws=True, t=pos)

## get the points
## this generator grabs all the worldspace positions and negates X for each all in one line
points = [ (pm.dt.Point(-x.x, x.y, x.z) ) for x in ob.getCVs(space='world')]
dupe.setCVs(points, space='world')

## if you don't update the curve, you may not see the change.
dupe.updateCurve()

Dunno if this will help you now-- I’m sure since you posted you’ve found a solution-- but I thought I’d put it up anyway in case someone else was looking for the info.

I tend not to do the group / scale -X thing because if you forget to re-freeze the control in the new proper orientation then you get that wonky weird flipping you mentioned, and I ALWAYS forget to freeze when rigging manually. :rolleyes:

1 Like

Hey, don’t feel nooby for asking questions because it’s the best way of learning. Those who are not afraid of asking are the ones who learn the most and teach the most as well, the others leach >_^

Thanks dude. :slight_smile:

I just felt it was something one should really just know how to do, but I figured out there isn’t just a “solution” - it depended on how I made everything in the first place. Because my joint orients had been mirrored in behaviour, I had to flip the scales on the offset groups. It was a pretty easy solution in the end (just meant that I had to break all the hierarchy and parent stuff in again) and it was pretty simple when I broke it down. I think my brain was frying because it was uni deadlines and it was just one of those problems that occurs after hundreds of others that broke me - if you know what I mean. :slight_smile:

Next time, I’ll script it. Haha!