me wants it!
Hi Harvey, Dober
Harvey its very quick, i have three in a scene and it can be played/edited in real-time. Also this is an early version of it. So im cleaning it up a little, adding tangent control so should be even quicker!
I had 6 in a scene in an earlier version and its still as quick.
Btw i’ll have to get your MSN if you have one.
hehe - glad you liked it.
Paul gave me an idea of using a patch suface to be driven, so im gunna give it a try. This way you could embed them under the surface and drive it with skin wrap. Its an idea anyway.
You can do this anyway with the system…hmm but maybe you loose the middle curviture.
Updated with cleaner scripting, better stability and tangent control:
base length trigger set at 200
bulge length trigger set at 150
edge muscle length power: /2
middle muscle has a inv strength of 1 to give the feel of inner stretching (opening jaw)
All these value can be tweaked, and animated on the fly. There also manual control of the handle to make specific bulging (inflating, squeezing, etc )
I tried doing something similar with your rig (using linkedxform) but how do you make it move with the bones (because when I move the bones, I linked the facial helpers to the bone… I get a double rotation)?
I like your spline approach to skinning a face but I’m really wondering how you’ve managed to make the jaw open nicely. On my rig (which uses the same kind of rigging as yours) I’m a bit stuck atm on how to open the jaw so the upperlip doesn’t follow the lower lip (which should rotate with the jaw). I want to implement something that makes the mouth corners follow as well…
are you willing to share your methods for the jaw or do you have any suggestions?
a quick discription of your approach to creases would be cool as well…
p.s. : I fixed the jawproblem for the moment with a second helper that has its rotation point aligned to the one of the jaw + it is linked to the path-constrained helper + has an orientation constraint connected to the jaw’s orientation (with adjustable weighting for the other mouth-points)
any help would be appreciated.
Well yes your right, i had the same problem about two iterations ago, you would open the jaw and everything would move with it as if the mouth was stuck together. Basically now ive got a series of expressions which drive points, which themselves are being driven. Its an open system, as you can control each part as you want. For instance ive got a version, where by you can dial up/down the percentage of the mouth sticking together for stich lip -realistic stuff. Its nice that you can make it what you will whether its realistic or not.
As for creasing, well before it was just a basic point being drive by two other and a spline skinned to it. But now ive added tangent control so you can direct how you want the crease to work. The creases use the same system as the cheeks - my t-muscle setup. Im deciding whether to have a simple version for creases though.
Other finite creases im doing via normal maps, and driving them off the main muscles e.g crows feet, eyelid wrinkles.
Im still deciding whether to to add phsical creases (not maps) for the frown - the rule being more mesh creases, more mesh detail.
My jaw system is similiar to yours, its basically layered so built onto of the mouth muscle. So the sphincter muscles is one unit, then ontop ive got a system that pulls this basically down via the jaw.
The order is something like this:
cheeks ->mouth ->jaw. So the mouth controls the cheeks, the jaw controls the mouth. The key being the order of your muscles. So if you generalize your muscles model theres only few muscles you need:
Sphincter for things like the mouth, eyes. linear for like brow, lip pulls. And flexor for like the cheeks and main creases.
Ontop of this, is you action of muscles. This is pretty important as your not only driving the order/linkage but you have to set when you want you muscles to bulge.
For instance in older people, facial muscles weaken so there delayed reaction, secondly you have fat. The system ive got easily enables you to add springs to controllers to make them jiggle whilst compressing.
So its a combination of:
order/linkage of muscles
*This is even more important to control, eg say you character has a scar against his face, those muscles are gunna be much tighter than the others, so therefore work differently. The system has also tried to be as generic as possible and to that end, tweakable, For instance say you build two characters with the same rig, but for one they have a scar/closed eye, talk out the side of there mouth. Well you dont rebuild the rig, you just change the attributes of how it works, ie. what values the scripts read etc etc.
This generalize facial muscle map, also doesnt need to be splines, Im even with the system gunna add an ‘convert to bones’ button. Its just an aproach.
Foane ill pm you with my msn.
eek - more to come (bit hectic atm -moving to canada!)
thanks for the extensive explanation of your system analysis, I’m sure this is of some use to other members as well…
altough it’s nice how everything works there’s just one big problem in my case. I don’t know expressions. Maybe you could explain a bit more about what you just do with the expressions, I think I can make the same things happen without any expression controllers (probably a bit harder/longer). maybe we could talk once in a while on msn…or maybe it’s nicer for the thread to post everything here? we’ll see
The system is i think possible without expressions, but you may possibly kill your speed. My first versions were done entirely without the use of expressions, but i soon relised that building a system purely on constraints would be bad news, and also the vision in my head had to use expressions just for the things i want it to do.
I changed over to expressions mainly and importantly due to the mouth muscle system. The problem i faced was that driving previously a point between 2 others gave a uniform constraint, i.e 50/50 in all directions/axis. Even if the ratio was odd, its was still uniformily odd in all directions.
The problem was and is, is that muscles of the face act very specifically, i.e some are bound to bone, some hang, some even are bound in layers of skin. (an area i still need to look into) and to this end are constrained differently in different axis.
A muscle working in x, may work differently in y and z. It may be triggered in x and not y/z.
Im now using script controllers, to control chunks of it as im trying to make it easly accessible.
A little on Expressions:
Expressions in max work with scalars and vectors.
A vector expression works with the entire transform i.e rotation xyz, scale xyz, transform xyz.
A scalar expression works with single variables i.e transform x, rotation y, scale z, and things like sliders, spinners.
But both can mix,
So you can drive the x rotation with the vector of another by simple pulling the specific vector attribute. eg expression on $sphere01 x’s rotation may be:
a.x/2 + b.x/2 - ‘a’ and ‘b’ being a whole object transform, and .x being the specific axis.
(btw you can do this in paramwiring just by adding .x,y,z at the end of the controlling object if its bezier)
This makes them very powerful.
With the system ive got im doing very simple expressions like the one above. Just lots of them.
Heres a quick example:
So we’ll drive the entire position of a box (box01) via 2 points ‘a’ and ‘b’. Well put the expression on the bezier position of the box. So well need [,] in our expression. We’ll make two vectors ‘a’ and ‘b’ and assign them to each points bezier transform respectively.
[a.x/2 + b.x/2,
a.y/2 + b.y/2,
a.z/2 + b.z/2]
So here were driving the the box evenly between the two, but there som much more power, you’ll see:
a.x/2 + b.x/2,
So now were driving the box’s x and y position with the x position of the two points and the box’s z position with the y of the two points position.
ontop of this you can add clauses:
[if (a.x + b.x < 100, a.x - b.x/2, a.x/3 +b.x/3),
a.x/2 + b.x/2,
a.y/2 + b.y/2]
So the first line looks complex but it isnt it just using an ‘IF/THEN/ELSE’ clause to say
if a.x + b.x is greater than 100, then a.x - b.x/2, else do a.x/3 + b.x/3
Now that is simple, you can also nest expressions within each other like in scripts:
if (a.x>b.x,(if a.x > 50 , b.x-50, a.x/2),0)
This is an if clause nesting inside the then of another if clause.
you can also mix and match for intance say you have a slider called ‘mult’ as a scalar variable.
you could then have and expression like so:
mult could be a slider of 0 -100, so now you got a way of changing the expression outside of it.
You also got things like ‘^’ powers of. Max, min eg
Min (slider1, slider2) - will be the smallest of those two sliders.
also max (slider1, slider2) the same but the opposite.
An expression can work, between list-controllers, for instance you can get the vector of a bezier controller then the scalar euler of the controller on top.
So you can really mix and match.
you can limit things eg. the foot going through the floor:
if (a.z < 0 ,a,a.z)
So there really really powerful, and thes in combination with scripts, gives you amazing power. Remeber also expressions working within a script too.
dependson $point01 $point02
$point01.pos/2 + $point02.pos
 - being x  - y and so on…
Also youve got controller types:
$point01.pos.controller - eg might be a float list then a sub-xyz then x
I’d need a day to talk on expressions and such, its so so powerful, its like the backbone to rigging.
I’ve looked into some things about expressions and I have to admit they’re goooood. I was also amazed of how easy they where (as long as you keep em simple and short).
I would really like to hear how you deal with path constraints and how you’ve managed to control tangents…
advice for every rigger: look into expression controllers!!!
hope to hear you soon,
Also the key thing with expressions, is there pretty much generic to rigging. If you work it out in one package it should be very much identical in another.
Path constraints are exactly what they say, im using them to glue the skin on basically around the mouth,eyes and brown. Because there built on an underlying deformation model (muscle model) they just move around with it. The added benfit of this is complexity of rig.
If you character is low poly, you can put less and less muscle detail, in the rig fewer m-lines (path line) fewer t-muscles (cheek muscles) and fewer detail in the lips.
Tangent type access has been in max for a long time, as the discreet/autodesk people like to say "everything is animatable’ - and because of that accessable with controllers.
The big big reason, to change of is basicall speed, and memory. Previously i was using 3 points to drive the cheeks, 1 at base, middle and top. The system was very complex to setup to. I was using odd expressions to drive the middle point something like:
if (a-b)<100, then b-100+a, a)
Because i was trying to find the exact distance between the top two points.
It was complicated, as i was having to pull exact values from the expression debug. Now ive moved over to scripts, with expressions. The power with scripts combined with expressions is very powerful. Instead of pulling out z values in an odd manner.
I just use the distance fn. Now i spose i could write an fn to do it: something like normalize (a-b).
Now i creating the bend with 2 points. To pull out tangent handles its very easy - but first they need to be animated. Then they appear in the graph window as: object>master>InVec1, Outvec1 etc etc
The only important thing is to pick the right one. So i give it a float_list (so i can move it around later) then an expression controller. The expression is very simple, its a vector expression on its bezier controller:
The difference here being that its inverted for some reason, i think points in space are treated differently in the other objects. They dont contain rotational data there just floating points.
Atm im controlling the handle with a point so i can put additional animation on it without having to go into sub-edit mode. I could however drive the entire muscles without any points but id rekon it be pretty hard.
The other quite major issue i had, is something called tilt. Basically what im trying to achieve is a bend a piece of plastic between you fingers. Now with that it can tilt back and forward, left and right. The buldge still maintains its position correctly tilting up/down left/right.
But in cg simple things are hard!
So to get the right tilt, i swatted up on matrix’s, and thats what fixes the problem (thx Paul)
- be great to show you guys some of this stuff in person. Maybe a talk or meet up next/this year sometime maybe a festival.
A thing I’m looking into atm is the fact that when you assign a dummy or whatever to be the control of a point on a spline, you can rotate the dummy (and point) + you can scale him (which controls the tangents of the splinepoint. Altough in tangent pairs, not individual). the dummy’s pos/rot/scale can easely be controlled by something else…just thinking out loud here, so forgive me if I’m saying stupid things…
oh and by the way, in my last post I meant I would like to know how you set up an expression as an alternative way to path constraints. so how do you make a path constraint in expression form?
Making a path constraint via an expression is not hard. Its just a matter of driving the ratios via a slider or something. You wont get control of the point itself as its being driven.
Ive written a lot of this stuff down to ill send you a pm with more stuff.
I’m kinda stuck here, I’ve used some script controllers and other constraints with my timesliders maximum at frame 70…now some of the controllers don’t do what they should do after frame 70. Do you by any chance know if there’s a parameter I can change so I can offset the time limit of the controllers?
go into your graph editor - grab all the timelines that corespond and end at frame 70. Then just stretch them till you want the controller to stop. (pull the ends)
its pretty cool ur taking so much time and dedication on this… its been years in development for you!!
hope you can muster up a tut soon… but i remember reading you’d have one ‘soon’ in 2003!!
heh… well… hope all goes well for you
Its getting there slowly - lots of research recently in muscles/pose stuff. Ive been looking into face|robot, as well as combination sculpture systems. Max 8 solves a lot of the issues ive been having with its loose referencing. Im tooling it slowly so eventually i should have a bunch of scripts!
what’s “loose referencing”?
basically your referencing nodes, like the expression editor. But with the next script controller, so you dont have to worry about name dependancy etc
wow! i just read all 48 pages :eek:
This is pretty much my first time researching facial setup. I was doing trial and error at first and started to get confusing so i decided to do some research here and boy my brain having some cell sex
I’d like you thank everyone who has contributed to this thread.
I’ll try and add some more stuff up soonish - been really busy lately with Bioware, learning all the tools and such.
Ive got some more ideas, which may (probably) make your heads hurt, generally im scripting most of the tools and stuff. Most of the muscle stuffs done, just thinking about new techniques etc etc.