This is my first post at XSIBlog, so I want to thank Patrick and the other authors for keeping this going. I have always wanted to share but time is always against me not to mention having something worthy of sharing.

PLEASE NOTE: The following python scripts require this procedure to work properly.

Facial Animation

A thread started at XSI Base simply named, facial animation (questions), many facial rigging and animation concepts were shared. The two concepts discussed mostly were your traditional shape animation controlled by in scene controllers (a la Osipa) and also using Control Splines or curves with many complex rig elements that give you the desired motion. At the end of the day shape animation gets you pretty far with many character types ( realistic and stylized ) and setup time is pretty fast. The setup time is also important here, Softimage considers this a feature for FaceRobot that they market and rightfully so. Time is money, producers know this as should you! So if you will hear me out I am going to explain a way for you to continue to use shape animation and still get the low level control over subtle face movements.

The Static KineState

What is the Static KineState? I am sure anyone spending any amount of time rigging knows something about it. So lets define it for those that don’t.

The Static KineState indicates that an envelope is applied to the skeleton element. The StaticKineState is the initial position of the skeleton when the envelope was applied, and is used for envelope calculations.

If this property is storing these initial values then I must be able to change them. This is the gem that makes this rig work.

Dorritos

Now we are going to make the rig. This is not intended to be a tutorial so I apologize if I miss steps, all the project files are included at the bottom. So lets go over the rig!

I am starting with Primitive>Character>Face Man and I first made a quick “smile” shape, followed by a typical neck, head, and jaw for the character. I used nulls instead of joints for simplicity sake.

Now I am going to make a clone of this enveloped head and immediately remove the duplicated shape cluster, envelope cluster, and the “ShapeWeights” property. The clone uses the “CopyOp”, with this we get all the deformations from the first head which include the envelope deform and shape deform. Now we need to setup the local deformers for the cloned mesh.

These local deformers use an “Object To Cluster” constraint. I like to use edge clusters but you could use any SubComponent you choose. So I picked an edge in the corner of the mouth and ran this handy script that creates the cluster, the object, constrains them, and makes the local deformer. You need to select a component on the original head, and run the script.

At work we call this controller a “Dorrito” because when the first “on the face” rig came out, one of our animators, Jason Taylor, started calling it that and it stuck. So my controller is a flat pyramid that looks like a Dorrito, so I suggest you do the same :) Now I will add an envelope to the cloned mesh and choose this Dorrito as a deformer. I now need to paint the cloned mesh’s envelope. The way I do this is add another deformer to the deformer list, set all the points to 100 % of this new deformer, and then choose the Dorrito and paint it’s influence. Once I am happy with the deformation I just remove the extra deformer from the envelope and I get zero weights except for where I painted the Dorrito’s influence. This deformer moves with the cluster constrained null, but it causes this nasty double transform when I rotate the head!

Why is this happening? Because you have the first envelope on the original head which is deforming the points based on the transformation of the deformers (neck, head, and jaw). Then you have a “CopyOp” and another envelope above that is getting transformed by the same movement so XSI just does it twice! What you want to do is subtract that first envelope transformation from the second envelope transformation. The Static KineState gives you access to that intial position. If you take your deformer’s Static KineState property and set it’s parameters equal to the global transform parameters of your cluster constrained null you will effectively be constantly reseting the deformer’s initial position. Here is a script to setup the expressions between the cluster constrained null and the local deformer. Just select cluster constrained null first, then the Dorrito.

There are many ways to rig a face and none should be discarded from any rigger's toolbox. I hope other riggers will get some use out of this technique and will share their work with us. Before I go, I want to thank my rigging supervisor Remi McGill for suggesting the usage of the Static KineState and Blur for allowing me to share with the community. Below are the project files which includes the scripts. Thanks for reading!

This entry was posted
on Wednesday, May 23rd, 2007 at 10:12 pm and is filed under Python, Rigging.
You can follow any responses to this entry through the RSS 2.0 feed.
Both comments and pings are currently closed.

22 Responses to “Facial Animation, The Static KineState, and Dorritos?”

Interesting technique, thanks for sharing. :)
I’m just wondering why is the scale not included in the static kinestate expressions?
I understand that the constrained null will only be constrained in position and orientation to the cluster, but if it is parented under the head and the head scaled wouldn’t you get double transformation there too? Where do you normally keep the dorritos parents in you rig hierarchy?

normally these are under a different nested model, its kinda of “deformation” layer, and they also have a hierarchy buffer that could handle the scaling issue. i haven’t tested it but you could link up the scaling too if you would like. you could even link it too its own transform so its cancelled out

i am actually going to suggest you do link up the scaling. i haven’t run into any problems not linking the scaling. the scene i provide works fine when you scale the head, no double transform on the dorrito.

i have seen keith’s facegui demo. while it is great, this wasn’t the inspiration for this blog. there was two previous ‘Dorrito’ rigs present at blur before i was tasked to conventionalize and simplify the setup. the means i think are the same, but these setups are different.

the idea presented here is secondary deformation. you still use shapes to achieve expressions, what the ‘dorritos’ are doing is allowing local adjustment to the shape animation. it is to add subtleties to your shapes without having to go back to modeling of extra shapes and mix a ton of shapes at once. remember gollum’s first face rig? i remember bay mentioning 800 targets, yeesh?!. keith is using the controls to do all the deformation to the face, which isn’t the case for this rig. this setup doesn’t change anything about how your used to rigging. your make a rig for the character, envelope it, apply shapes, and then if you choose you can add this on top without much fuss. it doesn’t use third party tools to do attachments ( keith uses “dj_rivet” ) or deformations ( he also uses “softModManipulator” ).

using the static kinestate i believe you can replicate keith’s setup very closely, but in my opinion shape animation is still the fastest, while staying affordable, way to do facial animation.

no need to apologize, i just wanted my reason for posting to be clear :) i hope you have learned the important part about this posting, which is the use of the static kine state. facial animation is just one application for this, i hope others will experiment and post their findings.