I advocate both methods and I want to utilize both of these methods to get the desired results. Here are few notes from my current Face Setup research I am doing.
Blendshape:
-> One main problem I have with blendshape besides them being liner is that if not modeled correctly it is difficult to show skin sliding and fleshy feeling of the surrounding skin area of the muscle that moves. For example, while modeling cheek bulge for the smile seprately we can just pull the vertices around cheek bone to create the bulge. But, it will look like a baloon effect. Instead, cheek bulge is the result of skin being pushed towards the zygomatic arch bone. And we have to have that skin pushing and bulging to feel the expression correctly.
So what to do?
I think that one primary requirement is the proper work flow for creating indiviudal muscle shapes. And we need a system that defines how these individual shapes interact in order to produce more beliavable skin expressions. Weta used such system for Golumn which had hundreds of blend shapes (many of them were corrective shapes).
Joints:
-> It's main weakness is the lack of intuitiveness in building proper face shapes. And many times it is even almost impossible to get the shape we need just with joints in reasonable amount of time.
So?
Face topology becomes more crucial to get proper face shapes when working with joint based setup. We also need a really good system that allows the joints to be manipulated in a way that simulates muscle interactions and creates desired face shapes.
For highly cartoony characters that brake the rules of muscle interaction is a different situation.
I have been doing a lot of research for Facial Rigging and I am studying different kinds of systems to define muscle intaraction. Mainly I am looking for freedom and flexibility (to extend or retarget) in such system. I think my face setup theory I came up with few months ago still has potential. Right now, I am trying to modify it and add more to it to make it a more generic face system.
Wednesday, October 14, 2009
Saturday, July 18, 2009
Rig : Feature Notes
While animating I realized that following behaviors are more desirable.
-> Clavicle should not affect arms, in FK or IK. (But, still have an option for arm to follow clavicle)
-> Knee should be able to move independently from the foot.
-> Neck should have an option for following spine or align with world space. By default it should follow the spine, as overlapping action is easier (for my workflow).
-> Almost all major parts should have an option to turn orientation inheritance on and off.
-> Clavicle should not affect arms, in FK or IK. (But, still have an option for arm to follow clavicle)
-> Knee should be able to move independently from the foot.
-> Neck should have an option for following spine or align with world space. By default it should follow the spine, as overlapping action is easier (for my workflow).
-> Almost all major parts should have an option to turn orientation inheritance on and off.
Rig : Testing & Bugs
I have been animating this quarter and I have realized that true problems with any rig behavior can be identified only after animating it for at least one animation. If you use the rig for say 1 or 2 weeks you become comfortable with new features and you also find bugs or problematic behaviors.
It is mostly like software engineering. Rigs should always go through QA (quality assurance) testing. Because sometimes some bugs can only be found after some time (depends on a lot of factors). Sometimes while animating not all features are used or the right combination of triggers are not activated to produce the bug.
It is sometimes not the individual logic that is flawed, but the combination of logics that create the problem. Hence any logical implementation, a rig or a script, should be tested for all possible combinations.
It is mostly like software engineering. Rigs should always go through QA (quality assurance) testing. Because sometimes some bugs can only be found after some time (depends on a lot of factors). Sometimes while animating not all features are used or the right combination of triggers are not activated to produce the bug.
It is sometimes not the individual logic that is flawed, but the combination of logics that create the problem. Hence any logical implementation, a rig or a script, should be tested for all possible combinations.
Thursday, June 25, 2009
Finally, my own website!
I feel very excited to have my own website. I am still in the process of updating the pages with more detail and better layout. But mainly I have my demo reel up!
I want to say thank you to my lovely wife :)
http://maulik13.com
I want to say thank you to my lovely wife :)
http://maulik13.com
Wednesday, June 3, 2009
Facial Rigging Notes
I have been studying the face anatomy and looking at different reference videos to see how the different areas in the face deform. My main interest is in looking for a particular relationship between different muscles. There are two main types of research for facial rig.
1. Follow anatomically correct deformation. This also includes exaggerated emotions that are based on realistic deformations. This generally falls into visual effects work.
2. The other is to study the given drawings and concepts of stylized character designs and see what deformations are needed. Most of such deformations are not close to how realistic deformations would look like. What is more important in this case is to study how deformations create the shadow lines to give the results we need. Generally this is more cartoony type of deformation hence more free form deformations. But it is still important in looking for how different parts interact.
I think it is really important to have fluidity in the facial deformation. This gives life to the face. I believe interaction of different face parts generates this fluidity in the face. So in either case what is important is to not just create individual deformations, but have a system that creates interaction between different parts. More later.
1. Follow anatomically correct deformation. This also includes exaggerated emotions that are based on realistic deformations. This generally falls into visual effects work.
2. The other is to study the given drawings and concepts of stylized character designs and see what deformations are needed. Most of such deformations are not close to how realistic deformations would look like. What is more important in this case is to study how deformations create the shadow lines to give the results we need. Generally this is more cartoony type of deformation hence more free form deformations. But it is still important in looking for how different parts interact.
I think it is really important to have fluidity in the facial deformation. This gives life to the face. I believe interaction of different face parts generates this fluidity in the face. So in either case what is important is to not just create individual deformations, but have a system that creates interaction between different parts. More later.
Monday, May 25, 2009
Making a local orient constraint
In my research project, at one stage I needed an orient constraint that works locally, i.e. it works only on the hierarchy below a particular transform. I believe we could do that by re-connecting orient constraint's targetMatrix. However, since I don't know how orient constraint works under the hood and it does not allow me to have dynamic offset, I had to come up with my own constraint using matrix calculations.
So I have been digging into how transforms work and how to visualize the matrix concatenation. I was successful at making such constraint. However, I am still working on adding an offset that can dynamically be changed without affecting the rotation of the controlled object. I have yet to use this on my research project (fingers crossed). But, knowing I had success with a sample hierarchy gives me hope.
Follow this thread for detailed discussion on this orient constraint. LINK
edit: (26.06.09)
Later in my research I realized that what I had found out was not the best solution for what I was doing.
So I have been digging into how transforms work and how to visualize the matrix concatenation. I was successful at making such constraint. However, I am still working on adding an offset that can dynamically be changed without affecting the rotation of the controlled object. I have yet to use this on my research project (fingers crossed). But, knowing I had success with a sample hierarchy gives me hope.
Follow this thread for detailed discussion on this orient constraint. LINK
edit: (26.06.09)
Later in my research I realized that what I had found out was not the best solution for what I was doing.
Continue on Twist
The best way to understand twist is to think of the joint as a vector and twist is a spin around that vector. This leads to the topic of how quaternion transform works. More on that later.
When it comes to vector related implementation two tools mentioned below are a great help.
-> Single IK chain with pole vector can act as a vector. And spin is defined by pole vector or twist attribute.
-> Aim constraint comes very handy when vectors are involved. You can use aim vector and up vector to control the rotation of an object.
Keep in mind though that they do flip at one point or the other. The pose does not change generally, but if you are doing calculations based on their rotation then you are highly prone to flipping issues.
When it comes to vector related implementation two tools mentioned below are a great help.
-> Single IK chain with pole vector can act as a vector. And spin is defined by pole vector or twist attribute.
-> Aim constraint comes very handy when vectors are involved. You can use aim vector and up vector to control the rotation of an object.
Keep in mind though that they do flip at one point or the other. The pose does not change generally, but if you are doing calculations based on their rotation then you are highly prone to flipping issues.
Friday, May 8, 2009
Twist Setup Notes
When doing a twist setup to distribute the rotation uniformly there are some important things to consider. Following are some notes from my experience while working on forearm and shoulder twist setups.
-> Twist cannot be associated with any single axis. Due to the nature of Euler angle, based on your rotation order axis that twist the joint could change.
For example,
A shoulder joint with zxy rotation order in rest position will twist around x-axis. But if you bring shoulders in front by rotating on y axis, now the z-axis is responsible for twist.
Hence, we cannot plug one axis from shoulder joint to the twist joints. Of course we can plug all three axis and it may work, but that's really not the elegant solution. Inspired by this tutorial, I think Aim constraint is the most elegant solution so far.

->Another issue is the source of twist and in which direction its propagating. For example, for forearm twist, rotation originates from the wrist joint and propagates towards the elbow joint. So the direction is from a child joint to its parent joint. However, in shoulder twist the direction is opposite, twist propagates from parent to the child joint. This changes the equation of how to make twist joints inherit motion from shoulder joint and dampen the rotation at the same time.
-> Twist cannot be associated with any single axis. Due to the nature of Euler angle, based on your rotation order axis that twist the joint could change.
For example,
A shoulder joint with zxy rotation order in rest position will twist around x-axis. But if you bring shoulders in front by rotating on y axis, now the z-axis is responsible for twist.
Hence, we cannot plug one axis from shoulder joint to the twist joints. Of course we can plug all three axis and it may work, but that's really not the elegant solution. Inspired by this tutorial, I think Aim constraint is the most elegant solution so far.

->Another issue is the source of twist and in which direction its propagating. For example, for forearm twist, rotation originates from the wrist joint and propagates towards the elbow joint. So the direction is from a child joint to its parent joint. However, in shoulder twist the direction is opposite, twist propagates from parent to the child joint. This changes the equation of how to make twist joints inherit motion from shoulder joint and dampen the rotation at the same time.
Wednesday, May 6, 2009
Scale Constraint on Joints
It does not work properly. As I had posted earlier, joints use a special scale connection with inverseScale attribute (only joints have this tranform property) when you create a chain hierarchy. This gives a special behavior when scaling a parent joint. And using scale constraint messes up this inverseScale calculation in joint transform and so the child joints scale weirdly when scaling the parent joint.
So use connection and a blend node on a joint chain to blend between scale values.
edit:
From reading on forums I get that the problem is with constraints not taking "segment scale compensation" into consideration. So orient constraint suffers from the same problem. I had encountered this problem when working on a stretchy setup on arms.
So use connection and a blend node on a joint chain to blend between scale values.
edit:
From reading on forums I get that the problem is with constraints not taking "segment scale compensation" into consideration. So orient constraint suffers from the same problem. I had encountered this problem when working on a stretchy setup on arms.
Tuesday, April 28, 2009
BlendShapes 1
If somehow (or by doing something stupid like I did) if you have blendshapes created which don't have the same vertex order as your base geometry or if geometry changes in the base model, don't panic! You can use already created blendshapes to make new ones. Use a wrap deformer to do this as explained below.
-> Take all old blendshape geometry and add them to old base geometry using "Blend Shape" deformer.
-> Align new geometry poition to match with the old base geometry (which has blendshapes).
-> Apply a wrap deformer so the old base geometry drives the new base geometry.
-> Now dial in each blendshape individually (you just need to do it for one side, left or right). This will deform the new geometry as the old base geometry deforms.
-> Duplicate your new deformed geometry. You have got a blendshape for new geometry!
You can adjust the options in wrap deformer to get the best results. And when you dial blendshapes make sure you don't get any undesired deformations. You can actually paint blendshape weight to remvoe it later if you have any extra vertices being affected.
-> Take all old blendshape geometry and add them to old base geometry using "Blend Shape" deformer.
-> Align new geometry poition to match with the old base geometry (which has blendshapes).
-> Apply a wrap deformer so the old base geometry drives the new base geometry.
-> Now dial in each blendshape individually (you just need to do it for one side, left or right). This will deform the new geometry as the old base geometry deforms.
-> Duplicate your new deformed geometry. You have got a blendshape for new geometry!
You can adjust the options in wrap deformer to get the best results. And when you dial blendshapes make sure you don't get any undesired deformations. You can actually paint blendshape weight to remvoe it later if you have any extra vertices being affected.
Subscribe to:
Posts (Atom)