A while back, I joined an online course over at RiggingDojo to challenge my facial rigging ability. Rigs I had made up until that point either didn't need much facial animation or used blendshapes - which are possible to use in games but don't upscale well, leading me to regard them as Tantalus would his fruit. The course was led by Ryan Griffin and the object was to make game rigs for Kenny Roy's charity project I, Hope. It was good work experience and definitely elevated the quality of my face rigs. Ryan has serious character rigging chops, and - having just finished working on a game with some great joint-based face rigs - introduced us to the setups, techniques and tools he used.
The biggest takeaway was the NURBS-surface-and-follicle setup that we used for character faces. Here's what I ended up making:
Despite some very limited geometry, the resulting deformations were pretty nice.
Essentially, the controls just pipe their translate X and Y channels - after a multiplier is applied - into a follicle's U and V parameters, and each follicle drives a joint. The surface based setup had several advantages: first, it easily defines regions for each joint to move in, making the rig easier to use; second, since the joints slide along surfaces, it creates the appearance of flesh sliding over bone - incredibly useful for the face. Both of these points means that the exact shape of the NURBS surfaces matters a lot, and can be leveraged to finesse the deformations.
Despite the sweet face rigs we had finished with, once the class was over I still felt like we had run out of time to fully explore and exploit the opportunities that this technique afforded. Ryan had showed us how the rigs could be taken to another level by adding blendshapes to the surfaces, which we could use to pose out expressions and phonemes without any additional complexity making it into Unity. By that point, though, we had to ship the rigs, and went our separate ways with what-ifs. I wanted to pursue the technique further and make my own style of surface rigging tool, one which addressed a couple of areas where our iterations fell short. First off, the rigs we made were based on a cut-and-paste template of surfaces - meaning they would be useful and efficient for similar humanoid faces but not much else. Secondly, the set-up of compound controls was a bit unintuitive, being centered around manually converting world-space translations to the UV spaces of each surface (which were all different). And third, the surfaces themselves seemed too small, numerous and oddly shaped to efficiently use blendshapes and other deformers.
I was interested in making a surface rigger which was 1) abstractable and mesh/rig agnostic, 2) took care of world-space/UV-space conversion itself, and 3) could make larger, compound surfaces which represented "blendshape-able" regions. I also wanted to design make something shareable, meaning self-contained (minimal files, no custom nodes) and using an interface that made the workflow transparent and obvious. Rather than belabor this with too many words, I just made a quick demo of my tool: SurfRig!
This one just covers the basics of using SurfRig, but there's also a demo of the more advanced features. You can find it on my github. I do intend to ensure its functionality into the future, so please let me know about bugs or feature requests!
Download the bkTools module here - it comes with the rest of my Maya utilities. You can ignore most of it if you wish, but the other modules are pretty well documented if you feel like poking around. Follow these steps to use it:
1) Put the contents (the bkTools folder and Qt.py) in your Maya python scripts path. I've talked about Qt.py before. It's great. Credit to Fredrik Averpil.
2) Open the SurfRig UI in Maya with the following:
from bkTools import surfRig surfRig.main()
That's it. Happy rigging!