| By Emile Ghorayeb |
What are mathematical exressions? Also known as Float expressions in Max, mathematical
expressions are expressions that can be used to control such things as object parameters
(length, width, etc.), transform (rotation, position, scale) and modifier values, mapping
coordinates, materials, etc. The pssibilities are endless. I will be going through a number of steps: · Initial breakdown of Max3s Morpher · Quick glimpse at the Track View · Creating the facial targets ·
Setting up the original mesh for facial
targets ·
How to create progressive morph in Max3 ·
How to link your facial targets to your
original mesh ·
Final result/ Trouble Shooting Maxs Morpher A modifier, Morpher is used to create morph targets. Go to Modify/More and select the Morpher modifier. I will
only explain what is useful fo the moment. The most important thing is to remember that
your initial object and your morph target have to have the same numbered vertices which
means that you can not morph an object into a completely different object, you can not
delete half your object, work on only one half, mirror it, attach it and select it for a
target. The rollout contains many sub-rollouts stated here: Channel Color Legend: ·
self explanatory Global Parameters: ·
Use limits: This controls your target
spinners to stay between the values placed here. ·
Use vertex selection: you can choose to
select only certain vertices to be morphed, not a whole object. Channel List: ·
Save marker/Delete marker: These
markers are used as page breaks. ·
-empty-: These are the channels which
will contain each morph target, 1 target per channel. ·
Load multiple targets: self explanatory ·
Reload all morph targets: This is used
only when your computer cant refresh automatically. ·
Automatically reload targets: you should
always have this clicked on so that your refresh rate is always automatic. Channel parameters: ·
Channel is active: Used to
activate/deactivate a channel. ·
Pick object from scene: self explanatory ·
Capture currnet state: self explanatory Advanced Parameters: ·
Spinner increments (5.0, 1.0, 0.1): self
explanatory ·
Approximate usage: self explanatory How to use this modifier: To select a target: ·
Click on the channel you want to add the
morph target to; ·
Click on pick object from scene; ·
Click on the object you want to be the
morph target; ·
Use the spinner to view the changes. And thats about it. I advise you to
play with it and familiarise yourself with the modifier before you attack anything of
production. You might wanna group you targets in a manner to keep things clean. For
example, after having modeled a face and its targets, I separate my lipsych shapes from my
blinks with a page break (name your page break and click add marker to create a
seperation) . I also suggest to keep the Automatically reload targets on, unless you want
to reload everytime you make any changes. Quick glimpse at the Track View The Track View is where all the motion (animation) is delt
with, from controllers to animation keys. Everything can be seen here. Objects, materials,
mapping, video post, rotation and space warps are just a small percentage of what you can
find here. It could be compared to a graph of the object/parameter selected. You can find
it in the top right hand corner to the right of your named selection sets. Heres
some explanation on this tool: |
![]() |
Basic usage of the Track View: After having clicked on it you can find this icon in the top
left hand side of the Track View.
if you click on it, another board opens up. This is the
Filters. Filtering here means what you want to see and what you dont want to see.
You can choose to see only certain objects like you can choose only certain aspects of
those objects. This is usually the first thing you look at after entering the track view
to filter out what you dont want to see, because it can get very clouded with
information in there. Another is the Assign Controller button which well be using.
There are many buttons in this board. Whats important
to remember, is that this is mostly used to edit animation. The only buttons well be
intersted in here are the Filter and Assign Controller buttons. So, we use the Filter button to filter out what we want to
see, and what we dont. And the Assign Controller button is used to set a specific
controller to an object or a parameter of that same object (Link control, Rotation, etc.) FLOAT EXPRESSIONS Creating the facial targets We will be using a character and her facial expressions for
the example, namely Harley Quinn. To be ready to attack float expressions, being clear
about your work is essential. Naming everything is important. You must follow every step
accordingly or youre bound to fall into trouble. What to know for everything to work out well: ·
What facial expressions to create ·
The right procedure on how to create them ·
Assigning the float expressions Creating the facial expressions Names and colors of objects: Lipsynch: Note: "CHA" means the 3 first letters of the character. For example, Harley quinn would be HAR, Poison Emilio would be EMI, etc. CHAm_lipsynch_Aup CHAm_lipsynch_A
CHAm_lipsynch_Adown CHAm_lipsynch_Bup CHAm_lipsynch_B
CHAm_lipsynch_Bdown CHAm_lipsynch_Cup CHAm_lipsynch_C
CHAm_lipsynch_Cdown CHAm_lipsynch_Dup CHAm_lipsynch_D
CHAm_lipsynch_Ddown CHAm_lipsynch_Eup CHAm_lipsynch_E
CHAm_lipsynch_Edown Mouthshapes: CHAm_mouth_smileopen CHAm_mouth_smilecolsed CHAm_mouth_pout Etc. Blinks(which includes eyebrows): CHAm_eyes_ntrl01
CHAm_eyes_ntrl02
CHAm_eyes_ntrl03 CHAm_eyes_mad01
CHAm_eyes_mad02 CHAm_eyes_mad03 CHAm_eyes_sad01
CHAm_eyes_sad02
CHAm_eyes_sad03
Etc. Blinks: create the initial eyes (worried, sad, etc.), then
create the eyes closed. Heres the trick to speed things up. Take the initial eyes,
add a Morpher, add the closed eye target, put it at 50%, Collapse the object, and move
your vertices accordingly to get the midclosed eye you want. Lipsynch: create the initial lipsynch targets (A, B, C, D ,
E), then create the up and down targets using these. Most of the time you can move only
the corners with a little readjusting of the mouth to get what you want. You can also
create mouthshapes with these, or vice-versa. Depending on your character, you might have to separate your
left eyes from your right which means that youll have 3 targets for your left eye
mad, 3 targets for your right eye mad, etc. It should look something like this: CHAm_Leye_ntrl01
CHAm_Leye_ntrl02
CHAm_Leye_ntrl03 CHAm_Reye_ntrl01
CHAm_Reye_ntrl02
CHAm_Reye_ntrl03 CHAm_Leye_mad01
CHAm_Leye_mad02 CHAm_Leye_mad03 CHAm_Reye_mad01
CHAm_Reye_mad02 CHAm_Reye_mad03 CHAm_Leye_sad01
CHAm_Leye_sad02
CHAm_Leye_sad03 CHAm_Reye_sad01
CHAm_Reye_sad02
CHAm_Reye_sad03 Etc. Colors: |

CHAm_*_expr: red CHAm_eyes_* : orange CHAm_mouth_* : blue CHAm_lipsynch_* : green Setting up the original mesh for facial targets This is an important step in the creation of the character.
You must setup your character now so it can receive the targets which will contain other
targets and float expressions. Heres how you do it: ·
Select your mesh ·
Apply Morpher (modify/more/morpher) ·
This is what it should look like: |

What is important to do here, is to set the neutral target
(a duplicate of the original head that you will call CHAm_ntrl) in the __MOUTHMOOD__ and
__BLINK__ targets. We will use these after while we are setting up float expressions. NOTE: in order for you to see the __MOUTHMOOD__ and
__BLINK__ targets, you must go in the track view, select both of them, click assign
controller, and assign a TCB Float controller, or you will not be able to see them
come the time to set the expression. 1 page per set of expressions. How to create progressive morph in Max3 Now that we have created all our targets, we need to link
them all with float exressions in order to get the final result. But this poses a problem.
If we want the character to talk while smiling, or being sad, or to blink while the eyes
are in a particular shape, we need what is called progressive morph. Progressive morph
means going from one target to another with the intermidiate of a third. Note: The CHAm_eyes_*_exprs are duplicated from the first of the three blinks. Heres some examples: CHAm_eyes_ntrl01
becomes
CHAm_eyes_ntrl_expr CHAm_eyes_mad01
becomes CHAm_eyes_mad_expr CHAm_eyes_sad01
becomes
CHAm_eyes_sad_expr For the lipsynch: CHAm_lipsynch_Aup becomes
CHAm_lipsynch_A_expr CHAm_lipsynch_Bup becomes
CHAm_lipsynch_B_expr CHAm_lipsynch_Cup becomes
CHAm_lipsynch_C_expr CHAm_lipsynch_Dup becomes
CHAm_lipsynch_D_expr CHAm_lipsynch_Eup becomes
CHAm_lipsynch_E_expr The CHAm_eyes_*_expr are the targets which will hold the
mathematical expression: ·
Select your CHAm_eyes_ntrl_expr ·
Apply a morpher on it ·
Apply your 3 targets (CHAm_Leye_ntrl01,
CHAm_Leye_ntrl02, CHAm_Leye_ntrl03) ·
Rename the targets (in morpher) in the
Channel Paramaters rollout like so: |

·
Go to the Track View
·
Filter out what you want to see (it
should look like this):

Expand your objects to see the CHAm_lipsynch_A_expr (you can use the Zoom selected objects tool situated at the bottom left hand corner of the Track View) Expand it so you can see the 3 targets in Morpher. Select targets A and Adown by clicking on their names Click Assign
Controller Select Float
Expression and click OK. Now to set the
Expressions to each target: Select the 2nd
target (A) Right click on it Select
Properties, a rollout pops up, this is the float expression rollout. Type
Aup and click Create where it says Name. Do the same again
but type Adown and click Create Select the first
variable (Aup) Click Assign
Controller Go get Aup in the
CHAm_lipsynch_A_exprs morpher, click on it, then click OK. Select the second
variable (Adown) Click Assign
Controller Go get Adown in
the CHAm_lipsynch_A_exprs morpher, click on it, then click OK. In the expression
box type: if(Aup<50,Aup*2,100-abs(Adown)) Click
Evaluate(although you dont have to, but this is used to check if there are any
errors in your mathematical expression). Lets
understand what we wrote: Weve
selected the target A. It is important not to misunderstand what is the target and what is
the variable. So, in A we wrote that variables Aup and Adown control the Aup and Adown
targets. Knowing this we can look at the expression: In A: If Aup<50,
then do Aup*2 , then do 100-absolute value of Adown. All this should
add up to the value of A, because it is written in the Float expression box of A. If you
check now, youll see that nothing works yet, we still have to set the exression on
the Adown target for everything to work. Select the 3rd
target (Adown) Right click on it Select
Properties, a rollout pops up, this is the float expression rollout. Type
Aup and click Create where it says Name. Click Assign
Controller Go get Aup in the
CHAm_lipsynch_A_exprs morpher, click on it, then click OK. In the expression
box type: (Aup*2)-100 Click Evaluate,
then click Close. Lets
understand what we wrote: Weve
selected the target Adown. It is important not to misunderstand what is the target and
what is the variable. So, in Adown we wrote that variable Aup controls the Aup target.
Knowing this we can look at the expression: In Adown: (Aup*2)-100
which means that the target Adown is always equal to double Aup minus a hundred. Now to prove
this, go play with the Aup target. Dont bother trying to play with A or Adown, you
cant move them because they are intertwind with Aup. If you put Aup at
34: A will be at 68:
If blinkA<50, then do blinkA*2 , then do 100-absolute value of blinkC. Adown will be at
0: (blinkA*2)-100 Now, all
thats left is to get Aup to be controlled by our original mesh (HQ_skin). If we can
get HQ_skin to control Aup, then we simply put our CHAm_lipsynch_A_expr as a target in our
morpher and it create a progressive morph. Heres how its done: Youre gonna
have to do this for every CHAm_lipsynch_*_expr: Go back in the
track view Expand your
objects to show your Morpher Select the 1st
target (Aup) Click Assign
Controller Select Float
Expression and click OK Right click on it Select
Properties. Type
mood and click Create where it says Name. Click Assign
Controller Go get the
MOUTHMOOD target in your original mesh and click OK Type
mood in the expression box Youve just
told Max3 that MOUTHMOOD in your original mesh controls Aup. So if MOUTHMOOD is at 50,
then Aup is at 50. And since Aup controls A and Adown, your original mesh will be able to
smile, be normal or pout correctly while talking. Do this for all your
CHAm_lipsynch_*_exprs and all your Aups will be controlled by one spinner on
your original mesh, so you will be able to smile, be normal or pout while talking with one
controller only. Remember to do this for all the CHAm_lipsynch_*_exprs. Since all your other targets are in your original mesh, youre done. Play and have fun! Emile Ghorayeb is currently an animator and technical director for all cinematic characters at Ubisoft. Among other things, he has worked on Rayman the television series (available on VHS and DVD), cinematics for Disney Interactive (The jungle Book: Rhythm and Groove; Donald Duck: Quack Attack), and cinematics for an upcoming Batman Game. For more information or to contact Emile CLICK HERE.
|