Facial Rig. Joint Based + Pose Space Deformation

Become a member of the CGSociety

Connect, Share, and Learn with our Large Growing CG Art Community. It's Free!

THREAD CLOSED
 
Thread Tools Search this Thread Display Modes
Old 06 June 2011   #1
Facial Rig. Joint Based + Pose Space Deformation

Hi everyone,

Thought I'd share my latest work.

http://www.vimeo.com/23310624

Its a facial rig that uses a network of joints that follow the basic contours of the face.
There are a number of pose space deformations that trigger when certain poses are hit.
There is also a breakdown that I created on my vimeo page, if you'd like to see some behind the scenes type stuff.

Questions, comments and critique welcome.
 
Old 06 June 2011   #2
Good technique and good details in your rig. I have always thought that joint based rig + pose based correction is a good way to go to get more control. But it would be even nicer to have a pose read at vertex level or at a topology level like what daniel pook-colb's BCS system does in a way. So you don't create poses against higher level movements, but against low level movements.

Good behind the scene video as well. One question, I cold not get bSpiritCorrective script to work after trying many times. Did you get it working on the first go?
__________________
[ myRiggingBLOG ]
[ myAnimBLOG ]
[ myWebsite ]
"Life is animation and we are our own animators." -i
 
Old 06 June 2011   #3
Originally Posted by andyLP: Hi everyone,

Thought I'd share my latest work.

http://www.vimeo.com/23310624

Its a facial rig that uses a network of joints that follow the basic contours of the face.
There are a number of pose space deformations that trigger when certain poses are hit.
There is also a breakdown that I created on my vimeo page, if you'd like to see some behind the scenes type stuff.

Questions, comments and critique welcome.



With the combination sculpting - do you store the 'order' of the combinations to allow for rebuilding?

For example, i build shape 'a', shape 'b' and a combination/fix shape 'c' of both. Now if i go and re-tweak 'a' - does 'c' get mashed as its an additive or do you store the absolute value of it so you can rebuild it from the new base shapes?

I built a framework for this several years back, you make your bases that get flagged as being order 0, you make a combination of 2 base which gets an order of 1 - a combination of a combination and a base gets level 2 etc.. Essentially its the level of combination - and basically teaches you to build the bases first.

The rule being a combination of two or more poses of the same or mixed level gets a level 1 higher than the highest level of the mix.

The second rule is with every combination, you store the 'absolute' value of that shape whether its a combination or not. This allows you to re-build that shape following the 'order' of levels - 1.. n

Ontop of this is pushing the poses into a weight space to allow for any combination at any value. With that its, just a simple product of weights. e.g.

a shape with weight 1.0
b shape with weight 1.0
c shape with weight (a * b)
d shape with weight of (c * a * b)

The values will always go to 1.0 and crucially be non-linear i.e 0.1 * 0.1 as apose to 0.5 * 0.5. e.g. 0.1111 > 0.25 > 1.0. Additional combination can be at a 'position' of two weights.

c shape at combination of a @ 0.5 and b @ 0.5. The rule being your still going from 0 > 1 ) 0 but in the space of 0 > 0.5 > 1.0.

cheers,
__________________
Disclaimer: My opinions are not those of my employer.



Last edited by eek : 06 June 2011 at 02:45 PM.
 
Old 06 June 2011   #4
Nice rig!

Originally Posted by theflash: Good technique and good details in your rig. I have always thought that joint based rig + pose based correction is a good way to go to get more control. But it would be even nicer to have a pose read at vertex level or at a topology level like what daniel pook-colb's BCS system does in a way. So you don't create poses against higher level movements, but against low level movements.

So e.g. edge compression drive the poses?

Originally Posted by eek: For example, i build shape 'a', shape 'b' and a combination/fix shape 'c' of both. Now if i go and re-tweak 'a' - does 'c' get mashed as its an additive or do you store the absolute value of it so you can rebuild it from the new base shapes?

I built a framework for this several years back, you make your bases that get flagged as being order 0, you make a combination of 2 base which gets an order of 1 - a combination of a combination and a base gets level 2 etc.. Essentially its the level of combination - and basically teaches you to build the bases first.

The rule being a combination of two or more poses of the same or mixed level gets a level 1 higher than the highest level of the mix.

The second rule is with every combination, you store the 'absolute' value of that shape whether its a combination or not. This allows you to re-build that shape following the 'order' of levels - 1.. n

Ontop of this is pushing the poses into a weight space to allow for any combination at any value. With that its, just a simple product of weights. e.g.

a shape with weight 1.0
b shape with weight 1.0
c shape with weight (a * b)
d shape with weight of (c * a * b)

The values will always go to 1.0 and crucially be non-linear i.e 0.1 * 0.1 as apose to 0.5 * 0.5. e.g. 0.1111 > 0.25 > 1.0. Additional combination can be at a 'position' of two weights.

c shape at combination of a @ 0.5 and b @ 0.5. The rule being your still going from 0 > 1 ) 0 but in the space of 0 > 0.5 > 1.0.


Bassically answer goes from what PSD he have drives: vertex position or blendshape weights.
Both of them are useful anyway.
__________________
Rigging Templates old video
 
Old 06 June 2011   #5
@eek
I am guessing he is using blendshapes in which case it will be additive and hence correction in lower order will affect all higher orders

@xeash
Yes, edge distance or vertex positions or any kind of representation at lower level will allow much more freedom. However, it will be computationally expensive.
__________________
[ myRiggingBLOG ]
[ myAnimBLOG ]
[ myWebsite ]
"Life is animation and we are our own animators." -i
 
Old 06 June 2011   #6
@theFlash
Thanks for your comment - I got bSpiritCorrectiveShape going, though there's a couple of things that tripped me up. It isn't fussy about which tweakNode it uses to build the shapes.
So if there's more than one tweakNode in the history of your object then chances are it won't get the right one. I edit a quick hack to the script which seems to work in most instances, I can send to you if you like.
It won't work well if you have any blendshapes turned on at the time your run the script. In fact, the only deformation you want to have active is the skinCluster.
Its not particularly good if you have a smoothMesh node. And you should make sure to turn iterations to 0 on any polyAverageVertex nodes you might have. (I had a few!)

A pose read at component level would be handy. My 'system' (if you can call it that) really isn't all that fancy. The intermediate mesh is the result of the sculpt mesh minus the existing blendshape information. It is the intermediate mesh that is used to build the PSD.

@eek
Thanks for your feedback. In your example, shape c breaks if you tweak shape a (or b), yes. Though I can see how I might alter things to keep track of adjustments like that.

I have my definition of orders slightly wrong. In a purely blendshape driven system, order 0 would be the base shapes. In the PSD set up, I kind of thought of order 0 as the skinCluster deformation - which isn't correct at all, but helped me when thinking things through, as I always had to calculate the sculpted shape against the pose.

Building weight space shapes like you mentioned, makes sense. I never thought of making it a product of shape values like that. All my shapes are driven by positions of controllers (or combinations of controllers)

Have you got any links to your system in action?
And thanks again for your feedback - I'm sure I've been reading and learning from your posts on cgtalk for the last 4 years!

Last edited by andyLP : 06 June 2011 at 11:13 PM.
 
Old 06 June 2011   #7
Originally Posted by andyLP: @theFlash
Thanks for your comment - I got bSpiritCorrectiveShape going, though there's a couple of things that tripped me up. It isn't fussy about which tweakNode it uses to build the shapes.
So if there's more than one tweakNode in the history of your object then chances are it won't get the right one. I edit a quick hack to the script which seems to work in most instances, I can send to you if you like.
It won't work well if you have any blendshapes turned on at the time your run the script. In fact, the only deformation you want to have active is the skinCluster.
Its not particularly good if you have a smoothMesh node. And you should make sure to turn iterations to 0 on any polyAverageVertex nodes you might have. (I had a few!)

A pose read at component level would be handy. My 'system' (if you can call it that) really isn't all that fancy. The intermediate mesh is the result of the sculpt mesh minus the existing blendshape information. It is the intermediate mesh that is used to build the PSD.

@eek
Thanks for your feedback. In your example, shape c breaks if you tweak shape a (or b), yes. Though I can see how I might alter things to keep track of adjustments like that.

I have my definition of orders slightly wrong. In a purely blendshape driven system, order 0 would be the base shapes. In the PSD set up, I kind of thought of order 0 as the skinCluster deformation - which isn't correct at all, but helped me when thinking things through, as I always had to calculate the sculpted shape against the pose.

Building weight space shapes like you mentioned, makes sense. I never thought of making it a product of shape values like that. All my shapes are driven by positions of controllers (or combinations of controllers)

Have you got any links to your system in action?
And thanks again for your feedback - I'm sure I've been reading and learning from your posts on cgtalk for the last 4 years!


Daniel's work pretty much uses the exact system i described - but he's created the actually blendshape plugin i think too.

http://dpk.stargrav.com/pafiledb/pa...tion=file&id=31

And the math:
http://www.stargrav.com/bcs/docs/data/ap1-dps.html#dps

in max its pretty simple as you just store the data on the channel - im guess you could use an enum in maya. One day i will write mine in python
__________________
Disclaimer: My opinions are not those of my employer.


 
Old 07 July 2011   #8
@Andy
It would be helpful if you can share the modified script. I think I only had one tweak node but I will have a look at my set up again.

I created a plugin last year called input mixer, which takes multiple 1d inputs and outputs between 0 and 1. Plugin calculates when all inputs reach a given goal then it will output 1. I wanted to make a demo of it but haven't managed to get time to do so.
__________________
[ myRiggingBLOG ]
[ myAnimBLOG ]
[ myWebsite ]
"Life is animation and we are our own animators." -i
 
Old 07 July 2011   #9
Well i what i do usually is like this:
-i wrote RBF numeric interpolator node which interpolate on blendshape weights or activations weights(which drive deformers position). It works as any RBF on numerics should do: it can be have any number of dimension(any number of attributes can drive the weights), so you just fill all datapoints correct, compute weights, and thats do the job. It hits all datapoints exactly and also good with extrapolation if needed.
-So you have setup : hi-level controls with -1 1 clamp which drives PSD(RBF nodes) and thats drive weights => which drive blendshapes/deformers directly or with some sort of remapping(which is better).
Yep pretty much like in disney doc.
__________________
Rigging Templates old video
 
Old 07 July 2011   #10
My input mixer node does something similar, using Radial Basis function based on Gaussian function. I take all the inputs as start and end pair and process all inputs into unit space. And the unit output is mapped using different function similar to RBF to get different kinds of interpolations. I am planning to have some more functionalities to allow features like subsets within the same vector, but as of now it would still work by creating different nodes that define the subsets and a final super set combining the outputs of individual sets.
__________________
[ myRiggingBLOG ]
[ myAnimBLOG ]
[ myWebsite ]
"Life is animation and we are our own animators." -i
 
Old 07 July 2011   #11
Originally Posted by theflash: My input mixer node does something similar, using Radial Basis function based on Gaussian function. I take all the inputs as start and end pair and process all inputs into unit space. And the unit output is mapped using different function similar to RBF to get different kinds of interpolations. I am planning to have some more functionalities to allow features like subsets within the same vector, but as of now it would still work by creating different nodes that define the subsets and a final super set combining the outputs of individual sets.

Cool!
Originally Posted by theflash: And the unit output is mapped using different function similar to RBF to get different kinds of interpolations.

So you filling RBF matrix/computing weights via Gaussian and then alter output weight by different handy functions?
__________________
Rigging Templates old video
 
Old 07 July 2011   #12
It's actually simple, the vector output is from 0 to 1 and it's mapped into output number range using Gaussian and some other functions based on what kind of shape you need, spline, cubic, linear etc..
__________________
[ myRiggingBLOG ]
[ myAnimBLOG ]
[ myWebsite ]
"Life is animation and we are our own animators." -i
 
Old 07 July 2011   #13
@Xeash.
Thanks for sharing. Its good to get some ideas on where to head with my next rig. I'm always looking to bring out a better reel.

@theFlash, eek
I thought I would be able to get by, to some degree, without being an overly advanced programmer. Do you guys think, that at the top end studios, if you want to be setting up characters, you have to be a superstar programmer?
 
Old 07 July 2011   #14
Originally Posted by andyLP: @Xeash.
Thanks for sharing. Its good to get some ideas on where to head with my next rig. I'm always looking to bring out a better reel.

@theFlash, eek
I thought I would be able to get by, to some degree, without being an overly advanced programmer. Do you guys think, that at the top end studios, if you want to be setting up characters, you have to be a superstar programmer?


I don't think so - in the end its being able to turn ideas into reality thats key. I've never done much programming just scripting, and read lots of math. (and a specific area - matrices, quaternions and trigonometry) I was'nt very good at math in school, only last 5 or so years got really into it.

What i would say is to find a mentor/peer who can help you understand core ideas. It's what i did and it helps to give you a push to learn on your own. Most tools really are grounded in the same way - just there approach is different. Crucially if you can learn something with a goal of a practical example (that is hopefully cool too ) you'll learn really quickly.
__________________
Disclaimer: My opinions are not those of my employer.


 
Old 07 July 2011   #15
Dear, all,

Where can I download bSpiritCorrectiveShape for maya 2012?

I've searched at http://www.b-ling.com/ but there isn't one available?

Does someone else provides a compiled copy of this to test it out ?

Tri
 
Thread Closed share thread



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
CGSociety
Society of Digital Artists
www.cgsociety.org

Powered by vBulletin
Copyright 2000 - 2006,
Jelsoft Enterprises Ltd.
Minimize Ads
Forum Jump
Miscellaneous

All times are GMT. The time now is 06:54 PM.


Powered by vBulletin
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.