View Full Version : How do I mirror skin weights for joints that sit on top of each other?
07 July 2007, 10:30 PM
I'm using a 'fan' style joint set up for my eyelids- I have a series of joints that sit at the center of the eyesocket and rotate to different degrees when the eyelid closes. The weights of the lid are distributed across these joints. I've got everything painted so the results are exactly what I want on the left side.
Now I need to mirror those weights to the other side (Maya 8.5) but there seems to be huge problems with mirroring when joints are in the same place. The Maya method which works so well with transfering from approximate topologies and such seems to break down under this specific case. (XSI's approach is based on specifying joint pairs in a symmetry map and doesn't suffer this problem).
I tried pretty much every combination in the mirroring option box for both the surface association and the influence associations. I went in and individually set lables in the attribute editor for the joints - i've tried it with sides set to left/right and with sides set to none. Neither seems to work right.
Basically, the mirroring system seems to find the first joint of the fan and assign all the wieghts to it, ignoring all of the other joints at the same location. Does anyone have a solution for this? Know of any scripts that would handle this sitch?
Huge thanks in advance for any advice.
07 July 2007, 10:04 AM
only thing I can suggest is locking the weights you ARE happy with on the joints then doing the mirror to see if that helps it along?
XSI rules man - that symetry map is genius - theres soooo many cool tools in there for rigging and modelling ("walking-along-the-mesh" in the uv editor for example!!) - really need to get my head back in it.
07 July 2007, 10:10 AM
If it`s just for a few joints and you have a symmetric UV layout, you could export those Attribute maps, flip them in i.e. photoshop and then import them on the mirror joint.
07 July 2007, 02:37 PM
I had pretty much the exact same problem a while ago. I originally did it Buexe's way but that doesn't always produce solid results and you need a very solid uvmap and bake at a high res to get everything working properly, besides it makes editing afterwards a bitch.
However I did get around to it by using labels and a specific influence association. Make a unique label type for each bone per side (eyelid_upper, eyelid_lower, eyebrow, etc) and obviously right/left for each side per label type. Then the only way I could get it to mirror after all this was set up properly was using these settings:
Surface association: Closest Point on Surface
Influence Association 1: Label
Influence Association 2: One to One / Closest Point on Surface (both worked for me, as long as you don't use 'none')
Here's a thread with my experiences regarding this issue, but there's not much new stuff in there, save perhaps the way to do it using baked vertex weights. http://forums.cgsociety.org/showthread.php?f=88&t=483901
Of all the countless ways to mirror weights this was the only way that worked for me. Good luck!
07 July 2007, 02:52 PM
I know it`s a PITA, I have written myself a MEL script in the end that will handle this mirror stuff, even mirror the UVs so that I have a symmetric UV Layout.
07 July 2007, 03:18 AM
Thanks everyone for the help. I ended up (grrr. arghhh!) brute forcing it and editing everything by hand in the component editor. It's awful when you start to get efficient and manually doing something you should NEVER EVER have to do that way. It was a job just large enough to be really annoying and just small enough to not justify the R&D underdeadline of scripting a really robust solution. Silly maya.
Anyway, thanks again for the help. I'm going to write up a script when I have the time to basically emulate the symmetry map features in XSI which will solve this issue and then some, but it will take some time to do it right so it's on the 'to do' list for now.
07 July 2007, 07:52 PM
Late response here so I'm sure the OP has already solved this but here's the solution I use when mirroring joints overtop one another.
Detach skin (keep history)
Grab joints needed moving (I just select by a flag in my script and then replace the first array value with the inverse).
Shift them using xform a few degrees apart
Re-xform the joints back to origin
works a treat for me, albeit not the cleanest approach but I haven't had a problem yet with it :)
07 July 2007, 03:52 PM
Nice one Shawn. Pretty simple to script up. I don't recall ever running into this problem before but if I do this bit of info will come in handy. :thumbsup:
07 July 2007, 03:24 AM
I'm late to the thread, but I just thought I'd mention that I wrote a script for this very situation (assuming the mesh is symmetrical) a while back. You can find it on my site if you're interested:
07 July 2007, 03:24 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.