PDA

View Full Version : Joint Based Facial Rigging


Boucha
02-04-2009, 12:44 PM
This is a little demo that I did for joint based facial setup in Maya.

Click Here for link to the video... (http://www.vimeo.com/3077609)

ViCoX
02-04-2009, 12:51 PM
Looks very neaty, might try that in xsi. : ) Thanks for the share!

DanHaffner
02-04-2009, 12:53 PM
Wow, that looked really good, what made you got with joints instead of blendshapes?

Polimeno
02-04-2009, 01:37 PM
hey, nice work !!

how do you save/store some poses ?

Boucha
02-04-2009, 02:52 PM
Thanks !

I really wanted to test out facial rigging with joints so I went for it. Poses can be stored using a custom MEL script...

rikkiknight
02-04-2009, 05:04 PM
very inspiring! Thanks for sharing

vvkonline
02-04-2009, 05:45 PM
looks really good,
I was wondering if you can also rotate or scale some of it? for instance for leap rolls or scale to get good narrow shape.

and do joint always aim in to each other when you move them?

thanks for sharing

Polimeno
02-04-2009, 07:53 PM
Poses can be stored using a custom MEL script...

interesting...
could you tell me more about how you aproach this custom MEL ?

DanHaffner
02-05-2009, 01:29 AM
Yes, since it's joint based you could easily rotate and scale. I forgot to mention that on the demo...

Also, about the custom script to store pose...it's just a simple mel commands such as getting the world position of controllers and storing them in a variable. And, setting those stored poses with mel commands such as setAttr, xform and so on. These stored poses could be exported out as a text file and imported again...

I have no idea how they do stored poses with blendshapes, but damn does what you just said make a lot of sense is very easily done.

Boucha
02-05-2009, 01:30 AM
Yes, since it's joint based you could easily rotate and scale. I forgot to mention that on the demo...

Also, about the custom script to store pose...it's just a simple mel commands such as getting the world position of controllers and storing them in a variable. And, setting those stored poses with mel commands such as setAttr, xform and so on. These stored poses could be exported out as a text file and imported again...

DanHaffner
02-05-2009, 01:30 AM
I have no idea how I quoted you and posted above you before your post was even made? LoL!

Boucha
02-05-2009, 01:33 AM
Also, yes joints always aim at each other. It's just an aim constraint and it is important for proper deformation...

Boucha
02-05-2009, 01:41 AM
I have no idea how I quoted you and posted above you before your post was even made? LoL!

Yeah...How did this happen...interesting !

DanHaffner
02-05-2009, 03:41 AM
Time paradox? LoL.

Polimeno
02-06-2009, 05:50 PM
Also, yes joints always aim at each other. It's just an aim constraint and it is important for proper deformation...

how did you set the upVectors ?? one locator to each chain (eg. 1 for 6 joints) or one locator behind to each joint (eg. 6 for 6 bones) ?
how did you avoid flipping problems ?

quick thought:
maybe if you split the hierarquy of the mouth controls in two layers, you could have a FK driven by this top, and get fine tune to tweak even more the shapes.


ps:
i totally desagree with your comment "joint based is better then blend shapes system"....
i think it all depends, the purpose of the project, how the people on the team like to work, etc...etc.....take a look here (http://www.beach-studios.com/cgi/Braccus.html) (good example of a good rigging with blendshapes)

DanHaffner
02-06-2009, 09:55 PM
Thanks for the link, that really is "one angry monkey"...hehe.

Boucha
02-07-2009, 06:11 AM
how did you set the upVectors ?? one locator to each chain (eg. 1 for 6 joints) or one locator behind to each joint (eg. 6 for 6 bones) ?
how did you avoid flipping problems ?

I used an up vector "locator" which is parented to the parent joint of each joint with world up type as "Object rotation up"....

Also,

i totally desagree with your comment "joint based is better then blend shapes system"....
i think it all depends, the purpose of the project, how the people on the team like to work, etc...etc.....take a look here (http://www.beach-studios.com/cgi/Braccus.html) (good example of a good rigging with blendshapes)

Yes, you are absolutely correct...Blend shapes are predictable and very good in production...What I meant to say is that you can easily use blendshapes in conjunction with this system...This can be done by layering the deformation from both the system...

Polimeno
02-07-2009, 04:36 PM
I used an up vector "locator" which is parented to the parent joint of each joint with world up type as "Object rotation up"....


got that.........but are they also aligned to the child joint ??

...can easily use blendshapes in conjunction with this system...This can be done by layering the deformation from both the system...

cool.

ragdoll
02-07-2009, 04:42 PM
very nice setup! i bet it was a nightmare to paint skin weights? :D
good job! :thumbsup:

DanHaffner
02-07-2009, 05:48 PM
Can someone explain to me what exactly an up vector does? I know how to set it to another object, and to change the axis the up vector uses, but I'm not exactly sure what that is really doing?

Polimeno
02-07-2009, 07:20 PM
Can someone explain to me what exactly an up vector does? I know how to set it to another object, and to change the axis the up vector uses, but I'm not exactly sure what that is really doing?

up vector

In animation, a vector that works with the aim constraint to control the orientation of a constrained object. By default, the up vector tries to stay as closely aligned as possible to the world up vector.

Prevent rolling effects for aim constraints

In certain situations, a constrained object can rapidly roll about its aim vector. Rolling effects can happen when the aim vector approaches or points in the same direction or in the opposite direction as the up vector.

You can avoid rolling effects by keeping the target point clear of the world up vectors direction. For example, if the world up vector points in the direction of the scenes world space Y-axis (the default), you would try to avoid having the positive or negative Y-axis intersect the target point. You could move the target object(s) as needed, or perhaps change the target object weights so that the target point does not get to close to the Y-axis.

However, if your animation makes such avoidances impossible, you can prevent rolling by changing or animating the world up vector.

d-brooks
02-08-2009, 12:47 PM
Very nice :D Thanks for sharing Boucha!

Boucha
02-09-2009, 12:50 AM
got that.........but are they also aligned to the child joint ??

Yes, they are aligned to the child joint....

............

Thank you every one for liking my demo... : )

Polimeno
02-15-2009, 09:10 PM
Yes, they are aligned to the child joint....



ok!

could you tell me more about how did you aproach the expression for the controls of eyes (blink/anger/sad) ??
by expression editor or node connection ?

eg:

if ctrl_blink_Up.pos.x > 0 then joint_blink_Up_01.rotation.x *.25 else joint_blink_Up_01.rotation.x *-.5


im a MAX user trying to understand the principles in maya....

thanks

Boucha
02-16-2009, 12:04 AM
could you tell me more about how did you aproach the expression for the controls of eyes (blink/anger/sad) ??
by expression editor or node connection ?

The expression that I did for the eyes are conditional..i.e. if...else statements...

for eg...

//UP EYE LID EXPRESSION---
//DECLARE SOME VARIABLES---
float $lUpEyeLidSideA;
float $lUpEyeLidSideB;
float $lUpEyeLid;

//CONDITIONS---
//FOR $lSideA
if (charPfx01_l_upEyeLid01_cc.translateX >= 0)
{
$lUpEyeLidSideA= 1 - (charPfx01_l_upEyeLid01_cc.translateX*150);
}
else
{
$lUpEyeLidSideA= 1;
}

//FOR $lSideB
if (charPfx01_l_upEyeLid01_cc.translateX <= 0)
{
$lUpEyeLidSideB= 1 - (charPfx01_l_upEyeLid01_cc.translateX*-150);
}
else
{
$lUpEyeLidSideB= 1;
}

//FOR $lUpEyeLid
if (charPfx01_l_upEyeLid01_cc.translateX >= 0)
{
$lUpEyeLid= 1 - (charPfx01_l_upEyeLid01_cc.translateX*80);
}
else
{
$lUpEyeLid= 1 - (charPfx01_l_upEyeLid01_cc.translateX*-80);
}

//EXECUTION---
//UP N DOWN---
charPfx01_l_upEyeLid01_jj.rotateZ = (charPfx01_l_upEyeLid01_cc.translateY*-300) + (charPfx01_l_eye01_cc.translateY*-150) + $lUpEyeLid;
charPfx01_l_upEyeLidSideA01_jj.rotateZ = (charPfx01_l_upEyeLid01_cc.translateY*-150) + (charPfx01_l_eye01_cc.translateY*-75) + $lUpEyeLidSideA;
charPfx01_l_upEyeLidSideB01_jj.rotateZ = (charPfx01_l_upEyeLid01_cc.translateY*-200) + (charPfx01_l_eye01_cc.translateY*-100) + $lUpEyeLidSideB;

//SIDEWAYS---
charPfx01_l_upEyeLid01_jj.rotateY = (charPfx01_l_eye01_cc.translateX*-75);
charPfx01_l_upEyeLidSideA01_jj.rotateY = (charPfx01_l_eye01_cc.translateX*-33);
charPfx01_l_upEyeLidSideB01_jj.rotateY = (charPfx01_l_eye01_cc.translateX*-50);

Similary, you can create an expression for the lower eyelid also...

Polimeno
02-16-2009, 06:52 PM
cool.

ps:
does your rig has some extras strech/squash controls for the entire face ?

Boucha
02-17-2009, 12:52 AM
ps:
does your rig has some extras strech/squash controls for the entire face ?

No, Currently not..

Can be added using a stretch & squash blend shape layering...

Polimeno
02-23-2009, 05:47 AM
The expression that I did for the eyes are conditional..i.e. if...else statements...
Similary, you can create an expression for the lower eyelid also...

humm........what do you think about aproach exactly same thing using nodes ??

multiply divide + condition + joints + controls

ill try something and soon post here, because in my opinion you can get the same result more easily/better/faster then using expressions.


seeya

PS: i wish we could have an ICE technology inside maya..

Boucha
02-24-2009, 04:01 AM
Great, you can try with nodes...they are much faster to calculate. I will love to see that !

JGaines
02-24-2009, 12:24 PM
Great facial setup!! I think I will take you up on that challenge to create a node based system instead of expression based. I love using the hyper shade to do some "visual scripting". :) Right now, I am finishing up my demo reel and I am finishing the last portion, which is the facial setup and gui to go along with the rig.

Again, really cool! I've only used the Jason Osipa's techniques from his Stop Starring book, which are blendshape based. Looking forward to tackling a different setup using joints now.

Polimeno
02-25-2009, 07:38 PM
I love using the hyper shade to do some "visual scripting"

dude, definitely its a good way to do things, im loving to explore it....(came from MAX)


Great, you can try with nodes...they are much faster to calculate. I will love to see that !


i use the CTRL translateY as master, where translateX (or translateZ) increase/decrease the value/amount, then verify inside the condition and mix them to the final rotationX joints.


see attached

Boucha
02-27-2009, 07:48 AM
Great...Keep it coming !:bounce:

CGTalk Moderation
02-27-2009, 07:48 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.