In the Project Overview for the Roller Derby Rig, I identified some of the main problems I need to resolve for this rig. I do have some ideas as to how to resolve these, so that’s what this post is for.
Muscular Deformation – This rig is going to be fairly realistic in appearance, so I’m going to need good muscle deformation – not something you can get just with good skin weights.
I’ve found a few methods for this so far:
Supporting joints – This method involves essentially just adding more joints to the rig where muscles would be and scaling/rotating/translating them as appropriate for muscle movement. I’m not very confident with skinning yet, so I’m not super thrilled about this method. It also seems like it’d be pretty messy in terms of the outliner.
Third party plugin – There are some really good 3rd party deformers out there that give really nice muscle-sliding-under-skin effects. Look at the L3Deformer by Lightstorm 3D for a really good example. While this would give good deformation really quickly, I want to avoid 3rd party plugins for this particular rig – mostly because I want to add this deformation into the Automated Rigging Module.
Add geometry or curves as influences to skin cluster – If you do this straight after applying skin (before you do any weight painting), it actually works pretty well. It has a nice soft falloff, and if you’re just scaling the muscles or slightly nudging them around it looks pretty nice. Unfortunately because the geo/curve is essentially acting like a joint, it doesn’t slide UNDER the skin, it drags the skin with it. Ultimately it’s a good method if you’re not gonna be looking too closely, but it’s not good enough for me.
Use a sculpt deformer – I think this deformer is new to Maya 2016, and it’s pretty darn awesome! It has an advantage over a skin influence object in that it actually slides under the skin. It’s super quick to set up, too. Unfortunately just slapping it on doesn’t work super well, as its falloff is super harsh. I’m gonna have to play around with it and see if I can get the falloff to soften out a bit. If I can, it’ll probably be my preferred method.
Note that this won’t look good AT ALL on a low poly mesh. You’ll have to smooth it before applying the deformer.
Fig1. Top is a nurbs object added as a skin influence. Bottom is the same nurbs object deforming the mesh with a sculpt deformer. Note that the shape was somewhat arbitrary, and that a more appropriate object to use would be faces duplicated off the target mesh.
Facial Deformation – Facial deformation is something I’m still very new to. Until now I’ve only used blendshapes, but I’ve done a lot of reading and watching tutorials and it seems that a combination joint/blendshape system would be most effective. Here’s my thoughts on it:
Joints only – I mentioned earlier that I’m not particularly comfortable with weight painting yet. I think it’ll be easier to paint weights for a face than (for example) fingers, since you’re dealing with sections on a more-or-less flat surface as opposed to getting skin to fold in the right places. That said, I feel like some shapes would be really hard to get with joints only, and it might be hard to get all the joints in all the right places.
Blendshapes only – Blendshapes are pretty robust and I’ll have a lot of control over how the face will deform in terms of expression. The problem is, I want the animator to have that control. Animators would be limited by the shapes I make; although it would be easy to add them later on down the pipeline. Ultimately I think using exclusively blendshapes might be too restricting.
Blendshapes and joints – Best of both worlds. I’ll be able to get the trickier shapes with blendshapes, get nice arcs in the eyelids, and give animators as much control as possible without sacrificing appeal.
What’s more, I’ll be able to include blendshapes, joints, and a combination system as options in my Automated Rigging Module.
Skater names and numbers – In order to morph between characters, I’ll need to be able to adjust the skater’s displayed name and number on the fly. That should actually be relatively easy. I’ll create an image file for each letter (both capital and not) and number, and add an attribute on the world control (or a settings control) for player number and name. Each number and letter will be brought into maya in a file node, with place2dTexture node attached, plugged into a layered texture node.
From here I’d have a scriptJob node looks for changes in an attribute. From there, I’d have it execute code in a script node which would:
Look at the len() of the attribute, and use that to decide on the UV coordinates to slap into the Translate Frame attributes of the place2dTexture nodes.
Runs a for loop (for num in attr), which makes that letter/number visible.
If that letter/number is already in use, it’ll duplicate it and plug the duplicate into the layered texture node.
It’ll do some fun math (which will be dependant in part on the UVs) to change the place2dTexture node’s Translate Frame attributes, so it all aligns nicely.
Probably I’ll add something in there to delete duplicates when it changes again, too. No sense in cluttering up the scene with unused nodes.
Possible issues: I’ve read that scriptJob nodes don’t get referenced correctly, so I’ll have to check that. Potentially I could have a script node execute when the rig is opened to create the scriptJob node, if that’s the case. Also since this is all just theoretical at this point, it’s not actually guaranteed to work. Hopefully it does though ’cause that’d be sweet!