PDA

View Full Version : Facial animation rig


Chinwagon
07-19-2005, 09:21 AM
This is my first experiment in making a proper bone based facial animation rig. This rig doesn't contain a single morph target and all of the deformation is done with skin envelopes.
Previously, I've often used morph targets coupled with jaw and head bones, which works fine but is pretty laborious to set up as you all probably know. This experiment has been probably even more work but I think that's because it's the first ever time I've done it. I'm hoping that this setup can be transposed to other characters with relative ease.
The benefits are that the face looks less like a collection of poses, it keeps its volume nicely through different expressions and manipulating it with controls on the actual face makes it just plain easy!
The hazards are that there is a lot of tweaking of skin envelopes to get the right part of the face following the right bones and getting a proper "oo" shape is the toughest part (it's the same with morphs too though).
It's still work in progress as the worried brow shape needs work, I'll add a tongue and the "oo" could be a little better.

Facial rig usage: (http://www.bradnoble.net/rigging/facial%20rig%20usage.zip)

Facial rig a little more in-depth: (http://www.bradnoble.net/rigging/facial%20rig%20in-depth.zip)

http://www.bradnoble.net/images/facial%20rig.jpg

:¬)

Tak Tak
07-19-2005, 12:09 PM
How are you Brad? You are doing some nice looking job again:thumbsup:
For me bone based facerig is totally new thing so can you tell me how many nights did you rig it up? I can just imagine that skinning...hell.

Good luck and please continue your superb job.

save often
07-19-2005, 02:11 PM
now that looks realy realy nice. great work brad. you say the hazards are that there is alot of tweaking of skin envelopes. weather it be morph targets or bones for facial expressions both are going to be time consuming. it`s which gives the better results at the end of the day and having seen those .mov files i know what i`ll be using in future. can`t wait to see the finished rig.

keep up the good work.

Aearon
07-19-2005, 03:40 PM
Hi Brad, looks awesome so far, really expressive model too!

I especially like how you set up your sliders with intuitive naming... and they work great in conjunction with the helpers on the face. do the helpers have limited movement (clamped to the slider range)?

how well do you think this rig would work for a realistic face?

ReneAlex
07-19-2005, 03:58 PM
Hi Brad!

A few questions?

those manipulators... are like the ones in your biped rig.. ok, so how it s works?

2nd: the motion of the manipulators seems to be constrained, if that's the case; they are constrain to what??

and... it would be very useful to see what is in those layers call "hidden stuff" :)

I'm absoluty plugged this topic is a killer... hehehe

great job, congratulations ! !

luigi
07-19-2005, 04:26 PM
Very impress with the setup , the mouth area is awesone like how evethin greact two the movement you totally loose the pose to pose lok you speak that you normally get with the morphs.

Impress how the movement of the controls of the face move in a proper direction without breaking the face and keeping the volume on the face. lovely manipulator than allow to play in the scren like clay.Are the bones moving on path or free in the 3d space.

i lIke the eyes and brows area but im missing tree controls for brown to get more specific poses.you stil can have one father than make the hol eyebronw goes up and dwon but wil be lovely to have tree extra point to control it.

the same with the eyelids wil be great.

You brain is amazing , ive been doing on the job like you know and aproach with moprhs and nice gui , that is coming nice but i endup doing script controller with ca for be shave again renaming.things like third morphs that actives when to other break the mesh and fix the problem.is verypowerfull but stil mishing the way you manipulateon screen more like clay.


so in your setup for a new rig you will have to redo the skin and reorganize the position of the bones in mine will be to redo the morphs . i dont know what aproach is quicker but for a good and accurate rig doing moprhs or bones should be the same amount of time.

the clever idea is have sytem that can be reuse for diferent meshes.mine actacking the new mesh and erasing the old one in al the targets the idea is to only redo the morphs the conection script and gui will stay.Your redoing the skin and moving the bones.

One good thing about bones is you can redo the face mesh easly and the system continue working, for morphs i end up doing edit poly on top of the mesh and pasting this editpoly to all the other moprh targets by script and reloading the targets.With moprhs is a bit tricky and need take care how to use edit poly on stack.

both sytem have good things .

well master your padawan continue learning in his new job , try to do stuff to show all this new ways I being doing last months.

Chinwagon
07-20-2005, 03:51 PM
Thanks for the compliments guys. To answer your questions:
The manipulators are point helpers like I have on the skeleton rig. The lines point to their parent and come from turning on the link display option (with "draw links as lines" turned on in the preferences).
These manipulator points have a position list with a position XYZ controller at the base with a position constraint on top of that. Let me give you a little text picture of the list:
-> Position XYZ
Position constraint
The position XYZ is the active controller so you can move it around but the position contraint on top cancels out that movement. What this does is give you the ability to use the manipulator's movement to drive other things while still having control over the position of it (by using the object the manipulator is constrained to, to determine the position of it).
The manipulators are two-way wired to the custom attribute sliders. The sliders are the ones that hold the keyframes and they have built in limits (though you can break those limits by changing the keyframe values). The limits on the manipulators are done in the wiring dialog.
For example, let's say I want to wire the jaw up/down slider to the x position of the manipulator. In the wiring dialog on the manipulator's side there will be the word jaw_up_down_slider (or something like that) and on the slider's side there will be X_Position. To limit the x-axis position of the manipulator between 0 and 100, on the manipulator's side I'll instead put in:
if jaw_up_down_slider < 0 then 0 else
if jaw_up_down_slider > 100 then 100 else
jaw_up_down_slider
This basically says that if the amount the manipulator moves is less than 0 then stay at 0 and if it's more than 100 stay at 100, otherwise, move by the same amount as the slider.
On the slider's side of the wire parameters dialog I enter:
if X_Position < 0 then 0 else
if X_Position > 100 then 100 else
X_Position
I'm still yet to understand in which situations doing only one side works and which situations it doesn't. This is just to make sure it works.
As you probably guessed, the "hidden stuff" layer is the guts of it all. It's mainly made up of points position constrainted between certain parts of the face with varying percentages. The bones are all stretchy with position and lookat constraints to various points (the bones are all set to stretch except for the bones at the lips which are set to squash).
The pink bones seen in the second video are mainly to create bulges. When certain points are moved closer together it pushes out a point a few of the pink bones are constrained to, simulating bulge. The amount of bulge and its falloff is controlled by the reaction manager. Most of these cheek bulges are done but some are still to do.
In 3D everything kinda has to work down a hierarchy and in this case the jaw moves the corners of the mouth up and down, the corners move the top and bottom lips when moved left and right and the parts of the lips in between the top and bottom and the corners are affected by everthing else. The bones are all constrained to follow all of these parts and they move the skin.
The skinning did take longer than I thought it would but that was because it was the first time I'd ever skinned a face. Now that I have a better grasp of what should influence what, setting it up for another character should be a lot quicker. I guess it's that same as morphs, the first time you do it you're not sure what shapes you need to make, but the more you do it, the more you learn which ones you'll need and which you won't.
I hope I've answered your questions. I try to post some more images about how it works more in depth.
:¬)

kobeone
07-21-2005, 04:37 PM
O My Goodness, Now this is a facial rig. A++++ Work. More Please.:bounce:

bindyeye
07-22-2005, 03:32 AM
Brilliant rig brad, and faultlessly executed.
Looking forward to learning more about this setup... Gw.

Chinwagon
07-22-2005, 10:44 AM
Thanks guys.
Since I first posted I've been putting the facial rig onto a character with the skekton rig already on it. I kind of expected it but when you link all of those constrained points onto a rig with a lot of constraints already there, it slowed to a crawl. Well, to be more precise, it was quite acceptable when moving around the arms, legs and head but would pause for a good 10 to 20 seconds before you could move or rotate the hips. Not good.
Hopefully 3dsmax 8 will continue its trend of rig speed increases, but until then I'm going to unlink the facial setup from the body and use two skin modifiers, one for the face and the one for the body on top - in effect using the facial setup in place of where the morpher would normally go.
It's already much quicker without it linked but the problem now is to get the manipulator controls to follow the face while the actual bones and points deforming it are back at the original skin pose position.
Just thought I'd leave you with a picture of the complete facial rig (ie. with the "hidden stuff" layer unhidden).
:¬)

http://www.bradnoble.net/images/facial%20rig%20hidden%20stuff.jpg

kees
07-22-2005, 01:34 PM
hey Brad,


Woow...that's a lot of green ;)
Very cool rig though.
If you'd like to get this rig tested for performance with max8, you can consider passing it to Discreet. Or pass it to me or Paul Neale or anybody else you know is working with Discreet testing max8 and we can drop it into the right hands. (don't put it off for to long though, since there is only so much time left, if you want your rig to be tested)

Again, nice work.

-Kees

grury
07-22-2005, 02:48 PM
Wow Brad, thats absolutly awesome!
Cant even start imagining how much of a nightmare the skining must have been.
Congratulations!

Cheers

Grury

cecofuli
07-22-2005, 03:01 PM
:eek: :eek:

If you write a book, i pre-order it now! Congratulation, He's remember me The Incredible.



compliments!

marktsang
07-27-2005, 10:46 AM
Since I first posted I've been putting the facial rig onto a character with the skekton rig already on it. I kind of expected it but when you link all of those constrained points onto a rig with a lot of constraints already there, it slowed to a crawl.



hi brad,
what i would do here is not actaully link the facial rig to the body rig, what i would usually do is to add a morph modifier to the skinned mesh and skin a copy to the facial rig. now pick the face copy as a target for the main skinned mesh and put the value up to 100 (dont forget to check auto update targets) and leave it there, now any change you make facial rig will carry across, you can also easily add the controllers objects over and link them to the full body rig and wire them to drive the real controller objects on the facial rig. maybe you it will work for you also?

mark tsang

Chinwagon
07-27-2005, 12:36 PM
marktsang: Yeah, that'd probably work, though the second skin modifier works in pretty much the same way, facial deformation with body deformation on top of that.
As I mentioned before, the only problem I had with that was that you want the controls on the face to follow where the head actually goes. I was able to solve this using the good ol' expose transform helper to calculate the control's parent's local position in relation to a fixed copy of the head bone and using those values to position an object linked the moving head bone which the facial control are then linked to. I also used this method to get the rotation of the eyes in relation to the head bone to drive the eyelids that move with the eyeballs' rotation (did any of what I just said make sense?).
So now, the facial bones and constraints all stay fixed to their original position (not adding to the calculation of the body rig) and only the facial controls move with the body rig.
:¬)

eek
07-27-2005, 02:30 PM
Nice Rig Brad,

Hmm interesting bone placement, and expose transform idea. This biggest issue,is skinning and a non-destructive pose animaion system (im trying to tackle these both via scripting.) Your finding that skinning has to be really precise!

Anyway nice work!

eek

PEN
07-27-2005, 03:29 PM
Nice work Brad as always. Looks like a very usable solution.

luigi
07-27-2005, 05:21 PM
Hi Brad.



why have the facial controls linked to the body rig. i explain better a lot of times and object another character or hands arms gets inbetween the camera or viewport and the face.
why not have your face that have all the skin and bones ... whith a camera linked to a generic point that will allow you to put the face where doesnt disturb ( normally in my scene down the scenerio)


so you have in one viewport your camera scene and in other the head with the controls.
you can change the camera and focus in whatever part of the face you want. I have done with Ca and Pen atribute holder be able to save the camera position and quicKly have focus on mouth , brow eyes or whatever area I want and add new points of view on the fly.
For the eyes you should have a copy of the eyes on the head that is static with look at and with the help of a expose transform (like you use in other places) translate the movement of the look at target object that you animate.


Personally I have the lookat target object with a Ca that allow to be free in the world or follow the head ( a position constrain too a dummy is free in the world or one who is linked to the head) ) and have the rotation eye object linked to a point that have the looka t. that allow me two rotate eyes without having tu use the look at target if a wont. You will have two rotation, lookat point + rotate eye object .
So if I want I live the lookat following the head and rotate the eyes so don’t have two move the look at when I am focus on doing a facial animation.


Well if you are interested or someone I will explain better this sytem with two faces and look ats using expose transform.

Chinwagon
07-28-2005, 03:32 PM
Hey Luis,
I find it's more practical just to have a free camera linked to the head and pointing at the face. It's very simple to set up, the camera can have manual clipping turned on to only show the face and can be zoomed to various parts of it (you can even use orthographic projection if you want). This gives the option for the animator to not only make adjustments to the face in a dedicated view but to also make adjustments in their actual shot.

I used to not see the point of having the rotation of the eyes linked to the head and only used lookats. Where I work however, a few people like to have the eyes rotate with the head while they're blocking out their animation, so I can now see your point.
:¬)

ngrava
08-01-2005, 04:36 AM
This is really hilarious. Here we have Kees, Paul, Charles and Brad, the foremost authorities on rigging in Max. If they just joined forces they could rule the world. Seriously, you guys should really consider combining ideas and building the ultimate tweakable, flexible, rigging system out there. I for one would be one of your first customers.

-=GB=-

goldenmantis
08-03-2005, 06:10 PM
You said your scene is very slow, I have the same problem once before, the question is: You use too many path constraints. :eek:
Yes, maybe a single path constraints will not slow down you scene, but if you use many path constraints and use them to controll other objects and skin and do many thing else, you will find it turn to a nightmare. :banghead: I had waste a lot time on it.
if you only want a object move through a curve, I have an idea: use a position constraint to replace the path constraint, like this.:deal:

http://goldenmantis.myrice.com/image/nu.GIF

White curve is a NURBS CV curve, five green cross is five point object, the red curve is another point object's trajectory which is position constraint to them five, I use a percent slider to controll the five position weights by a reaction, you can see the reaction curve, when I change the percent, it will move through the trajectory just like it move through the CV curve. :lightbulb So it can replace the path constraints, if you want, you can use more point to simulate complex curve. And it is fast than path constraints.

I'm sorry my english is poor :rolleyes:

eek
08-03-2005, 11:24 PM
Hi all,
I advise you not to use cv nurbs curve or point curves, ive done some research into this stuff and it can become way processor heavy and memory intensive. Even if your using it just as a template. If you have say 15 in a scene.

Its much much faster to access tangent handles with point3 and and float_point controllers on a bezier spline. They seem to be inverted i.e XYZ = YZX. Ive had upwards of 10 in a scene and there really quick.

Other than this is to go for length_interp script fn to control points along a spline (nice idea Paul). Im torn between expressions on points or tangent handles - it'll rest if i can access tangent handles via a script.

eek

m-greenwood
08-04-2005, 10:36 PM
Brad, stop being clever and animate the damn thing! :)
BTW the new office is way better.
Luis do you still show up at mid-day? ;)

luigi
08-16-2005, 05:56 PM
hello brad cool news with max8.


know you have "Limit controller enables you to ease in and out of a layered limit on top of a motion curve. This clamps motion values for greater control and smoother transitions."

so no more
if jaw_up_down_slider < 0 then 0 else
if jaw_up_down_slider > 100 then 100 else
jaw_up_down_slider

Are you still using postion constrain for your manipulators so it doesnt move but allow you to drive a wiring , instead of that use a normal postion xyz with weight 0 ,is much quicker we tested hear at work.

and max8 is going to be quicker Paul said in other thread "The viewport speed in Max8 is definitly faster as are all the animation tools. Trackview, trackbar are fast with no lags in complex characters like has been seen in other versions. The new additions to skinning are great and make for some new and faster work flows for skinning characters."


So with limits controller , weight 0 instead of position contrain and new max 8 speed hopefully you will have your rig working without having to have the head separated of the body.



Michael , Natalia Nad Ab told me about new office sound cool miss to work with Nexus crew.

And 10:30 for start working ( well drinking cofee , read mails and..) is not late :) , it can be worst.

craiggulow
10-03-2005, 10:14 PM
Other than this is to go for length_interp script fn to control points along a spline (nice idea Paul).

Eek (or Paul) can you elaborate (show an actual srcript) on this for the maxscript impaired?

TIA

eek
10-04-2005, 07:15 PM
Hi everyone,

So Paul showed me a while back the lengthinterp fn, I think weve both been playing with it so i'll elaborate. Basically its a script fn, for interpolating the length of a spline, based on a percentage 0 - 1 and also has options for steps etc. Its slightly faster for some things and slower for others.


Its not a script but a fn for a script controller (but you could use it in a script)

Strongly recommend you dont use it with a nurbs curve - slows to nothing. And also its procedurally interpolating the length. Heres an example:

if you put the script on the pos of a point:

dependson $line01

lengthinterp $line01 1 0.5

1 - index number
0.5 - value along the spline

you can also add step value into that.


lengthinterp $line01 1 5 0.5 - (i think, im not by max but should be right)


Remeber this is an interpolation so if you move the vertexs on the spline, the value will change and the position along the spline will move.


eek

craiggulow
10-04-2005, 10:05 PM
Thanks Eek! I should be able to fumble through with that. One more bit... when is it faster/slower than using a path constraint? I assume it's faster if you want something to maintain it's position on a spline, but slower if you want to animate it's position?

eek
10-05-2005, 10:16 PM
Its pretty fast, umm to access it value to be animated you could pull in a slider value etc


dependson $line01 $point01

lengthinterp $line01 1 $point01.slider

it generally seems faster, ive added lots of splines together and seems pretty quick aslo its pretty easy to edit in a script:

pcon = $test.pos.controller = position_script()

pcon.script = "dependson $line01; etc etc

eek

PEN
10-06-2005, 06:14 PM
Its pretty fast, umm to access it value to be animated you could pull in a slider value etc


dependson $line01 $point01

lengthinterp $line01 1 $point01.slider

it generally seems faster, ive added lots of splines together and seems pretty quick aslo its pretty easy to edit in a script:

pcon = $test.pos.controller = position_script()

pcon.script = "dependson $line01; etc etc

eek

Unfortunitly it looks as though the lengthInterp has some problems in speed. AME knows about and is working on it. It can end up spamming max with calls to the dependancies. I still use it but be carefull as it can kill rig speed if you use it in the wrong place.

eek
10-06-2005, 07:22 PM
im just using it to bind (as you say specific) attachments. As we discussed awhile back on msn.


eek

foane
10-07-2005, 11:54 PM
Hi Chinwagon,

a while ago I've been making a rig that looked a lot like yours (which looks quite nice), I stopped working on it because the bones flipped...example: when I moved the control point on the X over the root point's X value, the bone flipped!

also, why don't you just skin the dummies on the path constraints to your mesh (especially at the eyebrows)? seems unnecesary to work with stretchy bones there....or isn't it?

oh and by the way, you said something about rigging a tongue...I like to rig the tongue with some kind of 'joystick' (i.e. bobo's joystick), reaction manager and 2 bend modifiers on the tongue mesh. one bend mod. has its direction to 0 and to other has its direction to 90. then you can wire or make a reaction for the appropriate X and Y translation of the manipulator...
just a tought, maybe you guys know better ways?

is your rig by any chance capable of making some nice squash/stretching?

greets,
Foane

Chinwagon
09-13-2006, 04:12 AM
Ahem... just bumping this thread because it's starting to get close to its one year time limit.
There will be some updates ...I promise.
:¬)

PEN
09-13-2006, 02:42 PM
Looking forward to it Brad.

marktsang
09-13-2006, 09:38 PM
great stuff brad looking forward to seeing what youve added to it

mark

3DQUAKERS
09-22-2006, 10:15 PM
Nice work Brad...Looking forward to what you come up with next.

theflash
09-23-2006, 09:31 AM
That's awesome. I am just the beginner and doing my first rig. I have to do facial animation and I saw tuts on using morpher, but just the idea of doing many expressions is really laboureous and makes me feel less interested. I always wonder there would be some cool ways and I saw it in your work. Thanks for sharing, that's inspiring work :)

TzMtN
09-23-2006, 03:29 PM
I know you get it all the time and you must be tired of hearin how wonderful and
awesome is your work, but i had to join in and congradulate you, yes yes, i know
this post is from a year ago and you haven't updated it since, but i wanted to say
that this thread is really inspiring, and i lernd a couple of new thing from it,
so tanx Brad and tanx to Paul and Kees and eek and all the rest..
and I cant wait to see it finished as everyone else!! :bounce:

Matan

Aritz
12-26-2006, 06:19 PM
Really a great inspiring work Brad. :bounce:
Any update?

Chinwagon
12-27-2006, 01:26 AM
Sorry Aritz, not really at this point.
I've been concentrating my efforts more on updating my Skeleton Rig (http://www.bradnoble.net/rigging/index.html) to version 2.0 and preparing to become a father for the first time!
The character the facial rig is on has an old version of the skeleton rig on it so I'll have to update that (I don't actually animate it, I just keep updating its rig!). So when I do that I'll have another look at the facial rig: add a tongue setup and have another look at the eyebrow deformation methinks...
Merry Christmas everyone!
Brad
:¬)

Aritz
12-28-2006, 08:39 PM
Now trying Skeleton Rig, nice updates.
Father!? Congratulations!!

paconavarro
04-14-2007, 07:28 AM
all I can say is WOW... I love your body Rig and I love this one even more

GREAT tnks for the eyecandy...

whitehorse
03-28-2008, 12:25 AM
I thought i would bump this for you. I love your skeleton rig and would love to see more of this too.

hope being a father is going great for you china

musashidan
03-29-2008, 03:47 PM
wow,i've never seen that rig before this was bumped.I've been using Skeleton rig for a few years and would love to see the facial rig implemented in the Skeleton setup.


More great work Brad.Cheers.:thumbsup:

Diependaal
05-24-2008, 11:29 AM
how did you make the eyelids move ,also with the eye lookat helper?
trying this to myself, but wiring brakes all the time, adding new xyz to the list doesnt work for me either, and dont want to go use reaction list controllers.

sbv3
03-15-2009, 07:31 PM
Hi!
An amazing rig! I wondered if you share it - you show some links on your original post, but both of them lead to a 404 page. Can you/do you want to repost them?
Cheers,
Stefan.

sbv3
03-15-2009, 07:36 PM
Hi!
An amazing rig!
I noticed that on your initial post, you had 2 links to .zip files. I wondered, if you were sharing your rig. If yes, can you please post the links again, the initial ones lead to a 404 page...
Thank you!

Cheers,
Stefan.

Chinwagon
03-16-2009, 09:24 AM
Thanks for the compliments.
I've updated the videos and have put them on my website here (http://www.bradnoble.net/rigging/facial_bone_rig.html).

To finally answer Diependaal's question from a long time ago, the eyelids are based on a lookat constraint. A point looks at another point to the side of it which doesn't move, while the eyelid lookat point has the eyes' lookat target assigned as the the up vector. The up vector calculation is set by the object position, not rotation. The net result is that when the eye targets move, the eyelid points only twist because only the up vector is affecting the eyelid lookat point.

Does that make any sense? These things are always hard to explain.
:¬)

Diependaal
03-16-2009, 09:38 AM
Long time ago indeed, but never to late..
Actually pretty simple in the end, just breaking the setup up in different pieces. I got stuck there wanted to do it all on ,one lookat.

Now did it with morph shapes, get it next time.

acamporota
03-18-2009, 01:52 PM
hey brad awesome work
really good
i see in one of your video that when eye look up or down the lids follow..
how you do that??
thank's a lot

MiracTercan
04-06-2009, 11:25 PM
Not Found :(

Pacermike
08-30-2009, 12:33 AM
http://www.bradnoble.net/images/facial%20rig%20hidden%20stuff.jpg

Hey guys! Can Brad or anyone else give an explanation as to how the red splines/paths shown in this picture work? I think I get how the ones around the eyes and eybrows work (they're like a track that the helpers slide along, right?) but how do the ones around the mouth work?

Also, the spline between the lips, does it have something to do with the "sticky lips" feature? If so, how does that work?

I think I get the purpose of all the blue look at constraint lines except for the ones that point to the center of the upper and lower lip. What do those ones do?

Lastly, all the larger point helpers (box type with crosses in the middle) on the cheeks, upper lip and either side of the chin, any idea what they're for?

Thanks!

p.s. This rig is awesome. I wish an educational version of this rig was available to buy. I feel like I could learn everything I'd need to know about rigging just from dissecting this file!

CGTalk Moderation
08-30-2009, 12:33 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.