Sie sind auf Seite 1von 183

Copyright 2007 CG Toolkit

All rights reserved.


Copyright: No part of this publication may be reproduced in any way, stored in a retrieval system of any type, or transmitted by any means or media, electronic or mechanical, including, but not limited to, photocopy, recording, or scanning, without prior permission in writing from CG Toolkit.
Publisher:
CG Toolkit
www.cgtoolkit.com
Karim Biri , Oleg Alexander , Filipe da Silva Lopes , Kursad Karatas , Glen Southern
ISBN: 0-9768003-4-9
Trademarks: All brand names and product names mentioned in this book are trademarks or service marks of their respective companies. Any omission or
misuse (of any kind) of service marks or trademarks should not be regarded as intent on the property of others. The publisher recognizes and respects all
marks used by companies, manufacturers, and developers as a means to distinguish their products.
Limits of Liability and Disclaimer of Warranty: The authors and publisher of this book have used their best efforts in preparing the book and the programs
contained in it. These efforts include the development, research and testing of the theories and programs to determine their effectiveness. The author and
publisher make no warranty of any kind, expressed or implied, with regard to these programs or the documentations contained in this book.
The authors and publisher shall not be liable in the event of incidental or consequential damages in connection with, or arising out of, the furnishing, performance or use of the programs, associated instructions, and/or claims of productivity gains.
Credits,
Authors:
Karim Biri , Oleg Alexander , Filipe da Silva Lopes , Kursad Karatas , Glen Southern , Jasen Strong
Publishing director:
Karim Biri
Editor:
Tony Barbieri
Read proofing:
Judi Du Rand , Emma Clifton

Layout:
Damla Elmasli , Karim Biri

01
Concept
Par t

The Art of 3d Toons

01 _Creation Process
02 _The Charaters
02.1.

_Regis the Bat

02.2. _Stinson the bird


02.3. _Gary the elephant
02.4. _Gaston the creature
02.5. _Pi the Owl
02.6. _Fletcher the rabbit
02.7. _Amanda the spider

01 _ Creation Process
1 _Where do you find inspiration for the poses? Where do you
start ?

From Paper to Scan to Flash


At this stage I draw on the cheapest paper that I could find.
Normally 3 holed punched paper and placed into a 3 ring
binder. I don't care for the expensive stuff cause I feel at a
subconscious level you might not draw as plentiful and care
free. Also I like to draw (in the beginning of a project) in a sort
of busy environment like the subway or restaurant; People have
even seen me draw while walking from place to place. Thank
the artistic gods that I haven't bumped into anything yet. When
I start to find something in the page after I have gone through
many pages of scribbles (that shouldn't be seen by the public)
I start to get more serious and scan the image into Photoshop
then block out shapes and use the liquid tool to morph things
into a more dynamic pose or experiment with proportions.
Then I print that out & draw more so that it is clear, eventually
I'll end up with a single lined image. I convert that into Adobe
Streamline to remove all the chunky bits, then copy & paste into
Flash for a color bath.

Normally I have a character colored & approved by higher


powers before moving onto the next stage of drawing various
poses. To stay on model, I print out several onion skinned
drawings to constantly look back at, so I don't drift too far from
the original approved version. This is when I do the side of
character back, various expressions and so on.
2 _How did u arrive at these forms and shapes?

I normally try to work shapes that are universally liked by


most people. For example the owl was in the realm of a kid's
proportions 2-3 heads high. The bean shape is always fun to
play around with. Contrast in huge shapes and smaller shapes
is a classic approach to creating interest & appeal.
3 _How do u give your creatures personality?
When doing multiple drawings for production use, I just do the
normal things that are expected such as happy, sad, confused
etc.
On initial pitching for movies & shows I normally don't
have too much time to mess around so that is where it would
be better to tell a story with a single image, using props or
interacting with another character.
Picture 01 _1

Picture 01 _2

Picture 01 _1
Picture 01 _8
Picture 01 _8

02 _ The Characters
2.01 _Regis the bat

02 .2 _Stinson the bird

10

11

02.3 _Gary the elephant

12

13

02.4 _Gaston the creature

14

15

02.5 _Pi the owl

16

17

02.6 _Fletcher the rabbit

18

19

02.7 _Amanda the spider

20

21

02
Modelling
Par t

The Art of 3d Toons

01 _ Regis Part
02 _ Stinson Part
03 _ Gary Part
04_ Gaston Part
05_ Pi Part
06_ Amanda Part

01 _ Regis
Before attempting this model ensure you have a grasp of the
basic commands in Maya with special emphasis on Move, Rotate,
Scale and navigating around the model in the active viewport.
Also ensure that you understand how to change between Face,
Vertex and Edge mode using keyboard commands or Right
clicking.

SOME COMMENTS FROM THE MODELER.......


(glen Southern)

The

great thing about doing the modeling for this project

was that

was working from a range of creature images in a

huge variety of poses.

this nature

Very

often for a modeling project of

would work with a set of references that would

include a front, side, top view and a supporting sketch.


references can be placed in the different viewports
and used as a template to model over.

2D

to very flat looking copies of the

This

in

These
Maya

In Maya, ensure Modeling is shown in the dialog box at the top


left of the screen. Goto polygon primitive>cube to create a base
cube to begin modeling. In the main window use shading>flat
shade all and ensure wireframe on shaded is switch on.
Using split polygon (Alt + X) run three splits horizontally all the
way around the cube. Then run two more vertically, one front
to back and one left to right.
Picture 01 _1

This will create the mirrored half on the left of the model. We
will now only model the right hand side and the changes will
be reflected in the left..
To create the mouth shape run a split (ALT + X) from the center
out to the right, then down and back to the center. Select faces
inside this area and call edit polygons>extrude face. Push the
mouth area into the mesh. To create the basic leg shape select
Picture 01 _3

can sometimes lead

sketch.

much prefer

to model freeform using a method called box modelling and

build the creatures up from scratch using the artist's original


designs.

find that this gives me a very organic look to the

models and allows me a certain amount of creative freedom.

The

character design was so strong for each of these crea-

found it very easy to match their individual char-

acteristics in

could

tures that

3D. For

example, to model the birds wing

have drawn the basic wing shape in

Photoshop

model an outline in

modelled the entire wing

Maya. Instead I

from a single box with little more than the


and some tweaking.

To

use

Maya

as my core modeller

and scripts to help me.

These

are:

Connect poly shape: mainly for


HKMagnet: a replacement for
geometry into shape.
I

and used it to

Extrude

command

use a selection of plug-ins

using

the mirror function

soft modification for pulling

Maya Shelf which is simply an area where I


can keep all the tools I use regularly in one place. I added
basic Maya tools like Extrude and also some useful little
scripts like split loop. To Model effectively in Maya you actually need a very small amount of tools and commands.Maya
is very customizable.
set up my own

Go to vertex mode (right click and choose vertex). Using Move


(W). Tweak the mesh into a rough pear shape which is to be the
body. This can be done quickly with a Loop Split if available.
For this model I used Connect poly shape (a plug-in) to generate
a mirrored half of the mesh. Delete the left hand side of
the mesh and call connect poly shape and select the button
`connect poly shape`.
Picture 01 _2

the bottom most face and use Extrude, Move (W) and Rotate
(E). Change to a Quad view (use the icon on the left hand side
of the screen). Now tweak the mesh into the body shape shown
by moving vertices around one by one. Using the Quad view
sometimes helps the get a nice shape from all angles.

Picture 01 _4

The core of my tools and techniques are as follow:


I very often start out with a basic cube. For creatures I use
Connect poly shape to give me a mirrored half of the mesh so
that I only have to work on one side. To add geometry I use
mainly Extrude and Split polygon. To join items together I use
the Combine function and then merge vertices. To smooth out
areas of a mesh I use average vertices

27

Go back to a single view. It is important to give a model good


edge loops especially in areas that will move or crease a lot
during animation. Change the flow of the polygons around the
mouth using a combination of Split polygon, Merge vertices
and by deleting unwanted edges. With a few commands you
can reshape the mouth into a ring or series of edge loops as
shown.
Picture 01 _5

To create an area where the eye will be, select a group of


faces on the top of the head and Extrude twice. Tweak these
new faces into smooth rings as shown. You can select the faces
and use Polygons>average vertices which smooths out parts of
the mesh without adding geometry.
To get a basic arm (Wing), select four faces on the side of the
body and Extrude out several times.
Picture 01 _6

Switch back to the Quad view. Now take some time and teak the
model until you have the shape shown. You can tweak faces,
edges and vertices to your preference.

Picture 01 _7

Select a face on the back of the head and do multiple extrudes


for the ear shape.
Select the faces on the end of the Wing and keep extruding
outwards. Angle these down at the end a little using Rotate on
them before extruding.

Picture 01 _8

Changing views constantly helps to keep the form correct. Tweak


the mesh to achieve the desired result.

Picture 01 _9

Select a group of faces inside the ear shape and extrude


inwards. Use a combination of average vertices and tweaking
to get the ear shape.

Picture 01 _10

Select the whole ear and use average vertices to smooth out
the shape. Then using deform>soft modification you can pull out
the end of the ear shape. There are several Magnet plug-ins
that can help with this.

Picture 01 _11

Change views and keep adjusting the shape of the ear as


shown.

Picture 01 _12

Picture 01 _8

28

29

To create the toes select one of the faces at the end of the leg.
Extrude outwards several times, each time adjusting the size and
position of the face using Move, Rotate and Scale.

Run a split down the center of each toes and turn it under the
foot before it goes up the body. This is because we want more
geometry in the toe area but not further up the leg and body.
Use Average vertices to smooth out the toes a little. Tweak the
toes into the claw-like shape shown.

Picture 01 _13

Do this twice to create the two toes shown.

Check it in all angles. Tweak as needed.

Picture 01 _14

30

Picture 01 _15

To help with creating the head shape create a sphere


(create>polygon primitive>sphere). Use Move, Scale and Rotate
to get the sphere into the eye socket area. This acts as a place
holder and allows you to model around it and get an accurate
eye shape. Pull the eye geometry up around the eye sphere
and tweak the shape. Use Split polygon or Split loop to add
more edge loops where needed.
Picture 01 _17

To create the wing, create a new model using create>polygon


primitives>plane. Using Split polygon, create more geometry and
shape it into the basic bat wing shown.

Picture 01 _16

Picture 01 _18

Shape the bottom of the wing into points thinking about the
anatomy of a bat and where the bones will be placed.

Picture 01 _19

Select the faces of the wing and Extrude them out to make
the wing three dimensional. Make the area at the top thicker
by selecting a line of vertices and dragging them outwards as
shown. Tweak the end of the wing to be ready to extrude
fingers.

Picture 01 _20

31

Using soft modification pull the end of the wing out and into
the correct shape. I used 2D reference throughout this project
to refer to it as needed.

Delete the relevant faces at the end of the wing then select the
wing and the fingers together. Use Polygons>combine to make
the objects into one object. Using Edit Polygons>Merge vertices
attach each finger to the wing.

Picture 01 _21

Picture 01 _23

Move the wing into position next to the body. Select the body
and the wing and use Polygons>combine.

Picture 01 _25

Tweak the mesh to match the reference.

Picture 01 _27

Picture 01 _45

To create the fingers create a new cube (create>polygon


primitive>cube). Use Extrude then Move, Scale and Rotate to
shape a single finger. Copy this finger twice and arrange the
fingers as shown. Delete the end polygons at the hand end of
the fingers. Move the to be in line with the wing as shown.

Picture 01 _22

32

Tweak the overall shape to suit. Add more splits where the
bones of the wing drop to the points. As this is a cartoon Bat
the anatomy is not accurate so you need to build the wing as
per the reference you are given.

Picture 01 _24

Using merge vertices attach the wing to the body.

Picture 01 _26

Look at the Bat from several angles and do more tweaking to


get as close to the reference as possible. If need be use the Split
polygon tool to add in more geometry.

Picture 01 _28

33

To create the tongue and teeth use a combination of the steps


described already in the project. The teeth are created from
cubes, shaped by tweaking and moved into place inside the
mouth. The tongue is the same but needs more geometry as it
needs to be shaped more.

Picture 01 _29

The mesh now needs to be refined with a combination of


tweaking and adding splits. Try to keep the mesh 100% quads so
that you dont have to hunt down triangles at the end of the
process.

Picture 01 _30

34

Look at the model from the back and start to get the areas like
the shoulder to be as close to the reference image as possible.
Change from Single perspective view to Quad view over and
over again.

At this stage you can turn off connect poly shape and mirror
the mesh into a full symmetrical model. Use Polygons>mirror
geometry.

Picture 01 _33

Picture 01 _31

Go back to the mouth area and use Polygons>Smooth on the


teeth and tongue the increase the amount of polygons. Then
using soft modification and tweaking you can get a very
detailed mouth area.

Picture 01 _32

Check it from the back. Always refer back to the reference.

Check it in Quad view.

Picture 01 _35

More tweaking as you find small issues.

Picture 01 _34

Picture 01 _36

35

To smooth the mesh by adding more geometry use Edit


polygons>smooth. You will now see a much higher resolution
version of the Bat and it will be 4x the polygons.

And a final check of the full mesh.

Jasen Strong Galler y

Picture 01 _37

Picture 01 _39

Picture 01 _38

Picture 01 _40

Some final tweaking from the back.

36

37

02 _ Stinson

38

39

Starting in Maya create a basic cube. Split the cube around the
centre axis, back to front. You can do this with a loop split or
by hand with the split polygon tool (CTRL + X)

Picture 02 _1

Switch to Quad View and check the shape from all angles. Select
faces and move them as needed.

Picture 02 _2

40

Tweak the shape of the cube into the barrel body of the bird
from the reference image. Stay in vertex mode and work
around the model getting a rough shape.

Picture 02 _3

Select the faces that make up the entire left hand side (as you
are looking at it) of the model. Delete these.

Picture 02 _4

Call the connect poly shape script and mirror the mesh over.
This will need to be turned off and on during the modelling. It
is fine to delete the left half on occasions and simply re-call the
script.

Picture 02 _5

Check the mesh from all sides and tweak if needed. Try to get
as smooth a shape as possible with minimal polygons.

Picture 02 _6

Select a face on the top of the model and extrude upwards.


Using Rotate, Scale and Move you can position the new faces
then continue to Extrude. Here you are trying to form the Birds
neck. Keep checking back to your reference image.

Picture 02 _7

Ensure that the faces arcs around to form the neck. The shape
has to roughly conform to the neck area and you can tweak
it into shape as you move further into the modelling.

Picture 02 _8

41

Using rotate, position the top most face. Each time you extrude
a face you need to rotate the face a little more to form the
curve in the neck.

Picture 02 _9

Rotate and Scale as needed.

Check the model in Quad View to ensure it is looking correct


from all angles. Run a split vertically around the model. This
should run up the right hand side and up around the beak.

Picture 02 _11

As you come out at the front of the model decrease the size of
the polygon face. This is where the beak tapers to the end.

Picture 02 _10

42

Keep extruding up and around as shown.

Picture 02 _12

Picture 02 _13

Continue tweaking in Perspective mode. Check the model from


the top and bottom as well. Getting the overall shape right in
these early stages is crucial.

Picture 02 _15

Now spend some time in vertex mode tweaking the individual


vertices. Get the overall shape to match the Bird reference and
smooth out the beak area.

Picture 02 _14

Picture 02 _16

43

Remove the connect poly shape half of the model and check
around for any odd vertices.

Picture 02 _17

Tweak the mesh edges where needed.

Picture 02 _19

Select four faces on the bottom/side of the birds body. Extrude


these out to form the beginnings of the thigh.

Picture 02 _18

44

Re-instate the mirrored half and pay particular attention to the


shape of the beak. Make sure the profile matches the reference
as closely as possible at this stage.

Picture 02 _20

Using the combination of Extrude then Move and Rotate create


the leg and knee. You can extrude a full section then go back
and split around the leg if this helps.

Picture 02 _21

Switch back to perspective mode if needed and tweak the leg


into the desired pose. If needed, use soft modification to pull the
whole leg.

Picture 02 _22

Once you have reached the bottom of the leg you can Extrude
backwards then forwards to create the beginning of the toes.
The Bird has a backwards facing toe/claw so do this one first.

Picture 02 _23

As this area will be moving/stretching/bending a lot during


animation it is advisable to put in more geometry around the
crease areas. Use the split tool where possible but try to keep
the model all Quads.

Picture 02 _24

45

Rotate and tweak the from face of the foot to make the next
extrusion more accurate.

Tweak the shape of the foot to match the reference.

Picture 02 _25

Select the faces on the underside of the foot and do a small


extrusion downwards. This will help to form the sole of the foot
and keep the shape. This now gives you a more geometry at
the front of the foot. Make sure you select it all for the next
extrusion.

Picture 02 _26

46

Picture 02 _27

Select a portion of the foot and use average vertices to smooth


out the mesh. Do this a few times around the foot to get a more
rounded look to the model.

Picture 02 _29

Tweak and review.

We can leave the feet for now and move back up to the beak.
Select some of the faces underneath the beak and at the top
of the neck. Extrude these out four or five times. Tweak the
individual vertices in to the shape shown. Make the inside slightly
concave as shown.

Picture 02 _31

To make the beak better for animation we need to adjust the


flow of polygons to give us good edge loops all the way around
the upper and lower portions of the beak. Using a combination
of merge vertices and split polygon change the flow of the
polygons in the corner of the beak area to match the image
shown. You can also delete edges if needed.

Picture 02 _28

Picture 02 _30

Picture 02 _32

47

Refine the shape of the beak more. Look at the model from the
side to get the beak profile just right.

Picture 02 _33

Select the group of faces shown. This area will become the eye
socket.

48

Picture 02 _37

Picture 02 _35

Select the faces inside the beak and extrude downwards forming
the area for the tongue to sit. DO the same in the upper portion
of the beak to form the roof of the mouth.

Picture 02 _34

Using a combination of tweaking and average vertices smooth


out the eye ring. Extrude again and make a raised area in
the centre as shown

Tweak the eye area to match the image.

Picture 02 _36

Picture 02 _39

Create a sphere to act as a temporary eye. Scale it and place


it as shown. Tweak the vertices in the eye socket. Build up the
area to form an eye lid. Split loop more geometry if needed.
Add several edge loops and then tweak the eye so that it
clearly has an upper and lower lid ridge.

Picture 02 _38

Picture 02 _40

49

Look back to your reference and then review the eye from
several angles.

Picture 02 _41

The tongue and teeth are another series of cubes adjusted to


fit the model. Using soft modification on the tongue, pulling it into
the curled shape shown in the image. Make one tooth first by
creating a cube and splitting polygons as needed. Then create
and re-position new copies. This is best done in Quad view so
you can make minor adjustments as needed.

Picture 02 _42

50

Place the teeth and tongue into the beak and take a look at
the model in perspective mode. Tweak the overall head shape
to suit. This is quite close to the desired look at this stage.

Picture 02 _43

Continue matching the shape of the Birds head to the reference


image.

Picture 02 _44

Make another set of teeth to use for the top of the beak. Either
copy the bottom set or load up a new set. Position them in the
beak as shown.

Picture 02 _45

Add more loops around the top of the head where the beak
meets the head. Adjust individual polygons to get a ridge in the
mesh.

Picture 02 _46

The next stage is to create the wings. Select the faces that make
up the shoulder area. Extrude them once then smooth the area
with average vertices. Delete the faces as shown and leave a
gap ready to join the finished wing.

Picture 02 _47

Create a cube and position it next to the gap in the body mesh.
Scale it down to suit. Select the face farthest from the body and
Extrude outwards. Using Move and Rotate create the start of
the wing shape including a joint.

Picture 02 _48

51

Continue extruding and create the structure of the wing. This is


essentially the part of the wing that would contain the bones.

Picture 02 _49

The primary feathers on this bird will be geometry so we need


to extrude the shape of each feather from the main wing
section. Select a group of faces at the body end of the wing
and extrude downwards. Tweak this into the feather shape.
Carry on along the wing selecting every other face to give
gaps between the feathers. Keep matching the geometry to
your reference.

Picture 02 _51

Select all the faces that are on the lower side of the wing
structure so far. Extrude these downward several times. Take
some time now using average vertices and tweaking to get the
structure of the wing accurate. The more accurate this portion
is the better the wing will look. Use the images shown here and
the reference images to guide you.

Picture 02 _50

52

Using the Split polygon tool cut more geometry into the wing
to help define the feather shape. Work along each feather and
shape the wing as you go along. Use soft modification when
needed. Keep the triangles down to a minimum or have none
at all if possible.

Picture 02 _53

Keep pulling back from the model and reviewing the overall
shape of the wing against your reference image and against
the body mesh.

Picture 02 _52

Picture 02 _54

Select the body and the wing and combine them. Attach the
wing to the body using a combination of merge vertices and
by creating new polygons.

Picture 02 _55

Check the overall shape of the bird from all angles. Use Soft
modification as needed to refine the shape.

Picture 02 _56

53

Go back to the foot area and select faces on one side. Extrude
out to form the start of a talon or claw. Move, Rotate and
Scale as needed. Make the claw bulbous then taper of to a
point as shown.

Picture 02 _57

Use soft modification as needed to position the foot as a whole.

Picture 02 _59

Switch to the Quad view and check the overall shape.

Picture 02 _61

Select the faces that form the claw then copy them. Create
a copy and attach it to the foot. Tweak the foot to suit the
reference.

Picture 02 _58

54

Look for any opportunities to add extra geometry to help at


the animation stage. Areas where there will be a joint or the
character will have to bend can have more edge loops added
i.e. around the hip joint.

Picture 02 _63

At this stage you can try a very simple render to get a feel for
the overall shape. To do this make sure you have saved the
maya file. Create smooth version of your model (Smooth). Add
a basic light and hit RENDER.

Picture 02 _60

Picture 02 _62

Picture 02 _64

55

Some final details. Extrude out some tail feathers as shown. This
image show the smoothed version.

Picture 02 _65

Look at the smooth verison and see if there are any issue in
the mesh that need to be rectified. If so, go back to the saved
unsmoothed version and correct them.

Picture 02 _66

56

Create some head feathers from a basic cube. Position them to


suit the reference.

Picture 02 _67

Check the entire mesh and the bird is complete.

Picture 02 _69

Picture 02 _71

Picture 02 _70

Picture 02 _72

Use differing views to get the feather positioned accurately.

Picture 02 _68

57

03 _ Gar y

58

59

Draw the face out until the distance is roughly twice the
height.

Picture 03 _1

To start modeling the Elephant create a primitive Cube. Using


Split Loop run a line of edges down the center of the cube.
Delete the half on the left of the mesh. Using connect poly
shape mirror the half cube across the axis as shown.

Picture 03 _2

60

Picture 03 _3

Select the face at the front of the cube and extrude it outwards.
This will form the bulk of the torso.

Picture 03 _4

Picture 03 _5

Using either average vertices or by tweaking individual vertices


round the cube off as shown.

Picture 03 _6

Keep checking from all angles to ensure you are getting the
overall bulky shape required for an Elephants body.

Picture 03 _7

Shape the spine and front of the model as shown. The spine is
slightly raised.

Picture 03 _8

61

Check from all angles as shown.

Remove the mirrored half if needed and refine the leg shape.
Pay special attention to the rear leg and begin to form the
basic shape.

Picture 03 _9

62

Picture 03 _13

Picture 03 _11

Select two faces on the underside of the mesh. One is to become


the front leg and the other the rear leg. Extrude these faces
down into the shape shown.

Picture 03 _10

Look at the model from all sides in several views to get a feel
for the silhouette.

Carry on tweaking the mesh as needed.

Picture 03 _12

Start to shape the front and back legs into the basic quadruped
shape as shown.

Picture 03 _15

If you need to remove the mirroring to facilitate the modelling


simply re-instate the mirrored half using Connect Poly Shape.

Picture 03 _14

Picture 03 _16

63

Keep reviewing from all angles and tweak as needed.

To create the Elephants head, select the faces at the front of


the model and extrude it out. Tweak the points to get a bulky
shape as shown. Select the whole head and rotate it slightly
forward.

Picture 03 _17

Picture 03 _19

Remove the mirror if needed and tweak.

Picture 03 _18

64

Look at the model from all sides in several views to get a feel
for the silhouette.

Picture 03 _21

The next step is to create a trunk and mouth. Select the mouth
area as shown and extrude inwards. Tweak as shown.

Picture 03 _20

The trunk area can be extruded slightly above the new mouth
geometry.

Picture 03 _22

Picture 03 _23

Re-instate the mirror if needed.

Picture 03 _24

65

Select the front faces on the trunk and extrude out further
using move and rotate after each extrude.

Picture 03 _25

Look at the model from all angles including top down to get the
required shape for the trunk. To aid with UV mapping the trunk
will be created straight instead of hanging down.

Picture 03 _26

66

Keep selecting the front faces and extruding outwards. Go back


to vertices mode and tweak as needed.

Picture 03 _27

Tweak the shape of the head a little as the trunk gets larger.

Picture 03 _28

The trunk needs to have a series of bumps along its length.


When the overall length is correct go back along the trunk and
add edge loops to allow for indentations in the upper surface
as shown.

Picture 03 _29

As the trunk reaches full length begin to scale the faces down
with each extrusion.

Picture 03 _30

Picture 03 _31

At the very end of the trunk extrude the nostrils back into the
mesh. Tweak the vertices to get a rounded, bulbous tip. Extrude
a little way into the trunk to give the nostrils some depth.

Picture 03 _32

67

The overall trunk should look like this image with indentations
along the length.

Picture 03 _33

Where needed use rotate to shape the trunk as shown.

Picture 03 _34

68

Now to add some details to the top of the head extrude a bump
(or small hump) above the eye area. This can be smoothed out
but the effect is to raise the geometry on each side of the head
so dont flatten it out too much with smooth.

Picture 03 _35

Look at the shape of the head from a few angles to get the
core shape right.

Picture 03 _36

To create an eye, select the faces where the eye needs to


be and extrude inwards. Tweak point by point after every
extrusion and ensure that you give yourself enough edge loops
to sculpt the eyelids.

Picture 03 _37

Keep reviewing your work from multiple angles in perspective


and quad views.

Picture 03 _38

Picture 03 _39

Review the model as a whole and tweak the head shape a


little more. The model should now have the basic shape you
require.

Picture 03 _40

69

Next add some detail to the feet. Start with the rear foot.

Picture 03 _41

Now to start adding details. Select a loop of faces as shown and


split them. This will give more geometry at the corner of the
eye and be helpful later.

Picture 03 _42

70

Picture 03 _43

Selectively split polygons to give more geometry as shown.

Picture 03 _44

Now select a face at the bottom side of the foot and extrude
out a toe nail. It may take 5 or 6 extrusions to do it and lots
of minor tweaking.

Picture 03 _45

Picture 03 _47

Do this to create all the toes on the foot. Then using Average
Vertices and tweaking to sculpt the foot into the required
shape.

Picture 03 _46

Picture 03 _48

71

If you wish to see a smooth version create a smoothed proxy.

Repeat the entire process for the front foot or if you wish select
the front foot and copy it whole. Paste it back in and add it to
the mesh after removing the old foot. Use Combine to join them
back again.

Now work around the whole mesh and selectively add geometry
with either spilt polygon or extrude if needed. Tweak as you
go.

Picture 01 _53

Picture 03 _49

Check the whole mesh with the rear foot added.

Picture 03 _51

72

Picture 01 _55

Picture 01 _23

Make sure that the shape of the front and rear legs match
your concept. Although there is very little difference in bones
structure the two legs are very unique and need to be correct
against the concept.

Look at the shape of the head from a few angles to get the
core shape right.

Picture 01 _54

Picture 03 _50

Now to add some details to the top of the head extrude a bump
(or small hump) above the eye area. This can be smoothed out
but the effect is to raise the geometry on each side of the head
so dont flatten it out too much with smooth.

Picture 01 _56

Picture 03 _52

73

The ears are created from a single cube that is extruded


and sculpted. Extrude outwards and pull the geometry into
the shape shown. Keep refining and splitting until you have a
curved shape.

Delete the faces on the head where the ear will be placed.
Select the Elephant and the ear and Combine them.

Picture 01 _57

Use scale if needed on portions of the mesh. Remove the faces


on the end that will be attached to the Elephants head.
Move the new ear into place at the side of the head.

Picture 01 _58

74

Picture 01 _59

Picture 01 _61

Tweak the ear and head as shown.

Picture 01 _63

Fill in the gaps with new geometry.

Picture 01 _60

Picture 01 _62

Picture 01 _64

75

Change the shading to smooth shade no wire frame. This will


help you to iron out any issues in the mesh.

Picture 01 _65

Use a basic poly cube to create the teeth. Start with a cube
extrude out and up into a curved shape as shown. Add more
geometry and shape it into teeth.

Picture 01 _67

Picture 01 _69

Picture 01 _71

Picture 01 _68

Picture 01 _70

Picture 01 _72

Refine the overall look once the ear is attached.

Picture 01 _66

76

77

Use a smooth proxy to look at the mesh as a whole.

Jasen Strong Galler y

Picture 01 _73

78

79

04 _ Gaston Par t

80

81

We start with a primitive Cube.

Delete the selected face.

Picture 04 _1

Select the front face.

Picture 04 _3

Picture 04 _4

Select the edge at the front top of the head.

Picture 04 _5

Now select the top face and extrude it along the y-axis

Picture 04 _2

82

Extrude and scale a couple of times to get a rough torso and


head shape

Picture 04 _7

Add a new edge loop.

Picture 04 _6

Picture 04 _8

83

Select the side face between the head and torso. This is the
base

Keep extruding.

Select the face for the eye socket and extrude it.

Picture 04 _13

Picture 04 _9

Picture 04 _15

Picture 04 _11

Extrude and tweak further for a nicer looking arm.

Picture 04 _12

Add new edges on the front of the face. We will need these
for eye sockets and the mouth cavity.

Picture 04 _14

Select the
inwards.

faces

around

the

mouth

area

and

extrude

Picture 04 _16

Picture 04 _10

84

85

Add new detail to the corner of the mouth. Also add a new
edge
loop that cuts through the eye socket. And tweak it to make
it rounder.

Select the faces at the bottom of the torso. This is the base
character`s leg.

Picture 04 _17

Goto quad view to review your model.

Extrude and scale down.

Picture 04 _18

86

Picture 04 _19

Select faces at the back of the torso and extrude them.

Picture 04 _21

Keep extruding until you have a leg that has both bottom and
upper parts .

Picture 04 _20

Picture 04 _22

Picture 04 _23

Extrude and scale down further until you have a good


tapered

Picture 04 _24

87

Get back to the leg and add new edge loops to make the
leg
have rounder adding volume. Extrude new faces from the
ankle

Picture 04 _25

Add a new edge loop that starts from the belly area to the
foot.

Picture 04 _26

88

Tweak
form.

new vertices to give the belly and leg a rounder

Picture 04 _27

Add new edge loops on the side of the head. Select new
faces and extrude them to create the ear.

Picture 04 _28

Turn your camera to the front and add more detail at the
front
side of the ear.

Picture 04 _29

Now you need to add more detail around the eyes. Also
create a sphere and place it properly in the eye socket.
This is important to create good looking eye socket and
eye lids

Picture 04 _30

Now tweak the eye area to fit over the sphere properly.

Picture 04 _31

Add more edgeloops and tweak to create better looking


brow and eyes.

Picture 04 _32

89

Add more edge loops to create more details at the back


of the head.

Picture 04 _33

Tweak the extruded faces for right form.

Create fingers by extruding faces from the palm of the hand.

Picture 04 _35

Select the faces around the elbow and extrude them.

Picture 04 _34

90

Picture 04 _37

Review the hand model for edge loop inconsistencies.


Because hands have alot of moving parts. Wrong edgeloops
can be a big problem for riggers and animators.

Picture 04 _36

Picture 04 _38

Before adding more details around the mouth make sure


that you have the mouth in default open position. Add more
detail around the lips by adding edge loops.

Picture 04 _39

Tweak the vertices to give the lips fuller form. Also flow of the
edges around the mouth should be as uniform as possible.

Picture 04 _40

91

Enable proportional modelling tool and move the vertices


around the corner of the mouth inward to make it closer
to the character design.

Picture 04 _41

Add more edge loops to create more details at the back


of the head.

Picture 04 _42

92

Mirror your model to review general form.

Duplicate and mirror the bottom teeth set. We will use a


copied
set for upper teeth. Tweak them so they do not look the same.
Also upper teeth will generally have a bigger look then bottom

Picture 04 _43

Create a new set of teeth from cubes. Do not place them


evenly. Make sure they have slightly different rotation angles
to make them look more organic.

Picture 04 _44

Picture 04 _45

Edit the gums to to fit onto the teeth sets.

Move your camera back and review the teeth and gums.
Look for visual issues. Do they fit right, are they proportional,
is the curvature of the teeth and gums right, etc.

Picture 04 _47

Select your model. Add detail around the lips by adding edge
loops.

Picture 04 _46

Picture 04 _48

93

Smooth subdive it.

Select the eye balls and smooth subdivide them

Picture 04 _49

Jasen Strong Galler y

Picture 04 _51

Select the teeth and gums then smooth subdivide them.

Picture 04 _50

94

95

05 _ Pi Par t

96

97

We start with a cube. After creating the cube delete the face
that is on the x axis of the scene.

Select the top face and start extruding.

Picture 05 _1

Rotate your camera.

Picture 05 _3

Extrude until you have a rough vase shape.

Picture 05 _2

98

Mirror your model.

After merging mirrored objects you may have face normals


problems. To fix those open the attribute editor and make sure
that your model is not double sided. Freeze transform.

Picture 05 _5

Add one edge loop that cuts through the side of the model.
And apply average vertices to smooth it down little bit.

Picture 05 _4

Picture 05 _6

Picture 05 _7

Now everything is fixed.

Picture 05 _8

99

Now rotate your perspective view as in the picture.

Select the faces at the bottom of torso. Extrude them.

Picture 05 _9

Delete one half.

We are now working on the leg.

Picture 05 _10

100

Picture 05 _11

Now we can start adding the claw. Select the face at the
bottom of the leg that is facing front.

Picture 05 _13

Extrude and tweak a couple of times until you have a shape


of an 'S'.

Picture 05 _12

Picture 05 _14

Picture 05 _15

For the back part of the claw select the back face and split
in
two. Extrude one of the faces as you did with front piece.
Once you have a compelling shape, seperate the finished toe
and duplicate it. Move to the side and place it very close to
the

Picture 05 _16

101

Now merge the vertices.

Tweak the details around the claw and toes to give it a rounder
look.

Picture 05 _17

Picture 05 _19

Picture 05 _21

Picture 05 _23

Picture 05 _20

Picture 05 _22

Picture 05 _24

Now add more edges to the sides and edge loops to the
top of the toes.

Picture 05 _18

102

103

Mirror your model to check out the general volume


of your model.

Tweak the vertices to get a curved shape.

Start adding edge loops and more details until you have
enough faces that you can use for the bases of feathers.
Select
faces that look down and start extruding them one by one
to create the basic shapes of the feathers. We are focusing on

Picture 05 _29

Picture 05 _25

Now we will start working on the wings by adding a plane


that
has 3 sections.

104

Picture 05 _31

Picture 05 _27

Select all the faces and extrude the basic wings shape.

Add Edge loops that cut through the thin side of the wing

Picture 05 _30

Picture 05 _26

Make sure the ends of the feathers have a good pointy tip
feel.

Tweak further until you have an organic feel to it.

Picture 05 _32

Picture 05 _28

105

We now start working on the beak. Create a rough beak


shape from a primitve cube. For the nose hole add more edge
loops and extrude inward.

Picture 05 _33

Add more detail around the mouth. These parts need


to have a solid feeling to make the beak look like a harder
surface than the rest of the body. Sharper edges will help.

Picture 05 _34

Again create a primite cube and extrude a couple of times


to create a tongue shape.

Picture 05 _35

106

Picture 05 _36

Mirror the model.

Once you have attached the beak you can start adding details
to the head. First thing is to define where the eyes are. Since
this is an owl , eyes are on the front of the head. Select the
polygon in the front of the head and extrude inward. At this
point smooth subdivide your model to get more detail and
makes the forms smoother.
Picture 05 _37

Picture 05 _39

Now you will attach the beak to the head. The beak does
not need to be merged with the model at this point.

Picture 05 _38

Picture 05 _40

107

Select the faces on the side of the head and extrude them one
by one to get the feathers on the side.

Picture 05 _41

Do the same steps for the feather on top of its head.

Picture 05 _42

108

Turn your view and move down the back of the torso. Select
the faces and extrude them for the tail.

Picture 05 _43

Make sure it is not blocky looking, and it has nice tapered


feel.

Picture 05 _44

Create a sphere primitive and put them into the eye sockets.

Picture 05 _45

Before final smoothing make sure that all the objects that need
to be attached to the body are merged properly like the
wings.

Picture 05 _46

Picture 05 _47

Smooth subdive your model.

Picture 05 _48

109

Jasen Strong Galler y

110

111

07 __Spider
05
Amanda
Par
Par
t t

112

113

Start with a cube and delete the face that is closest to the origin
of the scene

Picture 07 _1

Mirror it.

Scale the edge loops up from the last operation. Move the edge
loop towards the front of the head.

Picture 07 _3

Picture 07 _5

Check out the below picture to see how it should look from side.
The loops are parallel to eachother.

Picture 07 _2

114

Select the front faces and start extruding.

Picture 07 _4

Picture 07 _7

Now add more edge loops to the neck area. Tweak until you
have a rough body shape that is close to the design.

Picture 07 _6

Picture 07 _8

115

First add edge loops to the mouth area. Now select the faces
that will the be the mouth opening and extrude them inward.
Extrude and tweak until the shape of the mouth is satisfying.

Picture 07 _9

Picture 07 _11

Check it out from the side view and make sure that the edge
of
the mouth goes half way to the head.

Picture 07 _13

Now to create a better ring loop around the mouth use the
knife tool.

Picture 07 _15

Mirror your model and check out the head and mouth
from multiple angles. You should have clean rings and a rough
form.

Picture 07 _10

116

Picture 07 _12

Picture 07 _14

Picture 07 _16

117

Move the vertices at the corner of the mouth to make it a


better
looking mouth corner.

Picture 07 _17

Now create edge loops that will split eye sockets from both
directions. Select the neighbouring faces and extrude them.

Picture 07 _19

Select the faces on the front of the head and extrude them to
form eye sockets.

Picture 07 _18

118

Picture 07 _21

Picture 07 _23

Mirror and merge your model. Since the spider has eyes in
the middle,. you need to have the both sides to be able to form
those shapes properly.

Picture 07 _20

Picture 07 _22

Picture 07 _24

119

Add more edge loops and use average vertices to smooth your
form. Make sure that the bases for the eye sockets are as
circular as
possible.

Picture 07 _25

Now select the faces of the first group of the eye sockets and
extrude them and tweak them until you have proper sockets.

Picture 07 _27

Use average vertices to smooth the rest of your model.

Picture 07 _26

120

Tweak the eye sockets in the middle.

Apply smooth subdividing.

Picture 07 _29

Apply similar steps to the front sockets to create holes that can
be used to hold a round eye sphere.

Picture 07 _28

Picture 07 _30

Picture 07 _31

Check out your model with smoothing applied.

Picture 07 _32

121

Undo.

Delete the other half of the model.

Picture 07 _33

You can make the last extrusion outward with this one. Since
the eye is so small you can use it to as a replacement
for a sphere.

Picture 07 _35

Now create the eye sockets on the side by selecting and


extruding faces.

Picture 07 _34

122

Picture 07 _36

Picture 07 _37

Create sphere primitives for eyes and place them


properly in eye sockets.

Picture 07 _38

Picture 07 _39

Make sure that they sit right in the holes. You can tweak the
lids to create a better grasp around the spheres.

Picture 07 _40

12 3

Create a cube primitive and extrude multiple times and tweak


until you have the shape of the insect legs. These legs are
bulgey at the tips and thinner in the middles. Then smooth your
model.

Picture 07 _41

Create smaller spikes to place them at the tip of the leg.


You can use cube primitives or cylinder primitives for this task.

Picture 07 _43

Try to make sure that they have a sense of a claw.


These spikes are used for grabbing all kinds of surfaces.

Picture 07 _45

Duplicate and place them at the tip. Make sure that they have
different scales and rotations.

Picture 07 _42

124

Picture 07 _44

Check it out from mulltiple angles.

Picture 07 _47

Duplicate the leg with spikes and place them near the body.

Picture 07 _46

Picture 07 _48

125

They should have sllightly different scales and rotation for a


more organic look.

Picture 07 _49

Delete the top faces that are facing toward the body from the
legs. Now use append polygon and vertex snapping to create
merging faces.

Picture 07 _51

Delete the corresponding faces from the body. Add new edge
loops to add more detail. Tweak the holes so that they are
pretty close to the shape of the upper parts of the legs. You
need to make sure that they have the same number of vertices
on both sides. Otherwise you would create alot of uneven
merged parts and polygons which is undesired.
Picture 06 _56

Picture 07 _50

126

Picture 07 _52

Picture 07 _54

127

03
UVMapping
Par t

The Art of 3d Toons


01 _UV Mapping a Character in Maya

01 _Uv Mapping
a Character in Maya

Picture 01 _2

4_ Switch to the Front view and select the Owl. In the Planar
Projection Options, click Project. The UVs in the UV Texture Editor
should now look like Figure 4. Now the Owl UVs are a single
UV shell. (Picture 01_4)

Picture 01 _5

Picture 01 _4

UV Mapping is the process of unwrapping a polygonal mesh in


2D space so that textures can be accurately applied. Think of it
as a bear rug. The 3D bear has been unwrapped to lay flat
on the ground.
UV Mapping used to be hard. But now, with the advent of the
Unfold UVs tool in Maya 7, UV Mapping is easy! The following is
a step by step breakdown of how to UV map a character in
Maya.
1_ In Maya 7, Open the file Pi_Owl.mb. This is the character we
will be UV Mapping. (Picture 01_1)

Picture 01 _1

Picture 01 _6

Go to Polygon UVs > Planar Mapping > Options. Change the


Mapping Direction to Camera. I recommend using this setting,
because it will simply do a Planar projection from the camera
you are currently in. (Picture 01_3)
Picture 01 _3

2_ Go to Window > UV Texture Editor and select the Owl's mesh.


As you can see, the UVs are a mess right now. But we'll soon
fix that!
You can move around in the UV Texture Editor just like you
would in any Orthographic view. (Picture 01_2)
3_ Before we can start using the Unfold UVs tool, we must first
create a single UV shell for the owl. We can use any of the
projection methods, except for the Automatic projection method.
In this case, we will simply use Planar Mapping.
130

5_ Before we continue, let's apply a checker pattern to the


Owl. The checker pattern will be an important visual guide for
determining the size of the UV shells relative to one another,
as well as identifying areas where there is significant texture
stretching or overlapping UVs.

Picture 01 _7

Switch to the Rendering menu set. Select the Owl and choose
Lighting/Shading > Assign New Material > Lambert.
(Picture 01_5)
6_ In the Attribute Editor that opens, click the checker box next
to Color. (Picture 01_6)
7_ In the Create Render Node window that opens, click on File.
This will create a File texture node and connect it to the color
attribute of the Lambert shader. (Picture 01_7)

131

8_ In the Attribute Editor, browse for the image called checkers.


tif. (Picture 01_8)
Picture 01 _8

10_ We are now ready to begin identifying the texture seams


on the Owl. Just like clothes have seams, so do UV maps. The
seams for a character are typically hidden in the back of the
head and spine, as well as the back of the arms and legs. The
Owl is no different.

Picture 01 _11

Picture 01 _14

It is usually impossible to unwrap an entire character as one


UV shell-several shells are required. We will start by separating
the Owl UVs into the main pieces, such as the head and torso,
the wings, and the feet.
Right-click over the Owl and choose Edge. Shift select the edges
all the way around the base of the wing. (Picture 01_10)

Picture 01 _12

Picture 01 _10

Picture 01 _13

9_ Finally, go to the perspective view and press 6 (Texture


mode). The gray checker pattern should now appear on the
Owl.
I like to make my checkers gray because they show up better
in the UV Texture Editor. I also prefer using a file texture for
the checkers instead of the Maya procedural checkers. A file
texture usually looks much sharper in the hardware view.
(Picture 01_9)
Picture 01 _13
Picture 01 _9

11_ Now, in the UV Texture Editor, click the Cut UVs button.
(Picture 01_11)

14_ Repeat for the right wing. (Picture 01_14)

12_ Also check the View Texture Borders button. (Picture 01_12)

15_ Cut the UVs around the feet. (Picture 01_15)

13_ Now the seam shows up thicker on the Owl. (Picture 01_13)

132

133

16_ Now, let's separate the wings into two pieces-front and back.
We will do this with the help of a very useful command: Select
Contiguous Edges. Select an edge on the crest of the wing and
choose Edit Polygons > Selection > Select Contiguous Edges.
I recommend creating a Shelf button for this command.
(Picture 01_16)

Picture 01 _17

Picture 01 _18

Picture 01 _20

Picture 01 _16

Picture 01 _19

Picture 01 _21

don't belong. Cut the UVs. (Picture 01_18)


Repeat for the right wing.
19_ Separate the little feathers on top of the Owls head.
(Picture 01_19)
20_ Similar to the wings, separate the front of the feathers from
the back. (Picture 01_20)
17_ All of the adjacent edges on the top of the wing will be
selected. (Picture 01_17)

21_ Separate the underside of both feet. (Picture 01_21)

18_ Using a combination of Shift selecting and deselecting, and


Select Contiguous Edges, select all the edges separating the front
of the wing from the back. Be sure to deselect any edges that
13 4

135

22_ Create seams on the back of the Owl, as shown in Figure


22. (Picture 01_22)
Do not select edges on the front of the Owl.

Picture 01 _23

Picture 01 _25

27_ Press the Align UVs Left button. This aligns all selected UVs
vertically with the leftmost UV in the selection. (Picture 01_27)
Picture 01 _27

Picture 01 _22

28_ Your UVs should look like Picture 01_28.


Picture 01 _28

Picture 01 _24

23_ Finally, create a seam under the Owl as shown in


Picture 01_23
24_ We are now finally ready to use
Select the Owl in object mode. In the UV
Polygons > Unfold UVs (only available in
When the Unfold UVs operation is finished,
something like Picture 01_24

Picture 01 _26

the Unfold UVs tool.


Texture Editor, choose
Maya 7 and above).
your UVs should look

As you can see, we still have a lot of work to do.


25_ Let's work with the main body shell for now. To select
UVs, right-click in the UV Texture Editor and choose UV from
marking menu. Select a few UVs on the body shell. Now, Ctrlright-click and choose To Shell. This selects the entire body shell.
We can now move it, rotate it, and scale it, using the W, E, and
R hotkeys, respectively. (Picture 01_25)
26_ Move the body shell out to the side somewhere. 26. The
body shell is a bit lopsided right now. That is, more texture space
(pixels) are being devoted to the left side than the right side. Let's
fix that. (Picture 01_26)
Rotate the body shell so that its center is as vertical as possible.
Then, shift select all the center UVs.
136

29_ Now we are going to perform another Unfold UVs operation,


while pinning these center UVs, as well as the UVs on all the
other shells.
With the center UVs selected, shift-select all the other UV shells,
like in Picture 01_29.

137

Picture 01 _29

Picture 01 _31

33_ Now we're going to reproject the wings. Select a UV on one


of the wings, Ctrl-right-click and choose To Shell. Arrange the
four different wing shells so that they are easy to select.
(Picture 01_33)

Picture 01 _34

Picture 01 _33

30_ Open the Unfold UVs option box and set the options to how
they appear in Picture 01_30. Hit apply.
Picture 01 _30

Picture 01 _32

Picture 01 _35

34_ Right-click in the UV Texture Editor and choose Face. Select


the two shells that represent the fronts of the wings. From the
front view, do a Planar projection. Move the resulting UVs out
to the side. (Picture 01_34)
Repeat for the back of the wings, but this time do a Planar
projection from the back view.
35_ Scale the new wing UVs so that the checkers are
approximately the same size as they are on the body.
(Picture 01_35)
31_ Your body shell UVs should now look like Picture 01_31.
Much better!
32_ Also, notice that the checkers are all approximately the same
size on the Owl. This means that there is not any significant
texture stretching on the Owl's body UV shell. (Picture 01_32)

138

139

36_ Similarly to the wings, reproject the bottoms of the feet. First
separate the bottoms of the feet from the tops of the feet, so
they are easier to select. Then go to Face selection mode in the
UV Texture Editor, select the faces for the bottoms of the feet and
do a Planar projection from the bottom view.

Picture 01 _37

Picture 01 _39

Picture 01 _40

Rescale the feet UVs so that the checkers are approximately the
same size as they are on the body. (Picture 01_36)
Picture 01 _36

Picture 01 _38

40_ We need to do one more thing before we will be ready


to finalize our UV map-do a final Unfold UVs operation with the
shell borders pinned.

Picture 01 _41

Select all the UVs, Ctrl-right-click and choose To Border. Perform


the final Unfold UVs operation with the same Options as before.
(Picture 01_40)

37_ Now reproject the tops of the feet from the top view. Rescale
the UVs again to match the size of the checkers.
(Picture 01_37)
38_ Following the procedure outlined in the last five steps,
reproject the feathers on top of the Owl's head from the front
view and the back view. Rescale appropriately. (Picture 01_38)
39_

140

41_ We are finally ready to move all the UV shells into the
upper left quadrant and finalize our UV map. Luckily, there is a
command in Maya that will help us do this quickly and easilyLayout UVs.
Select the Owl in Object mode and, in the UV Texture Editor,
choose Polygons > Layout UVs > Options. Set the options to what
they are in Figure 41 and hit Apply. (Picture 01_41)

Arrange the UV shells roughly like Picture 01_39.

141

42_ All the UV shells should now fit neatly into the 0 to 1 texture
space. Feel free to press the Apply button several times-you will
get different results every time. Find the layout you like!

Picture 01 _43

45_ The UVs have now been exported to an image file and the
texturing process can begin. (Picture 01_45)
Picture 01 _45

When you are satisfied with the layout, select all the UVs and
scale them down slightly. This way there will be a small border
between the edge of the texture map and the UV shells.
(Picture 01_42)
43_ We are finished UV Mapping! Take a final look at the Owl.
Notice that all the checkers are square and approximately
the same size. This means that this is a good UV map with no
significant texture stretching.
Open the file owlUVs.ma to see the finished UVs on the Owl.
(Picture 01_43)
44_ The last step in the UV mapping process is to export the UVs
to an image file, so that textures could be painted underneath
the UVs in your favorite graphics application.
Select the Owl in Object mode. In the UV Texture editor, choose
Polygons > UV Snapshot.
Set the Options to approximately as they appear in Picture
01_44 depending on the setting you prefer, and hit OK.

Picture 01 _42

142

Picture 01 _44

143

Jasen Strong Galler y

144

14 5

04
Textur ing
Par t

The Art of 3D Toons


01
02
03
04
05
06
07

_Regis Part
_Gary Part
_Pi Part
_Oscar Part
_Amanda Part
_Stinson Part
_Gaston Part

01 _ Regis Par t

In the Texture Editor, go to Polygons> UV Snapshot > bat_00002.


tif and Picture 01.1 _2 , Picture 0 1.1 _3.

0 1.1 _Bat
In Maya, select the body of the bat and go to Window>UV
Texture Editor Picture 01.1 _1.
Picture 01.1 _1

Picture 01.1 _2

150

The UV Snapshot is a command that creates an image of the


UV Coordinates. Select the name and location for the file and
set the resolution ( 2048x2048 ) and type of the image > Picture
0 1.1 _4.

Open the file on Photoshop Picture 0 1.1 _5.


Double click on the Background layer. This will open a window
to change the name and other properties of the layer. Click
"Ok". This will unlock the layer and let you modify this layer >
Picture 0 1.1 _6 and Picture 0 1.1 _7.

Invert the color of the layer ( Ctrl+i ) and set the blending mode
to Multiply > Picture 0 1.1 _8.

Picture 01.1 _3

Picture 01.1 _5

Picture 01.1 _7

Picture 01.1 _4

Picture 01.1 _6

Picture 01.1 _8

151

Create a new layer below and fill it with gray ( #81817f ).

Picture 01.1 _10

With the blending mode of the previous layer set to Multiply,


photoshop makes all the white areas transparent, and that helps
a lot to know which part of the model you're painting

With a smooth brush, paint a soft area around the eyes and
nose with the same color you used in these areas
Picture 0 1.1 _12 and Picture 0 1.1 _13.

Paint the area of the legs with a darker gray ( #888784 ) >
Picture 0 1.1 _14 and Picture 0 1.1 _15.

Picture 01.1 _12

Picture 01.1 _14

Picture 01.1 _13

Picture 01.1 _15

Use the opacity of the layer to make it more or less visible >
Picture 0 1.1 _9.
Picture 01.1 _9

Picture 01.1 _11

Paint the main areas of the body with the predominant color of
each area. Remember to keep each area on a separate layer.
On the bat, lets paint these parts with the following colors:
lips - #6b6a69
eyes and nose - #5c5b5a
tip of the wings - #575655
ears - #d6b69c
inside the mouth - #c79191
front part of the wings - #b7b6b5
Picture 0 1.1 _10 Picture 0 1.1 _11.

152

153

Create a light gray ( #b7b6b5 ) shape covering the belly and


the area near the mouth and apply a dark gray ( #40403f )
stroke effect on it > Picture 0 1.1 _16 and Picture 0 1.1 _17.

Apply a strong gaussian blur on these layers > Picture 0 1.1 _18.
and Picture 0 1.1 _19.

Apply the Pattern Overlay effect on the belly layer. Set the Blend
mode to Color Burn. Select the clouds pattern. Change the scale
and opacity as you wish > Picture 0 1.1 _20 and Picture 0 1.1 _21.

Picture 01.1 _16

Picture 01.1 _18

Picture 01.1 _20

Picture 01.1 _17

Picture 01.1 _19

Picture 01.1 _21

Select a light pink ( #e6c4b6 ) and paint some horizontal stripes


on the inside part of the ear > Picture 0 1.1 _22.

Picture 01.1 _22

Apply an Outer Glow effect on the stripes. Set the blend mode
to Normal and select a desaturated red ( #cc9999 ). Adjust the
color as you wish. Then apply a Bevel and Emboss effect. Set
the Depth to 1%, the size to 5 px and the Soften to 3 px > Picture
0 1.1 _23 , Picture 0 1.1 _24 and Picture 0 1.1 _25.
On a new layer, paint a brown ( #998282 ) area around the
ear > Picture 0 1.1 _26.
Apply the Pattern Overlay effect on the wings layer. Set the
Blend mode to Color Burn. Select the clouds pattern. Change the
scale and opacity as you wish > Picture 0 1.1 _27.
Paint a red ( #d57f93 ) area on he belly and adjust the layer
opacity to have a very light effect > Picture 0 1.1 _28.
With a very dark red ( #6f555c ) paint the bone area on the
wings > Picture 0 1.1 _29.
Apply the Pattern Overlay effect on the new layer. Set the Blend
mode to Soft Light. Select the wrinkle pattern. Change the scale
and opacity as you wish > Picture 0 1.1 _30.

15 4

155

15 6

Picture 01.1 _23

Picture 01.1 _25

Picture 01.1 _27

Picture 01.1 _29

Picture 01.1 _24

Picture 01.1 _26

Picture 01.1 _28

Picture 01.1 _30

157

Select the layer with the tip of the wings and apply a Pattern
Overlay effect. Set the Blend mode to Soft Light. Select the metal
landscape pattern >

Now create a new layer and paint the torso, ears and wings
areas with a solid color. Set the fill of the layer to 0% and apply
a Pattern Overlay effect on it. Set the Blend mode to Soft Light.
Select the clouds pattern. Change the scale and opacity as you
wish > Picture 0 1.1 _32 and Picture 0 1.1 _33.

Picture 01.2 _1

Picture 01.2 _3

Picture 01.1 _33

Some areas will not have a bump effect and, because of that,
we can remove the layers related to these areas.
In this case we'll remove the face features and lips ( but keep the
basic color ), the inside part of the mouth, the light color of the
wings and the basic color of the ear > Picture 0 1.2 _3.
Picture 01.1 _32
Picture 01.2 _2

A thing that makes the bump map creation easiest is the number
of layers. Merge the layers you created for some areas. You
may use the shortcut Ctrl+E to merge layers > Picture 0 1.2 _4.
Desaturate the layers to have a PB image. You can do it on
the entire image ( go to Image > Mode > Grayscale ) or layerby-layer ( press Ctrl+Shift+U to desaturate the layer ) > Picture
Picture 01.2 _4

0 1. 2 _Bat Bump
The bump map is a black and white image that defines which
area is raised and which is not.
We'll use the color map as base to create the bump map, so the
bump effect matches the color. Open the color file >
Picture 0 1.2 _1.
Fill the background of the texture with a black color (#000000)
> Picture 0 1.2 _2.

158

159

0 1.2 _5.
Use adjustment layers of levels to contrast each part of the
image to create the final bump texture. You can paint some
areas to have a different result. In this case, some areas around
Picture 01.2 _5

Picture 01.2 _6

160

161

02 _ Elephant Par t

162

163

0 2.1 _Elephant
In Maya, select the body of the elephant and go to Window>UV
Texture Editor Picture 02.1 _1.
Picture 02.1 _1

In the Texture Editor, go to Polygons> UV Snapshot >


Picture 02.1 _2. and Picture 02.1 _3.
The UV Snapshot is a command that creates an image of the
UV Coordinates. Select the name and location for the file and set
the resolution ( 2048x2048 ) and type of the image >
Picture 02.1 _4.

Open the file on Photoshop > Picture 02.1 _5.

Invert the color of the layer ( Ctrl+i ) and set the blending mode
to Multiply > Picture 02.1 _8.
Picture 02.1 _5

Picture 02.1 _3

Double click on the Background layer. This will open a window


to change the name and other properties of the layer. Click
"Ok". This will unlock the layer and let you modify this layer >
Picture 02.1 _6.
and Picture 02.1 _7
Picture 02.1 _2

Picture 02.1 _7

Picture 02.1 _4

Picture 02.1 _8

Picture 02.1 _6

Create a new layer below and fill it with a middle blue


( #849ece )
16 4

165

With the blending mode of the previous layer set to Multiply,


photoshop makes all the white areas transparent, and that helps
a lot to know which part of the model you're painting
Use the opacity of the layer to make it more or less visible >
Picture 02.1 _9.

Paint the main areas of the body. Use a dark blue ( #5e78a7
) to paint the legs, belly, tail and the tip of the trunk. Paint the
inside part of the mouth with a light brown ( #af6c5f ). With a
dark brown ( #7a6d72 ), paint each nail > Picture 02.1 _10. and
Picture 02.1 _11.
Picture 02.1 _11

With a darker blue ( #af6c5f ), paint the eye area and the
part above the head. Use the same color to paint the stronger
wrinkles on the trunk > Picture 02.1 _12 and Picture 02.1 _13.

Picture 02.1 _13

Picture 02.1 _9

Picture 02.1 _10

Use the same dark blue ( #af6c5f ) to paint the trunk and use
the layer opacity to define a subtle result > Picture 02.1 _14.
Duplicate the layer where you painted the lips and apply a
gaussian blur on it. This will give a smooth area around the lips
> Picture 02.1 _15.
Picture 02.1 _15

Picture 02.1 _12

Picture 02.1 _14

Select a dark blue ( #4f6385 ) and paint the area of the back
> Picture 02.1 _16.
Apply the Pattern Overlay effect on the backlayer. Set the Blend
mode to Soft Light. Select the clouds pattern. Change the scale
and opacity as you wish Picture 02.1 _17 and Picture 02.1 _18.
Select a pink tone ( #ffa8aa ) and paint the belly area and
the trunk bottom area. Use the layer opacity to define the final
result > Picture 02.1 _19.

166

167

Picture 02.1 _16

Picture 02.1 _17

168

Picture 02.1 _18

Picture 02.1 _19

Apply the Pattern Overlay effect on the new layer. Set the Blend
mode to Soft Light. Select the clouds pattern. Change the scale
and opacity as you wish Picture 02.1 _20 and Picture 02.1 _21.

Apply the outter glow effect on the nails layer. Select a very
dark blue ( #1d3351 ). Set the Blend mode to normal >
Picture 02.1 _22 and Picture 02.1 _23.

Picture 02.1 _20

Picture 02.1 _22

Picture 02.1 _21

Picture 02.1 _23

169

Paint two dark blue ( #4d6492 ) stripes on each ear and a


pink ( #ffa4a8 ) area on the front side of the ears. Create this
element on separate layers to define diferent opacity values for
each part > Picture 02.1 _24.

Picture 02.1 _25

Picture 02.1 _27

Picture 02.1 _26

Picture 02.1 _28

Picture 02.1 _29

Picture 02.1 _24

Apply the Pattern Overlay effect on the pink area of the ear. Set
the Blend mode to Soft Light. Select the clouds pattern. Change
the scale and opacity as you wish > Picture 02.1 _25.
Now create a new layer and paint the torso, ears and head
areas with a solid color. Set the fill of the layer to 0% and apply
a Pattern Overlay effect on it. Set the Blend mode to Soft Light.
Select the clouds pattern. Change the scale and opacity as you
wish > Picture 02.1 _26 and Picture 02.1 _27
Right click on the layer and select "Group into New Smart
Object" > Picture 02.1 _28.
Apply a gaussian blur filter on the result layer > Picture 02.1
_29.

0 2 . 2 _Elephant Bump
The bump map is a black and white image that defines wich
area is raised and which is not.
We'll use the color map as base to create the bump map, so the
bump effect matches the color. Open the color file >
Picture 02.2 _1.
Fill the background of the texture with a black color (#000000)
> Picture 02.2 _2.
Some areas will not have bump effect and, because of that, we
can remove the layers related to these areas.
In this case we'll keep just the lips, the trunk, the ears stripes, the
dark area on the back and the nails> Picture 02.2 _3.
A thing that makes the bump map creation easiest is the number
of layers. Merge the layers you created for some areas. You
may use the shortcut Ctrl+E to merge layers >Picture 02.2 _4.

170

171

Picture 02.2 _1

Picture 02.2 _3

Desaturate the layers to have a PB image. You can do it on the


entire image ( go to Image>Mode>Grayscale ) or layer-by-layer
( press Ctrl+Shit+U to desaturate the layer ) > Picture 02.2 _5.
Picture 02.2 _5

Use adjustment layers of levels to contrast each part of the


image to create the final bump texture > Picture 02.2 _6.
On the trunk, ears and back areas I applied a pattern overlay
effect using an image i created using a photo. To do that, open
the image you want to use as a pattern ( make sure it is a
seamless image ) and then go to Edit>Define Pattern. This will
add your image on the pattern library > Picture 02.2 _7. and
Picture 02.2 _8.
Picture 02.2 _7

Picture 02.2 _2

Picture 02.2 _4

Picture 02.2 _6

Picture 02.2 _8

172

173

03 _ Owl Par t

174

175

On the Texture Editor, go to Polygons> UV Snapshot >


Picture 03.1 _2 and Picture 03.1 _3.

0 3.1 _Owl
In Maya, select the body of the owl and go to Window>UV
Texture Editor > Picture 03.1 _1.

176

The UV Snapshot is a command that creates an image of the


UV Coordinates. Select the name and location for the file and set
the resolution ( 2048x2048 ) and type of the image >
Picture 03.1 _4.

Picture 03.1 _1

Picture 03.1 _3

Picture 03.1 _2

Picture 03.1 _4

Open the file in Photoshop > Picture 03.1 _5.


Picture 03.1 _5

Double click on the Background layer. This will open a window


to change the name and other properties of the layer. Click
"Ok". This will unlock the layer and let you modify this layer
> Picture 03.1 _6 and Picture 03.1 _7.
Invert the color of the layer ( Ctrl+i ) and set the blending mode
to Multiply > Picture 03.1 _8.
Picture 03.1 _7

Picture 03.1 _6

Picture 03.1 _8

17 7

Create a new layer below and fill it with a middle brown (


#73665b )

Picture 03.1 _10

Whith the blending mode of the previous layer set to Multiply,


photoshop makes all the white areas transparent, and that helps
a lot to know which part of the model you're painting

Select a very dark brown ( #4b4340 ) and paint the area


around the eyes, nose and the "hair". Use a very light brown
tone to paint the area below the eyes > Picture 03.1 _13.
Picture 03.1 _13

Use the opacity of the layer to make it more or less visible >
Picture 03.1 _9.

Now paint the stripes on the wings and tail. Use a dark yellow
( #a3970b ), a dark gray ( #585865 ) and a pure white ( #fffff
) > Picture 03.1 _14.
With a very dark brown ( #4b4340 ), paint the legs and feet
then select a dark gray ( #585865 ) and paint the nails >
Picture 03.1 _15.
Picture 03.1 _15

Picture 03.1 _9

Picture 03.1 _11

Start by painting a darker area on the back. Use a dark


brown color ( #645b58 ) > Picture 03.1 _10 and Picture 03.1 _11.
With a yellow color ( #cebd1e ), paint the belly and face. Create
a new layer and paint a small area on the belly with a light
red ( #c78897 ) and adjust the opacity to have a very subtle
result > Picture 03.1 _12.

178

Picture 03.1 _14

Apply the Pattern Overlay effect on the belly layer. Set the Blend
mode to Soft Light. Select the clouds pattern. Change the scale
and opacity as you wish > Picture 03.1 _16. and Picture 03.1 _17.
Still on the Layer Style window, apply the Inner Glow effect.
Change the Blend Mode to Normal, set the color to a light green
tone ( #a7a741 ) and change the size to give more volume to
the belly > Picture 03.1 _18 anda Picture 03.1 _19.

179

Picture 03.1 _16

Picture 03.1 _17

180

Picture 03.1 _18

Picture 03.1 _19

Apply the Pattern Overlay effect on the legs layer. Set the Blend
mode to Soft Light. Select the metal landscape pattern. Change
the scale and opacity as you wish Picture 03.1 _20 and
Picture 03.1 _21.

Apply the Pattern Overlay effect on the back layer. Set the Blend
mode to Soft Light. Select the clouds pattern. Change the scale
and opacity as you wish Picture 03.1 _22 and Picture 03.1 _23.

Picture 03.1 _20

Picture 03.1 _22

Picture 03.1 _21

Picture 03.1 _23

181

0 3.2 _Owl Beak

Picture 03.2 _1

Picture 03.2 _2

182

Picture 03.2 _5

Picture 03.2 _7

Picture 03.2 _6

Picture 03.2 _8

Picture 03.3 _3

Picture 03.4 _4

183

Picture 03.2 _9

Picture 03.2 _11

Picture 03.2 _13

Picture 03.2 _10

Picture 03.2 _12

Picture 03.2 _14

Picture 03.2 _15

0 3.3 _Owl Bump


The bump map is a black and white image that defines which
area is raised and which is not.
We'll use the color map as base to create the bump map, so the
bump effect matches the color. Open the color file >
Picture 03.3 _1.
Fill the background of the texture with a black color
( #000000 ) > Picture 03.1 _2.
Some areas will not have bump effect and, because of that, we
can remove the layers related to these areas.
In this case we'll remove the tail, the dark part painted on the
back of the entire character, the wings' stripes and the "hair" >
Picture 03.3 _3.

18 4

185

Picture 03.3 _1

Picture 03.3 _3

Desaturate the layers to have a PB image. You can do it on the


entire image ( go to Image>Mode>Grayscale ) or layer-by-layer (
press Ctrl+Shit+U to desaturate the layer ) > Picture 03.3 _5.
Use adjustment layers of levels to contrast each part of the
image to create the final bump texture > Picture 03.3 _6.
Picture 03.3 _5

A thing that makes the bump map creation easiest is the number
of layers. Merge the layers you created for some areas. You
may use the shortcut Ctrl+E to merge layers > Picture 03.3 _4.
Picture 03.3 _2
Picture 03.3 _4

186

Picture 03.3 _6

187

04 _ Oscar Par t

188

189

In the Texture Editor, go to Polygons> UV Snapshot >


Picture 04.1 _2 and Picture 04.1 _3.

0 4.1 _Rhino
In Maya, selec the body of the rhino and go to Window>UV
Texture Editor > Picture 04.1 _1.
Picture 04.1 _1

The UV Snapshot is a command that creates an image of the


UV Coordinates. Select the name and location for the file and set
the resolution ( 2048x2048 ) and type of the Picture 04.1 _4.
Picture 04.1 _3

Open the file on Photoshop > Picture 04.1 _5.

Picture 04.1 _7

Double click on the Background layer. This will open a window


to change the name and other properties of the layer. Click
"Ok". This will unlock the layer and let you modify this layer >
Picture 04.1 _6 and Picture 04.1 _7
Picture 04.1 _5

Invert the color of the layer ( Ctrl+i ) and set the blending mode
to Multiply > Picture 04.1 _8.

Picture 04.1 _2

190

Picture 04.1 _4

Picture 04.1 _6

Picture 04.1 _8

191

Create a new layer below and fill it with a very desaturated


blue color ( #8a8fa2 ).

Picture 041 _10

With the blending mode of the previous layer set to Multiply,


photoshop makes all the white areas transparent, and that helps
a lot to know which part of the model you're painting.

Paint the nails with a very dark blue ( #434654 ) >


Picture 04.1 _12 and Picture 041 _13.

Select the area around the horn and fill it with a gradient from
a dark color ( #636173 ) to a lighter one ( #b9b5c8 ) >
Picture 04.1 _14 and Picture 04.1 _15.

Picture 04.1 _12

Picture 04.1 _14

Picture 04.1 _13

Picture 041 _15

Use the opacity of the layer to make it more or less visible >
Picture 04.1 _9.
Picture 04.1 _9

Picture 04.1 _11

Paint the main areas of the body with the predominant color of
each area. Remember to keep each area on a separate layer.
Paint the legs and feet with a dark desaturated blue ( #5b6072
). Select a lighter tone of this color ( #62677b ) and paint the
eyes area and nose. Use an even lighter tone ( #6e748a ) to
paint the tip of the tail and the inside part of the ears. Use a
light violet ( #ad9bae ) to paint the belly. With a darker tone of
this violet ( #695e6f ) paint the lips and the inside part of the
mouth > Picture 04.1 _10 and Picture 04.1 _11.

192

193

Apply the Pattern Overlay effect on the horn layer. Set the Blend
mode to Color Dodge. Select the clouds pattern. Change the scale
and opacity as you wish > Picture 041 _16 and Picture 04.1 _17.

194

On the base of the horn and above the lips, paint a smooth
area with a dark and desaturated blue ( #777d93 ) > Picture
04.1 _18 and Picture 04.1 _19.

Select a very bright blue ( #c0c3cd ) and paint the area


around the nostril > Picture 04.1 _20
With a dark blue, paint the area on the rhino's back. Use the
layer opacity to adjust the final result > Picture 04.1 _21.

Apply the Pattern Overlay effect on the layer. Set the Blend
mode to Soft Light. Select the wrinkles pattern. Change the scale
and opacity as you wish > Picture 04.1 _22 and Picture 041_23

Picture 041 _16

Picture 04.1 _18

Picture 04.1 _20

Picture 04.1 _22

Picture 04.1 _17

Picture 04.1 _19

Picture 04.1 _21

Picture 041 _23

195

Open the blending options of the ears layer and apply the
Gradient Overlay effect. Set the first color to a dark blue
( #3d3a52 ) and the second to a light blue ( #c9c6d8 ) >
Picture 04.1 _24 and Picture 04.1 _25.

196

Still on the Layer Style window, add the Inner Glow effect. Set
the Blend mode to normal. Select a solid color ( #5d5875 ) and
add some noise to it > Picture 041 _26 and Picture 04.1 _27

Picture 04.1 _24

Picture 04.1 _26

Picture 04.1 _25

Picture 04.1 _27

Using a light blue color ( #a2a6b5 ) paint the area around the
ears > Picture 04.1 _28.
With a dark blue color ( #64697d ) paint the tip of the ears
> Picture 04.1 _29. Apply the Pattern Overlay effect on the belly
layer. Apply the Pattern Overlay effect on the belly layer. Set the

Blend mode to Color Burn. Select the clouds pattern. Change the
scale and opacity as you wish > Picture 04.1 _30 and Picture
04.1 _31.

Picture 04.1 _28

Picture 04.1 _30

Picture 04.1 _29

Picture 04.1 _31

197

0 4.2 _Rhino Bump


The bump map is a black and white image that defines wich
area is raised and wich is not.
Picture 04.2 _1

We'll use the color map as our base to create the bump map,
so the bump effect matches the color. Open the color file >
Picture 04.2 _1.
Fill the background of the texture with a black color
( #000000 ) > Picture 04.2 _2.

Picture 04.2 _4

Picture 04.2 _6

Some areas will not have our bump effect and, because of that,
we can remove the layers related to these areas.
In this case we'll remove the inside part of the mouth, the head
details ( eyes, nostrils etc... ), the tail and the pink part of the
belly> Picture 04.2 _3.
Picture 04.2 _3

Use adjustment layers of levels to contrast each part of the


image to create the final bump texture > Picture 04.2 _6.
On the lips, legs and feet I applied a pattern overlay effect using
an image i created using a photo. To do that, open the image
you want to use as a pattern ( make sure it is a seamless image
Picture 04.2 _2

Picture 04.2 _5
Picture 04.2 _7

One thing that makes the bump map creation easiest is the
number of layers. Merge the layers you created for some
areas. You may use the shortcut Ctrl+E to merge layers >
Picture 04.2 _4.
Desaturate the layers to have a grayscale image. You can do
it on the entire image ( go to Image>Mode>Grayscale ) or layerby-layer ( press Ctrl+Shit+U to desaturate the layer ) > Picture
04.2 _5.

198

199

05 _ Amanda Par t

200

201

In the Texture Editor, go to Polygons> UV Snapshot >


Picture 05.1 _2. and Picture 05.1 _3.

0 5.1 _Spider
In Maya, select the body of the spider and go to Window>UV
Texture Editor > Picture 05.1 _1.
Picture 05.1 _1

The UV Snapshot is a command that creates an image of the


UV Coordinates. Select the name and location for the file and set
the resolution ( 2048x2048 ) and type of the image >
Picture 05.1 _4.
Picture 05.1 _3

Open the file on Photoshop > Picture 05.1 _5.

Picture 05.1 _7

Double click on the Background layer. This will open a window


to change the name and other properties of the layer. Click
"Ok". This will unlock the layer and let you modify this layer >
Picture 05.1 _6. and Picture 05.1 _7.
Picture 05.1 _5

Invert the color of the layer ( Ctrl+i ) and set the blending mode
to Multiply > Picture 05.1 _8.
Create a new layer below and fill it with a desaturated red
color ( #9d5768 ).

Picture 05.1 _2

202

Picture 05.1 _4

Picture 05.1 _6

Picture 05.1 _8

203

With the blending mode of the previous layer set to Multiply,


photoshop makes all the white areas transparent, and that helps
a lot to know wich part of the model you're painting.
Use the opacity of the layer to make it more or less visible >
Picture 05.1 _9.

204

Start by painting a darker area on the back part of the rabbit.


Use a dark brown color ( #573f42 ) > Picture 05.1 _10 and
Picture 05.1 _11.

Select a dark red tone ( #72172d ) and paint the wires on the
top of the head and on the back of the spider > Picture 05.1 _12.
and Picture 05.1 _13.

With a lighter red tone ( #ac7079 ) paint the face >


Picture 05.1 _14. and Picture 05.1 _15.

Picture 05.1 _9

Picture 05.1 _11

Picture 05.1 _13

Picture 05.1 _15

Picture 05.1 _10

Picture 05.1 _12

Picture 05.1 _14

Picture 05.1 _16

205

Select the dark brown tone again ( #5c4448 ) and paint the
area around each eye. With a light red tone ( #a55b66 ), paint
the four reliefs near the eyes > Picture 05.1 _16 and
Picture 05.1 _17.

206

Paint the lips with a purple tone ( #895d6e ) and the inside part
of the mouth with a dark purple tone ( #67384b ) >
Picture 05.1 _18. and Picture 05.1 _19.

Select a very dark brown color ( #302224 ) and paint the tip
of the legs > Picture 05.1 _20. and Picture 05.1 _21.

With a black color ( #00000 ) paint some stripes on the legs to


create some divisions > Picture 05.1 _22 and Picture 05.1 _23.

Picture 05.1 _17

Picture 05.1 _19

Picture 05.1 _21

Picture 05.1 _23

Picture 05.1 _18

Picture 05.1 _20

Picture 05.1 _22

Picture 05.1 _24

207

Select a very dark brown ( #573f42 ) and paint some of the


divisions > Picture 05.1 _24 and Picture 05.1 _25.
Paint some other divisions with a lighter brown ( #63585a ).

208

Leave some divisions without painting so it will have the same


color as the rest of the body > Picture 05.1 _26 and Picture 05.1
_27.
Select the lips layer and apply a Inner Glow effect. Change the

blend mode to normal and set the solid color to a dark purple
( #734e5c ). On the same layer, apply a pattern overlay effect.
Set the blend mode to Soft Light and select the wrinkles pattern
> Picture 05.1 _28 , Picture 05.1 _29 and Picture 05.1 _30.

Picture 05.1 _25

Picture 05.1 _27

Picture 05.1 _29

Picture 06.1 _26

Picture 05.1 _28

Picture 05.1 _30

Now create a new layer and paint the torso and leg areas
with a solid color. Set the fill of the layer to 0% and apply a
Pattern Overlay effect on it. Set the Blend mode to Soft Light.
Select the clouds pattern. Change the scale and opacity as you
wish > Picture 05.1 _31 and Picture 05.1 _32
Picture 05.1 _31

Picture 05.1 _32

209

0 5.2 _Spider Bump


The bump map is a black and white image that defines which
area is raised and which is not.
Picture 05.2 _1

We'll use the color map as a base to create the bump map, so
the bump effect matches the color. Open the color file >
Picture 05.2 _1.

Picture 05.2 _4

Picture 05.2 _6

Fill the background of the texture with a black color


( #000000 ) > Picture 05.2 _2.
Some areas will not have bump effect and, because of that, we
can remove the layers related to these areas.
In this case we'll keep the main color with the pattern, the lips
and face details > Picture 05.2 _3.
Picture 05.2 _3

Picture 05.2 _2

Picture 05.2 _5

A thing that makes the bump map creation easiest is the number
of layers. Merge the layers you created for some areas. You
may use the shortcut Ctrl+E to merge layers > Picture 05.2 _4.

Picture 06.3 _1

Desaturate the layers to have a PB image. You can do it on the


entire image ( go to Image>Mode>Grayscale ) or layer-by-layer (
press Ctrl+Shit+U to desaturate the layer ) > Picture 05.2 _5.
Use adjustment layers of the levels effect to contrast each part
of the image to create the final bump texture > Picture 05.2
_6.

210

211

06 _ Stinson Par t

212

213

Picture 06.1 _3

Open the file on Photoshop Picture 06.1 _5.

Picture 06.1 _7
Picture 06.1 _5

0 6.1
In Maya, select the body of the tucan and go to Window>UV
Texture Editor Picture 06.1 _1.
Picture 06.1 _1

Invert the color of the layer ( Ctrl+i ) and set the blending mode
to Multiply Picture 06.1 _8.

The UV Snapshot is a command that creates an image of the


UV Coordinates. Select the name and location for the file and set
the resolution ( 2048x2048 ) and type of the image
Picture 06.1 _4.

In the Texture Editor, go to Polygons> UV Snapshot


Picture 06.1 _2. , 06.1 _3.

Picture 06.1 _2

Picture 06.1 _4

Double click on the Background layer. This will open a window


to change the name and other properties of the layer. Click
"Ok". This will unlock the layer and let you modify this layer
Picture 06.1 _6. , Picture 06.1 _7.

Picture 06.1 _8

Picture 06.1 _6

214

215

Create a new layer below and fill it with a light red color (
#d93a1f ).

Picture 06.1 _10

Paint the legs with a even darker red ( # 950b0b)


Picture 06.1 _12. , Picture 06.1 _13.
Picture 06.1 _12

With the blending mode of the previous layer set to Multiply,


photoshop makes all the white areas transparent, and that helps
a lot to know which part of the model you're painting

With a light orange ( #ea856f ), paint the belly area


Picture 06.1 _14
Picture 06.1 _14

Use the opacity of the layer to make it more or less visible


Picture 06.1 _9.
Picture 06.1 _9

Picture 06.1 _11


Picture 06.1 _13

Paint the head areas with its predominant color: the beak
with yellow ( #e1a40b ), the area over the beak with a darker
yellow ( #bb8c41 ), the eye area with gray ( #9f7979 ), the stoke
of eye area with a dark red ( #980707 ) and the inside part of
the mouth with a light red ( #c68080 ) Picture 06.1 _15. , Picture
06.1 _16.
Picture 06.1 _15

Start by painting a darker area on the back part of the tucan.


Use a darker red ( #b90b0b ) Picture 06.1 _10. , Picture 06.1 _11.

216

217

Picture 06.1 _16

Select a yellow tone ( #e2c30b ) and paint the feet and the
begining of the legs. Use a darker tone ( #ac933a ) to paint the
bottom part of the feet Picture 06.1 _17. , Picture 06.1 _18.
Picture 06.1 _17

218

Picture 06.1 _18

Use a dark red ( #b41710 ) to paint the top front part of the
wings Picture 06.1 _19. , Picture 06.1 _20.
Picture 06.1 _19

Picture 06.1 _20

Create some yellow ( #ba8b40 ) stripes on the wings and tail


Picture 06.1 _21. , Picture 06.1 _22.
Picture 06.1 _21

Picture 06.1 _22

On new layers, paint a dark red ( #a33700 ) area on the top


area of the beak and an orange ( #ec7624 ) area on the
bottom of the beak. Use the layer opacity to balance the result
Picture 06.1 _23. , Picture 06.1 _24.
Picture 06.1 _23

219

Picture 06.1 _24

Select the layer you painted the area over the beak and apply
an Inner Glow effect. Change the blend mode to normal and set
the solid color to black ( #000000 ). On the same layer, apply a
pattern overlay effect. Set the blend mode to Normal and select
the wrinkles pattern Picture 06.1 _25. , Picture 06.1 _26. , Picture
06.1 _27.

Picture 06.1 _26

Picture 06.1 _27

On the beak layer, apply a pattern overlay effect. Set the blend
mode to Screen and select the clouds pattern Picture 06.1 _28. ,
Picture 06.1 _29.

Select the layer for the gray eye area and apply an Inner
Glow effect. Set the blend mode to normal and select a solid
dark red ( #790000 ) Picture 06.1 _30. , Picture 06.1 _31.

Picture 06.1 _28

Picture 06.1 _30

Picture 06.1 _29

Picture 06.1 _31

Picture 06.1 _25

220

221

Now create a new layer and paint the torso and wing areas
with a solid color. Set the fill of the layer to 0% and apply a
Pattern Overlay effect on it. Set the Blend mode to Soft Light.
Select the clouds pattern. Change the scale and opacity as you
wish Picture 06.1 _32. , Picture 06.1 _33.
Picture 06.1 _32

0 6.2 _Bump
The bump map is a black and white image that defines which
area is raised and which is not.
We'll use the color map as a base to create the bump map, so
the bump effect matches the color. Open the color file
Picture 06.2 _01.

Some areas will not have a bump effect and, because of that,
we can remove the layers related to these areas.
In this case we'll remove the feet and the yellow part of the
leg, the eye area and the brown area near the beak Picture
06.2 _03.

Desaturate the layers to have a grayscale image. You can do


it on the entire image ( go to Image>Mode>Grayscale ) or layerby-layer ( press Ctrl+Shit+U to desaturate the layer ) Picture 06.2
Picture 06.2 _05

Picture 062 _03

Picture 06.2 _01

Fill the background of the texture with a black color (#000000)


Picture 06.2 _04.

Picture 06.1 _33

Fill the background of the texture with a black color (#000000)


Picture 06.2 _02.

Picture 06.2 _04

Use adjustment layers of levels to contrast each part of the


image to create the final bump texture Picture 06.2 _06.
Picture 06.2 _06

Picture 062 _02

222

22 3

07 Gaston Par t

224

225

Picture 07.1 _3

Picture 07.1 _5

Picture 07.1 _7

0 7.1
In Maya, select the body of the Gaston and go to Window>UV
Texture Editor Picture 07.1 _1.

The UV Snapshot is a command that creates an image of the


UV Coordinates. Select the name and location for the file and set
the resolution ( 2048x2048 ) and type of the image
Picture 07.1 _4.
Picture 07.1 _4

In the Texture Editor, go to Polygons> UV Snapshot


Picture 07.1 _2. , Picture 07.1 _3.

Picture 07.1 _2

Invert the color of the layer ( Ctrl+i ) and set the blending mode
to Multiply Picture 07.1 _8.
Double click on the Background layer. This will open a window
to change the name and other properties of the layer. Click
"Ok". This will unlock the layer and let you modify this layer
Picture 07.1 _6. , Picture 07.1 _7.
Picture 07.1 _6

Picture 07.1 _8

Open the file in Photoshop Picture 07.1 _5.

226

227

Create a new layer below and fill it with an orange color (


#a79473 ).

Picture 07.1 _10

With the blending mode of the previous layer set to Multiply,


photoshop makes all the white areas transparent, and that helps
a lot to know which part of the model you're painting
Use the opacity of the layer to make it more or less visible
Picture 07.1 _9.

Paint the main areas of the body with the predominant color
of each area. Remember to keep each area on a separate
layer. Paint the area around the eyes with a dark blue color (
#233e52 ), the lips with a little darker tone ( #2a4050 ), the inside
part of the mouth with a dark purple ( #92586c ), a light beige
( #ceb792 ) on the hand nails and a dark brown ( #45413b ) on
the feet nails Picture 07.1 _12. , Picture 07.1 _13.

Create some blue ( #3f596e ) stains on the head, arms and back
Picture 07.1 _14. , Picture 07.1 _15.
Picture 07.1 _14

Picture 07.1 _12

Picture 07.1 _9

Picture 07.1 _11

Picture 07.1 _13

Picture 07.1 _15

Start by painting a darker area on the back part of the body.


Use a desaturated blue ( #606c70 ) Picture 07.1 _10. , Picture 07.1
_11.

228

229

On each stain, apply a pattern overlay effect with the blend


mode set to multiply and with the wrinkles pattern
Picture 07.1 _16. , Picture 07.1 _17.

Duplicate each stain layer and apply a gaussian blur on it


Picture 07.1 _18. , Picture 07.1 _19.
Picture 07.1 _18

Picture 07.1 _16

Picture 07.1 _17

Paint the belly area with a light beige ( #d7bd91 ). Use a much
lighter tone ( #f8e3c1 ) to paint the area near the mouth and a
redish tone ( #d79891 ) to paint the bottom part of the belly
Picture 07.1 _20 , Picture 07.1 _21.

Picture 07.1 _22

Picture 07.1 _20

Picture 07.1 _19


Picture 07.1 _21

2 30

Paint the palm of the hands with a dark brown color ( #6b6459)
Picture 07.1 _22 , Picture 07.1 _23.

Picture 07.1 _23

2 31

Use the same dark brown color ( #6b6459 ) to paint the legs
and feet Picture 07.1 _24 , Picture 07.1 _25.
Picture 07.1 _24

Paint the inside part of the ears with a red tone ( #964e59)
Picture 07.1 _26 , Picture 07.1 _27.
Picture 07.1 _26

In the area around the eyes, paint the area near the eyes
with a black color ( #000000 ) and some details around the
eyes with a lighter blue ( #344e60 ) and with the Dodge tool
Picture 07.1 _28.

Picture 07.1 _29

Picture 07.1 _28

Picture 07.1 _30


Picture 07.1 _25

2 32

Picture 07.1 _27

On the hands nails layer, apply an Outer Glow effect. Set the
blend mode to normal and set the solid color to a dark brown
( #4c463d ) Picture 07.1 _29. , Picture 07.1 _30.

2 33

On the hand nails layer, apply an Outer Glow effect. Set the
blend mode to normal and set the solid color to a very dark
brown ( #24221e ) Picture 07.1 _31. , Picture 07.1 _32.
Picture 07.1 _31

Select the layer of the inside part of the mouth, apply an Inner
Glow effect. Set the blend mode to normal and set the solid color
to a dark blue ( #2d4252 ) Picture 07.1 _33. , Picture 07.1 _34.
Picture 071 _33

Open the blending options of the lips layer and apply the Inner
Glow effect. Set the blend mode to normal and the solid color
to a dark blue ( #1d394b ). Still on the Layer Style window, add
the Pattern Overlay. Set the Blend mode to Soft Light and select
the wrinkles pattern Picture 07.1 _35. , Picture 07.1 _36. , Picture
07.1 _37.

Picture 07.1 _37

Picture 07.1 _35

Now create a new layer and paint the torso, arms and legs
area with a solid color. Set the fill of the layer to 0% and apply
a Pattern Overlay effect on it. Set the Blend mode to Soft Light.
Select the clouds pattern. Change the scale and opacity as you
wish Picture 07.1 _38. , Picture 07.1 _39.
Picture 07.1 _32

Picture 07.1 _34


Picture 07.1 _36

234

Picture 07.1 _38

2 35

Picture 07.1 _39

Fill the background of the texture with a black color (#000000)


07.2 _02.
Picture 07.2 _02

A thing that makes the bump map creation easiest is the number
of layers. Merge the layers you created for some areas. You
may use the shortcut Ctrl+E to merge layers 07.2 _04.
Picture 07.2 _04

Use adjustment layers of levels to contrast each part of the


image to create the final bump texture 07.2 _06.

Picture 07.2 _06

0 7.2 _Bump
The bump map is a black and white image that defines which
area is raised and which is not.

Some areas will not have a bump effect and, because of that,
we can remove the layers related to these areas.

We'll use the color map as a base to create the bump map, so
the bump effect matches the color. Open the color file
08.2 _01.

In this case we'll remove the blue back area, the belly colors,
the dark brown area on the legs and feet, the inside part of
the mouth and nails 07.2 _03.

Picture 07.2 _01

2 36

Picture 07.2 _02

Desaturate the layers to have a grayscale image. You can do


it on the entire image ( go to Image>Mode>Grayscale ) or layerby-layer ( press Ctrl+Shit+U to desaturate the layer ) 07.2 _05.

Picture 07.2 _05

Picture 08.3 _01

2 37

05
Rigging
Par t

The Art of 3d Toons

00 _Introduction

14 _Additional stuff

01 _Preparing model

15 - Final Gaston Expressions Rig

02 _Placing bones

NN - Finalizing

03 _Control Icons
04 _Spine Rig
05 _Tail Rig
06 _Leg Rig
07 _Foot Rig
08 _Arm Rig
09 _Hand Rig
10 _Connection Between Rig Modules
11 _Body Skin Binding
12 _Addional Deformation Pass
13 _Facial Rig

00 _INTRODUCTION
The job of a 3d animator wouldn't be possible without prior
study of the characteristics that will form part of the character
and of course the relative setup for the animation. Preparing
a character setup for animation is the role of a character
setup artist, also named a "Rigger" or Character/Creature TD
(Technical Director).
As a Rigger, it's important to work very closely with the modelers
to check the correct number of edge loops in critical junctions
and to make the applicable changes for deformations to work
properly on the geometry of the character.
In this chapter the main problematic variables in the development
of a character setup will be analyzed, as well as methods which
may alleviate these problems, and allow for a way in which
to acquire greater versatility in adapting to different types of
extreme positions.
This will include making the rig more robust as well as ensuring
that all the module pieces work fine and connect properly.

THE G OA L

In 99% of situations an animator would like to be free of limitation


and restriction, work with simplified controls (as few as possible),
fully scalable characters in the world space and a body which
can fully squash and stretch (sometimes this capricious boy
wants it all and will never use the thousand controls that he
has demanded before).
The animator should never have to go deep inside Maya's
Hypergraph or a particular hidden menu for animation, the rig
must be simple to use and fast.
Obviously you need to reach that goal :)
One word: versatility!

Picture 00 _2

CHARACTER SETUP PROCESS ROLE

Picture 00 _3b

When we create an animation system for a geometric model


we can subdivide the process into three main sections: Rigging,
Enveloping, Muscles and Dynamics.
- Rigging:
Rigging is the part of the character setup where the bones
are placed in a hierarchy of skeletal formations and through
creating mathematical rules, the skeleton will be constrained to
work together with a list of objects called "animation controls".
- Enveloping:
The enveloping the part of a character's setup where the first
base pass of geometry deformations are created based on the
animation system which is created in the Rigging stage.
- Muscle, Dynamics and Cloth:
This section deals with finalizing the character , adding more
deformation passes, dynamics simulations ( e.g. fur, hairs, capes and
accessories), writing some Mel scripts and custom tools to assist
animators (e.g. character selection interface, managing, import
and export of animations motion file and pipeline procedures).
In large productions these roles are often dealt with by more
than one person, each separately taking care of each process
in order to obtain high quality animation.

WORK FLOW PLANNING

Setting the work flow is more useful than estimated. I often use
the Hotbox to switch between tools and to switch off a few
unnecessary items (e.g. help bar and status line) as this increases
your working time.
This you a bigger viewport size and your mind is focused on
your rig.
Another preferred suggestion is to set the Maya Project folder
before starting anything.

How to set a project in Maya


In the Menu:
File ---> Project ---> New (than fill the name box and choose
your location path) ---> Accept;

I also recommend saving a Maya Ascii file type (".ma" extension)


for your scene because it will then be possible to edit your
rig in a simple text editor during the process or in finalization.
I realise that an Ascii file is larger than a Binary file, but for
rigging this is the better option.*
An important note is to save a different file for each step
of the rigging process then you will be able to step back
over each action and enable an infinite undo within the Maya
preferences.

or to Set a Project:
File ---> Project ---> Set (and choose the path)
(Picture 3-3b)
Picture 00 _3

To enable infinite undo:


Window ---> Settings/Preferences ---> Settings ---> Undo --> click
on infinite radio button.
Remember to start a clean and tidy scene before commencing
rigging as certain things create confusion and slow down your
character in animation. It is fundamental to name everything
correctly. (Picture 00 _4)
*If you will end up referencing these rigs into scenes .mb files
will help speed up load times, keep memory usage down, and
allow for more references per scene. Working in a .ma file
and publishing a .mb file would be one method you may want
to explore depending on the scope of your project.

This option allows you to keep everything in the right place,


scene files, reference images, Mel script files, weight maps,
documentations. (Picture 00 _1)
240

241

Picture 00 _4

common suffixes for each component used:


GEO
GRP
LOC
JNT
etc...

for
for
for
for

this may seem dull in the beginning but it's fundamental.

geometry;
group;
locators;
joint,

Picture 00 _8

CUSTOM SHELVES

for example: GA00_body_GEO (Gaston character body geometry)


or GA00_R_foot_JNT ( Gaston character right foot joint).
(Picture 00_5)
Picture 00 _5

A great help for a rigger is the possibility of placing your useful


rigging process scripts into the Custom Shelf toolbar for each
individual use.
To do so, select the Mel script line and with MMB held down,
drag in your custom shelf toolbar, and the second time you can
change the icon of the brand new button. (Picture 00_14)
Picture 00 _14

NAM I N G C O N V E N T I O N S
To move or rotate a selected object press "w" (move shortcut
key) or "e" (rotate shortcut key). To change between world or
local transformation hold the relative keyboard key, click and
hold LMB on your object and use the mouse to change the

Naming conventions is the basis of a good clean and fast rig


:) Every geometry, group, control or locator must be named
correctly if you want to find it each time.
I usually place a short prefix based on the name of the character
and a number before everything in my rig (a number if there
is more than one of the same character in the scene) then the
name of the object and a suffix of three letters so that I can
remember the type:
character prefix _ side _ object name _

object type

I recommend that you use a very short name for your object,
but not too short such as "ff_ff_rt_ctl" .
Naming conventions for the character prefix used in this book:
BT00 = BAT Character;
BD00 = Bird Character;
EL00 = Elephant Character;
GA00 = Gaston Character;
OW00 = Pi_Owl Character;
RA00 = Rabbit Character;
RH00 = Rhino Character;
SP00 = Spider Character;

242

Picture 00 _9

To do this:
double click on the name of your geometry in the channel box
(top on the right) and rename it.
Or you can automatically add a prefix for all selected objects if
you press the space bar to use the Hotbox and then.
Modify ---> Prefix Hierarchy Names ---> than enter a prefix
with underscore and press ok (Picture 00_6)
Picture 00 _6

S PAC E A N D C O O R D I N AT E SYS T E M A X I S

In Maya we are able to transform an object (geometry, joint,


locator and so on) mainly in translation, rotation, and scale in 3
axis X Y Z.
There are different ways to move and rotate an object: using
Local Space transformations or World Space transformations
based on a Euler angles theory.
An objects movement or rotation in world space transformation
means that it is relative and aligned at the world (x y z origin
) coordinate system otherwise in local space transformation the
axis's are aligned to the axis of the object. (Picture 00_8)
243

Gimbal Lock

Picture 00 _11

OUTLINER AND HYP ERGRAPH

Picture 00 _7

Gimbal Lock is an issue that occurs when two rotation axis' are
pointing in the same direction, making it impossible to direct as
required.
The Outliner is a window (or a panel) with a full list of every
object, node, animation curve or other aspects, all which are the
components of the scene.
The Hypergraph is very useful in order to see the connections
within the input and output between nodes.
These windows are fundamental for a character rigger.

Important notice! To solve this problem within animation, choose


two axis' and ignore the third. (Picture 00_10)
Picture 00 _10

To Open :
Window --> Hypergraph or Outliner. (Picture 00_13)
Picture 00 _13

Picture 00 _12

Pivot
Another important aspect is the "pivot" that defines the center
point (in most instances) for transformation.
In Maya you can change the pivot point to where you want
it to be, using the Euler world coordinate system. This is really
useful during the rigging process (see rigging process section).
Select an object and press "e" to enter into the translate tool
(transformation), press "insert", the shape of the manipulator
will change and this will allow for movement of the pivot point
anywhere!
To exit out of the pivot edit mode press insert
again.(Picture 00_11)

NOD E A N D H I E R A R C H Y

Basically the hierarchies "Parent-children" are as fundamental in


Maya as is the relationship of nodes to other nodes.
A Parent node is an object or node that controls, through
transformation, other nodes called "Children". Obviously a "Parent"
could be a "Child" of another object and so on... (Picture 00_11)

244

MODEL RIGGING AND BIND POSE

"T" pose or not? (Picture 00_7)


First of all, I personally prefer the characters in a relaxed
pose., especially for cartoon characters. Basically, a relaxed
pose of all the body parts. This gives makes it easier to create
our character rig. The shoulders are relaxed and there are
no extreme poses. Arms, elbows bent slightly, and fingers in a
relaxed state. The legs should also be slightly apart with a slight
bend in the knees.

24 5

01 _PREPARING MODEL FOR RIGGING

Picture 01 _2b

Picture 01 _3b

Cleanup Geometry

- Check the normals orientation (needs to point outside the


geometry );
- Freeze the transformations (assign the value of zero to all
transformation attributes);
- Clean the construction history (history is unnecessary in most
instances)
Select your geometry
Use Hotbox (slow):

The first thing to do is to check the character base geometry


made by the modeler or by yourself. This is usually based on
a polygonal object.

Modify ---> Center Pivot;

- Place the model at the origin of the axis and not under
negative Y. The front of your model should be facing the positive
Z axis. Remember to place the model in a completly symmetrical
position. This position is best
as this makes it simpler to mirror items for bones, controls and
for facial shaping. (Picture 01 _1)

(Picture 01 _4)
Picture 01 _04

Picture 01 _1

Picture 01 _2

Picture 01 _03

Display ---> Polygonal Component ---> Normal (to turn on the


visualization, press again to turn off)
(Picture 01 _5)

Check the UV map of your geometry. It is most important


that you don't have overlapped uvs when you commence the
process of creating your rig. (Picture 01_2b)
If you do not have clean UVs that don't overlap then you can
create them automatically. In order to do so, press and hold the
spacebar in order to access the Hotbox menu:

Polygon Uvs ---> Automatic Mapping

this tool creates a basic UV map without any overlapping


mistakes occuring. (Picture 01 _3)

246

Now the next step:


- Center the animation axis pivot (this might change during the
rigging process);

247

Picture 01 _05

Picture 01 _07

Alternatively, in the Script Editor with Maya MEL Script

(fast):

Picture 01 _10

xform -cp;
// run this line for center pivot
polyNormalPerVertex -ufn true; // set the normal pointing outside the
geometry
makeIdentity -apply true -t 1 -r 1 -s 1 -n 0; // run this line for freeze
transformations
delete -ch;
// run this line for delete history
select -cl;
// run this line for clear the selections

(Picture 01 _9)
Picture 01 _09

Edit Polygons ---> Normal ---> Set to Face ---> Option (uncheck
the user normal box);

Or in MEL:
Edit ---> Delete by Type ---> History;

(Picture 01 _8)

(Picture 01 _6)
Picture 01 _06

group -w;

Now we need to keep each geometry in a display layer to


either show or hide as appropriate. In order to do so, select
the geometry and
in the Viewport:

Picture 01 _08

If you run this Mel in the script editor for the first time then
you will be able to repeat these commands only by selecting
a geometry and pressing "G". Remember that you can put this
script in your custom shelf.

press "Create new layer" button (in the panel under the channel
box) ---> select your geometry or group of geometry ---> click
with RMB ---> Add Selected Object

(Picture 01 _11)
Picture 01 _11

Use this procedure for all the geometry that you require.
Now create a group in which to contain all the geometry and
thereafter create a subgroup for objects that are made up
by different parts (for example a subgroup with eye and pupil
geometry):
select geometry and in the Hotbox:
Modify ---> Freeze transformations ---> Option ---> Freeze
Transform
(check all the first three boxes) ---> Apply;

248

modify ---> Group ---> Option ---> World and Origin enabled
---> Apply
(Picture 01 _10)

249

Or in MEL:
createDisplayLayer -name "layer1" -number 1 -empty;

(remember to rename this layer correctly, e.g. GA00_geo_DSP)


Now select your object [RMB] on the name of the display layer
---> Add Selected Objects
Now your model is ready to be rigged!

Picture 02 _03

Gaston is a human based cartoon character. After some study


I decided to use a humanoid bipedal skeleton, three bones for
each articulation of the body and only one for the head. Three
bones will be used in order to obtain a flexible rig and create
good deformations.

02 _PLACING BONES

This step often is tricky but it's fundamental to build a strong


rig! If your bones are not placed correctly you will not be able
to achieve good deformations. An Internal anatomy structure
based on character designs will help you place bones during
setup.
The correct position for bones is different for each character.
An important question is wether it is better to place bones
anatomically.
For a cartoon character the couple hundred human skeleton
bones, are not necessary. We need only the most essential
bones in this case. Sketch on a piece of paper, study your
character before placing any joints! Doing some anatomical
comparisons, is your character based on a human, an animal
or a cartoon?:
Once you have fully planned your character you can then
start placing joints and open Maya to start again
I always work on the left hand side. Once I'm happy with it I
mirror the joints across to the right hand side (we will use the

Place left leg joints:


using LMB click the side view, press spacebar to maximize the
window.
You don't need to select the geometry mesh, use it only as a
reference for placement of joints.
Press "template mode" in your geometry display layer we
created before for your character.
To build a joint chain press and hold spacebar to open the
Hotbox menu then
Skeleton ---> Joint Tool ---> Option then choose this setting for
joint orientation:
ZYX Orientation;
+Y second axis world;

Click 4 times with LMB to place three bones on the left leg.
(Picture 02 _4)
Picture 02 _04

in Mel:
joint -n first_JNT -p -3 0 4 ;
// joint creation line (x y z origin value)

Star ting with placing body joints


(Picture 02 _1)
Picture 02 _01

(Before using any Maya tool remember to Reset the tool option
to the default setting) (Picture 02 _2) (Picture 02 _3)
Picture 02 _02

If the joints displayed are too big or small you can change the
size using the Hotbox:
Display ---> Joint Size ---> Custom (change size moving the slider).

(Picture 02 _5)

250

251

Picture 02 _05

With this visual mode you can see if your joints are place
correctly inside your geometry. (Picture 02 _7)
Picture 02 _07

Joint Orientation

Picture 02 _10

We now need to orient your joint chain, but why do that?


When the axes of the joints have the same orientation it's easier
to do some procedural expressions or node connections (we will
cover this in later chapters)
In character rigging we normally use specific orientations as a
rule for all joint orientation:
+Z for first axis ;
+Y secondary up axis ;
+X positive third axis ;
(Picture 02 _9)
Picture 02 _09

At this point you need to adjust the positions of the joints.


Remember only to translate the joint and not rotate! Keep the
value of rotation at zero, this is really useful for the next steps.
Select one joint and press "w" to enter move object mode and
press "insert" on your keyboard.
This manipulator allows you to move the position of the joint
without affecting child joints. Very useful! (Picture 02 _6)
Picture 02 _06

For orienting joints use the Orient

Joint tool:

Skeleton ---> Orient Joint


There are also some useful in tools Maya for editing at the joint
creation step:

- to remove a joint from a chain (Skeleton ---> Remove Joint)
- to add a joint in a chain (Skeleton ---> Insert Joint Tool).

Remember to name your joints correctly (e.g. GA00_M_root_JNT,
GA00_L_femur_JNT). (Picture 02 _8)

Set the option with the same setting that we have used at the
creation : ZYX Orientation, +Y for secondary axes, it's possible
that the secondary axes is different than +Y, find the right axis
and make you sure that:
- Z axes pointing in direction of the next joint;
- Y axes is perpendicular and positive to the Z axes;
- X is positive.
(Picture 02 _11)

Picture 02 _08

Picture 02 _11

We have already assigned in creation, an initial automatic


orientation: ZYX Orientation, +Y second axis but now the joints
are in different position and need to be re-oriented.
First turn on Local Rotation Axes for your selected joints, under
the Display Menu ---> Component Display ---> Local Rotation
Axes.
(Picture 02 _10)

Switch now to "reference mode" in your geometry display layer,


turn on smooth shade, wireframe on shaded and X-Ray view
mode (Hotbox):
Shading ---> Smooth Shade All , Wireframe on Shaded, X-Ray.
252

253

Select your single joint or the root of the chain (automatic joint
orientation of the child node)

Picture 02 _14

Picture 02 _16

(Picture 02 _12) (Picture 02 _13)

Function then fill the left prefix ("L_") used for naming joints,
in the second text field the right side prefix ("R_") and press
Mirror...
(Picture 02 _18) (Picture 02 _19)

Picture 02 _12

Picture 02 _18

Spine and Head (Picture 02 _15)

Picture 02 _15

Tail (Picture 02 _17)


Picture 02 _17

Picture 02 _13
Picture 02 _19

Left Arm and Hand

(Picture 02 _16)

Mirroring Joint

joint -e -zso -oj zyx -sao yup first_JNT; // joint orientation command

We have now placed all the middle and left side joints (your
character's left not yours!). Now it is time to duplicate our joints
for the right hand side of the character.

Congratulations! You have placed the first correct joint chain :)

For mirroring joint use "Mirror Joint" tool:

Now do the same procedure for:

Skeleton ---> Mirror Joint ---> Option

Once you have completed mirroring the joints turn off the "Local
Rotation Axes" option.

the toes (Picture 02 _14)

choose "YZ" to mirror across axes and "Orientation" for Mirror

Now create a Display Layer for your joint chains using the same

In Mel;

25 4

Occasionally your mirrored joint will be oriented correctly but


not completely aligned. Use orient joint again to align.

255

method we used for the geometry layer. (e.g. GA00_jnt_DSP)

Picture 02 _21

Picture 02 _22

TADAA...You now have a complete fully oriented skeleton mirrored


and properly named!
(Remember to save your work frequently)

03 _CREATING CONTROL ICONS

An important aspect to building a useful and animator-friendly


rig is to produce a distinctive set of control icons.
I have
personally come across various impractical rigs containing too
many needless controls and unnecessary shapes. It is important
to remember that most animators derive their knowledge from
2D and may not easily identify with 3D animation software or
even a personal computer (although this has revolutionized over
the last year or so).

We haven't got a completely connected skeleton because we


don't need that. Our rigging process is module-oriented, this
means that all the articulations are separated modules each
connected to one spine (another module), this way it is easier
and cleaner to understand and a great method to do a flexible
and strong rig :) (Picture 02 _20)
Picture 02 _20

Our purpose is to simplify this function.

Minimal Shape
This is only a test, remember to save a separate file for this!
Picture 02 _23

Parent all the joints in the hierarchy.


- Select the Tail joint chain (e.g ) and shift select the root joint,
then press "p" (parent);
- Select the L leg chain (e.g ) and shift select the root joint, press
"p" (parent), repeat for the other side;
- Select the L arm joint chain (e.g ) and shift select the chest joint,
press "p" (parent), do the same for the other side;
- Connect the foot to the leg, toes to the foot joint and fingers
to the hand joint.

The shape control should be dependant upon the end objective


need and should also have minimal style (not be complex in
shape). I would usually use a nurbs curve based shape as this
object is automatically not able to be rendered in Maya and is
simple to hide in the viewport.
As a rule, I make use of a box, sphere or triangle curve based
shape and numerous special shapes, for example the hand/
finger rotations control (e.g. GA00_L_hand_rot_CTL).
(Picture 03 _02)
Picture 03 _02

To add a simple smooth:

A Little Smooth Skin Test


To make sure that your character joints are placed in the
correct position you can apply a simple default skin smooth bind
to see any deformations.
Alter your skeleton and mirror again as necessary.
(Picture 02 _21)

select the root joint (eg. GA00_M_root_JNT);


add into your selection the geometry (eg. GA00_body_GEO)
Skin ---> Bind Skin ---> Smooth Bind ---> Option
reset settings to default
select "Bind to selected joints" press "bind skin"

(Picture 02 _22) (Picture 02 _23)

Afterwards return your character to the bind pose and detach


and delete the skinCluster node :

Skin ---> Go to Bind Pose;


Skin ---> Detach Skin;

In productions sometime at this stage the rigging must be split


into the rigging animation process and the enveloping job, but
this is not our case.

a simple shape for the hand control.

When you are almost positive that your joints are in the right
place and have a nice basic deformation return to the previous
file (mirrored joint file) and start the next chapter :)

25 6

257

Edit the control point of your curve and when satisfied you can
override the colour with two techniques:

Position and Scale


It is important to place the control icon near and outside of the
geometry. The scale must be larger than the controlled object
(i.e. hand control is to be greater or almost equal to that of the
hand geometry). The control transformations must always be
frozen at completion.

Side Colour
Different coloured controls must at all times be created for the
left side (e.g. blue or green), right side (e.g. red) and middle (e.g.
yellow). The usage of colour variation is effective in animation
for recognition purposes.

-
create or add a Display Colour Layer for the control
(e.g. GA00_L_ctl_DSP) and change the colour of that layer
(automatically override by the colour of the layer).
-
manually override the colour of your control (remember
that you are only able to use one technique at a time).
In the past chapter you have already learned how to make a
display layer and add your object to the layer.
Now we will learn how to manually override the colours:

Shape control creation


In Maya, utilize the "EP Curve tool" to draw the control shape.
(Picture 03 _05)
Picture 03 _05

Select your object ---> press CTRL+A to go in attributes view


panel ---> open Object Display tab ---> open Drawing Overrides
tab ---> Check Enable Overrides than choose a Colour.
(Picture 03 _06)
Picture 03 _06

or in Mel Script (e.g. for GA00_L_hand_CTL):


setAttr "GA00_L_hand_CTL_shp.overrideEnabled" 1;
setAttr "GA00_L_hand_CTL_shp.overrideColor" 6;

//Remember :
//Color Index 17 is Yellow;
//Color Index 13 is Red;
//Color Index 6 is Blue

At some stage you may be required to combine different shape


nodes into a single node. In order to do so, you would need to
run a Mel line as it is not possible at present to drag and drop
shapes between geometry.
In Mel:
parent -r -s ( shape node of the first object ) (name of the second
object that collect the shape);

A simple example :
-

create a New scene:

create a Circle Nurbs primitive;

duplicate and move a second Circle Nurbs primitive;

freeze the transformation of the second circle;

-
write in the script editor :

parent -r -s nurbsCircleShape2 nurbsCircle1;
-

delete the empty second transform object node.

Perfect! Now you have connected the second object shape to


the first object transformation node.
This Mel command allows you to create, for example, a nurbs
curve box or sphere, which is not available in the Maya Nurbs
primitive creation menu.
In order to automate this procedure I have created a script
called dls_Drain_Shape:
Drain Shape MEL script

global proc dls_drainShape ( )


{
string $list[] = `ls -sl`;
// create a list of selected object
makeIdentity -apply true -t 1 -r 1 -s 1 -n 0 $list[0];
// freeze collector transformations

for ($i=1; $i<(size($list)); $i++)
//

{
//

makeIdentity -apply true -t 1 -r 1 -s 1 -n 0 $list[$i];
// for every secondary selected

string $sourceshp[] =`listRelatives -s $list[$i]`;
// find all the shape nodes and

for ( $item in $sourceshp)
// parent to the first collector

{
// object and delete the empy

parent -r -s $item $list[0];
// old transformations node


}
//

delete $list[$i];
//

}
}
// END

(place this script in your custom shelf)

Rigging procedure
Every Rigger has a library of control icons that are used in
every rigging procedure. I recommend that you create an icon
for your control shape.
Create a folder that contains a single file for every control
shape (e.g. box.ma , sphere.ma, cross.ma, hand.ma , foot.ma.).
Each file contains a single object which is then properly named
(but without a prefix) and placed in the origin of the world
axes.
When you require a new control object you have only to
import that file with the rig prefix. (Great!)
(Picture 03 _07)

// This script parent all the shape node of an objects to another object
collector.
// select the shape collector then objects to drain all the shapes of all
the objects secondary selected
// run "dls_drainShape;"

258

259

Picture 03 _07

Picture 03 _08

Picture 03 _10

Picture 03 _12

Excellent! The controls are a uniform blue 2D colour, really


amazing. Thereafter you can override the colour too if you
choose to by using the previous method.

in Mel (e.g. For Gaston import a box control object):


file -import -type "mayaAscii" -rpr "GA00_"
ma";

-pr "C:/mycontrols/box_ctl.

This method provides a faster rigging process and is optimised


for the potential of a future auto rigging procedure.

Now open the Hypergraph (Windows--->Hypergraph) press


"input and output connection" button and delete the connection
between NurbsSphereShape1 and InitialShadingGroup.
(Picture 03 _09) (Picture 03 _10)

It is important to remember to deselect "primary visibility" in the


Render Stats tabs of your control shape attribute panel if you
don't want to see the controls in rendering!
-
Select your control and press CTRL+A to open the
"Attribute Panel" on the right
-
Render Stats---> Primary Visibility Off.
(Picture 03 _11)

Picture 03 _09

Picture 03 _11

Additional Custom Controls


It is possible to create any type of shape for your controls.
I recommend using the nurbs curve because
it is easy to
manage. Sometimes, for the pleasure of the animators, I use
a tweaked nurbs sphere surface disconnected from the initial
shading node. It is a small technique and the control ends up
looking really good!
For example :
-

Create ---> Nurbs Primitives ---> Sphere;

(Picture 03 _08)
You can choose any nurbs shape for your control icon.
(Picture 03 _12)

260

261

-
Select the control and the new locator and press "p" (for
parent) (Picture 04 _02b)

Picture 04 _01

04 _RIGGING PROCESS SPINE RIG

Picture 04 _02
Picture 04 _02b

The basic for a cartoon character is a completely elastic spine


to allow every extreme movement in animation.
The main
characteristic of our Gaston character is a long spine and a
big head . in animation the silhouette pose of the spine is very
important! so we need a great rig!
My basic idea is to make a spine with the possibility of animating
in FK mode (Forward Kinematics) and in full elastic mode.
the reasoning behind "Forward Kinematics Mode" is in order to
animate driving the spine through rotating a number of controls
to reach the preferred pose using the three degree of freedom
(rot X, rot Y and rot Z).
In "Elastic Mode" we drive the spine with a chain of joints moved
with a curve, this allows the user to reach a great elastic
posture :)
In order to create this rig I created three copies of the same
spine joint chain:
-
-
-
two.

-
Rename your control properly (e.g. GA00_spine_0_CTL
) resize the proportion correctly (not too large nor too small).

the first one in will be animated in FK mode;


the second one in Elastic mode;
the last chain (already created) is driven by the first

Create a new file with only the spine chain and the geometry for
reference. each time we start a new rig module its preferable
to work on it separately. (Picture 04 _01)

-
Snap your controls to the joint: select your control switch
to move the tool mode and then hold key "v" and move your
control to the relative joint (e.g. GA00_spine_0_fk_JNT)

"FK Mode" chain


Basically for a "FK mode" chain we'll create a simple duplicate
of the base spine chain, with four circle controls parented
in translation and rotated at the joints. The last controls are
children of the previous control (e.g. GA00_spine_3_CTL is a
children of GA00_spine_2_CTL, GA00_spine_2_CTL is a children
of GA00_spine_1_CTL, GA00_spine_1_CTL is a children of GA00_
spine_0_CTL.).
In relation to this:

finally, freeze transformations.

Repeat this procedure for all four controls for your chain.
Now you have four controls named:
-
-
-
-

GA00_spine_0_CTL
GA00_spine_1_CTL
GA00_spine_2CTL
GA00_spine_3_CTL

If your geometry layer is turned on, switch to template mode and


keep this mode on for the duration of this spine rig creation.

At this point we need to create a hierarchy of the control in


order to make it work properly in FK mode.

-
Duplicate your base spine chain and rename your joints
with "fk" suffix (e.g. GA00_spine_0_JNT renamed to GA00_spine_
0_fk_JNT and so on...);

first, create a parent locator for each spine control :

-
Create a Nurbs primitive circle (or load your custom
spine control shape) (Picture 04 _02)
262

-
Create ---> Locator and rename with "_LOC" suffix (e.g.
GA00_spine_3_LOC)
-
Snap to the relative control spine and freeze
transformations (Modify ---> freeze transformations)
263

I have written a simple Mel Script to create a Locator and


parent to the selected node:

Picture 04 _03

excellent! "FK mode" is now complete. (Picture 04 _04)

Picture 04 _06

Picture 04 _04
//This script creates a locator parent of a selected object and is named
based on a selection
string $listobj[] = `ls -sl`;
// find selection name
string $name =`substring $listobj[0] 0 ((size($listobj[0]))-3)`;
//
spaceLocator -n ($name+"LOC");
// create locator
parentConstraint -n temp $listobj[0] ($name+"LOC");
//
snap to the ctl
delete temp;

//
parent $listobj[0] ($name+"LOC") ;
//
parent ctl to loc
select -cl;

// clear selection

Now:
-
Select GA00_spine_3_LOC than shift select GA00_spine_
2_LOC and press "p" to make the first selection child of the
second;
-
LCO ,

Lock and hide the transformation translation of the spine control


(we do not need that):
-
Select all the spine controls and in the channel box (on
the right) with the RMB press "Lock and Hide Selected"
(Picture 04 _03b)
Picture 04 _03b

"Elastic Mode" chain


My idea is to create a series of joints along a Nurbs curve and
then create controls to drive the CV points of that curve. This
system allows you to move the spine chain smoothly. In a second
step we'll create a series of locators driven by an offset curve
from the base curve to allow our spine to have an elastic rig
in order to use this as an up vector to twist correctly.

repeat this for GA00_spine_2_LOC and GA00_spine_1_


GA00_spine_1_LOC and GA00_spine_0_LCO;

To start this procedure, go to the side view and create a nurbs


curve with a CV point to correspond to the base joint chain:

GA00_spine_3_LOC is actually a "child" of the GA00_spine_2_LOC,


GA00_spine_2_LOC is a "child" of GA00_spine_1_LOC, GA00_spine_
1_LOC is a "child" of GA00_spine_0_LOC, and obviously the child
control .

-
Click on CV curve Tool ---> Options ---> Curve Degree 2,
Knot Spacing uniform;
-
Click four times, pointing to the origin of each four joints
chain. (Picture 04 _05) (Picture 04 _06)

-
Select the curve and hold RMB to go in to "Control
Vertex Selection Mode" (Picture 04 _07)

Picture 04 _07

We need to "parentConstraint" in order to allow the control


control the relative joint. (two objects are connected in translation
and rotation).
-
Select GA00_spine_0_CTL and shift select GA00_spine_0_
fk_JNT
--> Constraint ---> Parent ---> Option with Maintain Offset,
Translate All and Rotate All.

Picture 04 _05

-
Repeat for GA00_spine_1_CTL and GA00_spine_1_fk_JNT,
GA00_spine_2_CTL and GA00_spine_2_fk_JNT, GA00_spine_3_
CTL and GA00_spine_3_fk_JNT.

26 4

265

- Select one CV point at a time and hold "v" to move and snap
to the relative joint;


(e.g.
"GA00_M_spine_guide_0_LOC"
guide_0_UPV" )

-
Return to "Object Mode" and rename your curve properly
(e.g. GA00_spine_CRV);
-
Duplicate your curve (with CTRL+D) ;
-
Rename the duplicated curve with a "_upv" prefix (e.g.
GA00_spine_upv_CRV)
-
move "upv" curve +3 in translation of X axis and freeze
transformation. Remember that the offset curve needs to be
placed on the side of the main rotation angle (e.g. If your spine
mainly rotates on the "x" axis, the offset is in the negative "x"
position).

-
locator
-
locator

Select the two curves and press:

Edit Curves --->

Selection ---> Cluster Curve.

"GA00_M_spine_

Picture 04 _11
Picture 04 _10

ParentConstrain the locators and relative clusters (the


must drive the relative cluster).
ParentConstrain the "upv"locator with the relative "guide"
with "maintain offset" option enabled.

At this point we have two curves (base curve and offset up


vector curve ) each of which are driven by eight new locators
(and eight clusters). Now we are able to move the Cv points
directly by moving locators (Picture 04 _09)

Picture 04 _09

(Picture 04 _08)
Picture 04 _08

-
select the motion path node (rename it properly, e.g.
"GA00_M_spine_crv_0_MPT") , and thereafter, select U Value
attribute and with RMB click on "delete selected".
(Picture 04 _11)

The next step is to create a series of joints driven by the base


curve, in our case four joints. The new joint number is based
on the number of Gastons FK spine joints, with this base tutorial.
After this procedure, you can create how ever many joints you
require for every creature that you will be making.
-
Now that all the CV points of our curves are driven by
clusters, rename all the clusters properly by
using "CLS" as suffix and "_upv_CLS"(e.g. GA00_M_spine_0_CLS ).

-
Create a joint (remember the use of the Joint Creation
Tool in the past chapter) and name it correctly , (I never tired of
emphasising this) (e.g. "GA00_M_spine_crv_0_JNT" and so on...).

-
Create a locator for each cluster and place in the right
position using snap again (remember to rename locator with
suffix "_LOC" and "_upv_LOC").
Create ---> Locator.

-
Select the created joint and the base curve than press:
Animate ---> Motion Paths ---> Attach to Motion Path ---> Option,
deactivate "follow" option. (Picture 04 _10)

266

Usually the U value is already driven by time on a motion path,


but we need to override that in order to place our fixed value.
If you change that value you see that have a minimum value 0
to 1. This means that the curve is normalized and its length is 1.
If you enter zero, the joint moves to the beginning of the base
curve. If you enter 0.5 value, the joint is in the center and value
1 it's placed at the end. Understand this after you have created
and connected the four joints with the same procedure.
-
now change the U value of your joint's motion path to
fit the position of guide locators.
If you have 4 joints at the same distance you can set the four U
value to 0.333 otherwise you will have to find the right value...

267

For Example :

Picture 04 _12b

Picture 04 _13

Picture 04 _14

GA00_M_spine_crv_0_MPT.Uvalue = 0;
GA00_M_spine_crv_1_MPT.Uvalue = 0.33;
GA00_M_spine_crv_2_MPT.Uvalue = 0.66;
GA00_M_spine_crv_3_MPT.Uvalue = 0.99;
now create the upvector locator (Create ---> locator) . This is the
object that our joint will look at for the twisting motion.
this is the same procedure that we have used for the joint but
not using the "upv" locators and the "upv" curve. Remember the
name convention and put the same U value that you have set
for the joint's motion path.
now aim the rotation of every joint to point to the next joint
(the last joint has no aim) and use the upv locator for "World
Up Object".
-
Select GA00_M_spine_crv_0_JNT shift select GA00_M_
spine_crv_1_JNT;
-
Constraint ---> Aim ---> Options, "Maintain Offset" checked,
World Up Type "Object Up" then fill the World Up Object input
text with the name of the relative upv locator.
(Picture 04 _12)
Picture 04 _12

Perfect! This is an easy and direct approach to connect a joint


to a curve with a clear hierarchy and flexibility .
Create a Nurbs primitive circle (or load your custom spine
control shape which is different than the FK control), rename
and add "_elx" suffix (e.g. GA00_M_spine_0_elx_CTL);
-
Snap your control to the locator guide position then
freeze transformations.
ParentConstraint our brand new control to the locator (then
our control drives the locator):

Look at this image for an example


(Picture 04 _12b)

-
Select the control, shift select the locator and add parent
constraint.
-
Lock and Hide "rotations" transformation of your
controls.

In Maya it is impossible to see a single joint point rotation (I don't


know why) but we can see the rotation if we connect a cube
or another object with parentConstraint. (for simplicity I would
choose a simple cube). Remember to uncheck "primary visibility"
on the "Render Stats panel" and turn on "template" in the shape
attribute window.
Your joint now is connected properly, you can move and twist
base guide locator. the joint will move and twist like a real
spine and you can see all of the transformations with your
non-renderable and non-selectable reference object! But is not
finished yet...

Create a connection between the two spine rigs


We are now ready to connect these two systems to drive the
"main chain spine", with "FK Mode" and "Elastic Mode"

268

the tricky part is almost complete :) we are now going to create


a connection between these two systems.
as a start, I have chosen to to parent the elastic chain control
under the fk chain control (e.g. GA00_M_spine_0_elx_CTL
children of GA00_M_spine_3_CTL), but if you parentContraint the
transformation directly in translation and rotation , this becomes
too 'busy' and you are not able to freely move your controls.
To keep the controls clear of movement I created a group
parent with the suffix "_elx_GRP" (remember "_GRP" for group)
and I parentConstraint that group to the "fk" control.
In Maya:
-
Select GA00_M_spine_0_elx_CTL and press CTRL+G;
-
Go to Edit ---> Group ---> Option "Group under World"
and "Group Pivot Center" checked;
-
Rename the group with this name "GA00_M_spine_0_
elx_GRP";
-
Select GA00_M_spine_0_CTL and "shift select" GA00_M_
spine_0_CTL;
-
Press
Constraint ---> Parent ---> All translations and
rotations.
Do the same for the other controls.
269

Ok, now the main connection to drive your basic chain is as


follows:

Picture 04 _15

Connect the new "FktoElastic" attribute to the W0 weight attribute


of our constraint.
-
Open Window ---> General Editors ---> Connection
Editor
-
Select your elastic control and press "Reload Left"
-
Select your constraint and press "Reload Right"
-
Select now "FktoElastic" and "W0" attributes to made this
connection. (Picture 04 _17) (Picture 04 _18)

Our first controls are driven by two joints and by default the
weight of this parenting is 50%.

-
Select the first elastic control and press CTRL+a to open
the attributes panel;
-
Attributes ---> Add Attributes ---> Option name "FktoElastic",
type "Float" minimum value to 0 and maximum to 1, default value
to 0.
(Picture 04 _15) (Picture 04 _16)

Picture 04 _18

addAttr -ln ("FKtoElastic") -at double -min 0 -max 1 -dv 0 GA00_M_spine_


0_elx_CTL;
setAttr -e -keyable true GA00_M_spine_0_elx_CTL;

-
Select the first joint of the fk chain and shift select the
relative joint on the base chain (e.g. GA00_M_spine_0_fk_JNT
and GA00_M_spine_0_JNT);
-
press Constrain ---> Parent ---> Option, All translations
and rotations;
-
Select the first joint of elastic chain and shift select the
same joint on the base chain that you have selected before;
-
press Constrain ---> Parent ---> Option, All translations
and rotations.
-
correctly rename the constraint (e.g. GA00_M_spine_0_
JNT_PRC).

The connection is made!


But manually, this is boring and slow in animating this two
weight value (W0 and W1) each time and to solve this we need
to create a new custom attribute on the elastic control .
This new attribute will switch between the value 0 to 1 and
automatically drive the weight of our constraint.
I decided to create a single attribute for each control and
not an overall attribute because in this way you are able to
choose if you only want the last control on elastic mode, only
the second, or alternatively the second and the third...everything
you want...more flexibility.

in MEL you can do the following as well

Picture 04 _17

Picture 04 _16

or in Mel for example:


connectAttr -f GA00_M_spine_0_elx_CTL.FKtoElastic GA00_M_spine_0_JNT_PRC.
GA00_M_spine_crv_0_JNTW0;

what we need now is an expression that drives the weight of


the "W1" value of our constraint .
Open the Expression editor:
- Window ---> Animation Editors ---> Expression Editor.
(Picture 04 _19)

270

271

Picture 04 _19

Picture 04 _20

distance/GA00_M_spine_1_squash_DMNShape.distance) *2 )-1);
GA00_M_spine_2_JNT.scaleX = (((GA00_M_spine_2_squash_hold_DMNShape.
distance/GA00_M_spine_2_squash_DMNShape.distance) *2 )-1);
GA00_M_spine_2_JNT.scaleZ = (((GA00_M_spine_2_squash_hold_DMNShape.
distance/GA00_M_spine_2_squash_DMNShape.distance) *2 )-1);

In Maya for Linux the color convention is different than the


Windows version.

Some clean up

For example, with this expression when the value of the distance
is 3, both the value of "scaleX" and"scaleZ" are 1 otherwise
when the value of the distance is more than 3 the values of the
scale is proportionally less.
"GA00_M_spine_0_CTL" and
"GA00_M_spine_1_CTL"
complete, now repeat this process with:

is

now

"GA00_M_spine_1_CTL" and "GA00_M_spine_2_CTL";


"GA00_M_spine_2_CTL" and "GA00_M_spine_3_CTL";
The last step consists of creating a parent locator (with the same
pivot) of the first spine control "GA00_M_spine_0_CTL", then to
freeze the transformations and rename properly (e.g. "GA00_
M_spine_root_LOC")

Attributes colour on the box


(Picture 04 _21)
and insert this line:
GA00_M_spine_0_JNT_PRC.GA00_M_spine_0_fk_JNTW1 = 1-GA00_
M_spine_0_JNT_PRC.GA00_M_spine_crv_0_JNTW0;
Basically I create an expression when the value of "W0" is equal
to 0 the value of "W1" and when "W0" is 1, "W1" assume the value
of 0, this is what we want...
Repeat this procedure for all your base chain joints.
Set the value for each spine control of

"FktoElastic" to "1".

Squash and Stretch spine


An additional option is to drive the scale in X and Z transformations
of the base joint to simulate a squash and stretch spine.
The idea is to read the distance between the two controls and
to scale the joint that is included in the range based on that
value.
For Gaston spine:
- Create ---> Measure tools ---> Distance Tool;
(Picture 04 _20)

272

-
Properly Rename the three objects created (e.g. "GA00_
M_spine_0_squash_start_LOC",
"GA00_M_spine_0_squash_end_LOC", "GA00_M_spine_0_squash_
DMN");

Picture 04 _21

-
parentConstraint "GA00_M_spine_0_squash_start_LOC" to
"GA00_M_spine_0_CTL";

Create two groups called "GA00_M_spine_notrasf_GRP" and


GA00_M_spine_ROOT_GRP. Within these we will place our sections
of the spine rig in an orderly and tidy manner for any future
change or clear connection with any other module rig (such as
arm rig, leg rig and so on...)
Basically in the "notrasf" group we'll put every object that does
not need to be transformed into position because these are
already driven by another object or control.
Also in the "root" group we'll put all the controls that must be
connected to another module or become a parent collector of
another control from any other child module rig.
to complete the Gaston spine rig :
-
Select GA00_M_spine_0_CTL and shift select GA00_M_
spine_ROOT_GRP , press "p" to parent the controls under the
root group.
-
Parent under "notrasf_GRP" the spine curve ("CRV" suffix
based object) , spine curve joint ("crv_JNT" suffix based object)
, the locator and the upvector locator ("_UPV" and "_LOC" suffix
based object ), the clusters ("CLS" suffix based object), the box
reference object ("_REF" suffix), the fk joint ("fk_JNT" suffix based)
and for last the group containing the elastic controls ("_elx_GRP"
suffix based).
-
Hide all the clusters ("CLS" suffix), locators ("LOC" suffix),
upvector locators ("UPV" suffix), elastic and fk joint ("elx_JNT" and
"fk_JNT" suffix)

-
parentConstraint "GA00_M_spine_0_squash_end_LOC" to
"GA00_M_spine_1_CTL";
-
Repeat this procedure but this time you must rename
these objects to "GA00_M_spine_0_squash_hold_DMN", "GA00_
M_spine_0_squash_start_hold_LOC", "GA00_M_spine_0_squash_
end_LOC", snap to the relative joint but this time do not parent
to the controls.

you can automatically hide this entire object with the following
Mel line :
hide "*_LOC" "*_UPV" "*_CLS" "*_crv*_JNT" "*_fk*_JNT";
This process is really long and repetitive and a good idea is to
make a script that automatically completse the job for us :D...but
this is not a dream and is possible to do... (Picture 04 _22)

-
Select all these new objects and the parent them under
"notrasf" group.
Open the Expression Editor and add this line:
GA00_M_spine_0_JNT.scaleX = (((GA00_M_spine_0_squash_hold_DMNShape.
distance/GA00_M_spine_0_squash_DMNShape.distance) *2 )-1);
GA00_M_spine_0_JNT.scaleZ = (((GA00_M_spine_0_squash_hold_DMNShape.
distance/GA00_M_spine_0_squash_DMNShape.distance) *2 )-1);
GA00_M_spine_1_JNT.scaleX = (((GA00_M_spine_1_squash_hold_DMNShape.
distance/GA00_M_spine_1_squash_DMNShape.distance) *2 )-1);
GA00_M_spine_1_JNT.scaleZ = (((GA00_M_spine_1_squash_hold_DMNShape.

Every time you connect an attribute with another the color


displayed changes from white to:
-
Sky Blue for constraint based connection;
-
Violet for expression based connection;
-
Yellow for direct connection with another attribute;
-
Green if you connect an attribute with two different
aspects.
273

Picture 04 _22

//-----------------------// SPINE RIG procedure


//------------------------global float $jnt = 4;
float $aimaxis[] = <<0, 1, 0>>;
int $numctl = 4;
int $i;
float $offsetx = 0;
float $offsety = 0;
float $offsetz = 3;
group -n ($namechain+"_notrasf_GRP") -empty;
group -n ($namechain+"_ROOT_GRP") -empty;
// base spine duplication
select -r ($namechain+"_0_JNT") ;
duplicate -rr;
searchReplaceNames "_JNT" "_fk_JNT" "hierarchy";
searchReplaceNames "_JNT1" "_JNT" "hierarchy";
select -cl;

A similar Mel script to complete an automatic spine rig


This script automatically creates a chain made by four joints
with the same distance between the joints and creates the "FK
Mode" and "Elastic Mode" spine, then binds the basic chain joints.
This is a good example for studying some Mel Script.

// spine rig
for ($i=0; $i<$jnt; $i++)
{

spaceLocator -n ($namechain+"_guide_"+$i+"_LOC");

parentConstraint -n temp ($namechain+"_"+$i+"_JNT")
($namechain+"_guide_"+$i+"_LOC");

delete temp;

spaceLocator -n ($namechain+"_guide_"+$i+"_UPV");

parentConstraint -n temp ($namechain+"_guide_"+$i+"_LOC")
($namechain+"_guide_"+$i+"_UPV");

delete temp;

move -r -ls -wd $offsetx $offsety $offsetz;
}

Enjoy.

// AUTO SPINE RIG SCRIPT


//------------------------------------------------------------------------------string $namechain = "GA00_M_spine";
// Joints Creation
global float $jnt = 4;
// joints base creations
for ($i=0; $i<$jnt; $i++)
{
joint -n ($namechain+"_"+$i+"_JNT")-p 0 ($i*3) 0;
}
select -cl;

274

curve -n ($namechain+"_CRV") -d 2 -p 0 0 0 -p 1 1 1 -p 2 2 2 -p 3 3 3 -k
0 -k 0 -k 1 -k 2 -k 2;
rename curveShape1 ($namechain+"_CRVShape");
setAttr ($namechain+"_CRVShape.template") 1;
curve -n ($namechain+"_upv_CRV") -d 2 -p 0 0 0 -p 1 1 1 -p 2 2 2 -p 3 3
3 -k 0 -k 0 -k 1 -k 2 -k 2;
rename curveShape1 ($namechain+"_upv_CRVShape");
setAttr ($namechain+"_upv_CRVShape.template") 1;
parent ($namechain+"_upv_CRV")($namechain+"_notrasf_GRP") ;
parent ($namechain+"_CRV")($namechain+"_notrasf_GRP") ;
for ($i=0;$i<$jnt;$i++)
{

select -r ($namechain+"_CRV.cv"+"["+$i+"]") ;
newCluster " -n ($namechain+\"_CLS\") -relative -envelope 1";
rename ($namechain+"_CLSHandle") ($namechain+"_"+$i+"_CLS");

pointConstraint ($namechain+"_guide_"+$i+"_LOC") ($namechain+"_
"+$i+"_CLS");

select -r ($namechain+"_upv_CRV.cv"+"["+$i+"]") ;

newCluster " -n ($namechain+\"_upv_CLS\") -relative -envelope 1";

rename ($namechain+"_upv_CLSHandle") ($namechain+"_"+$i+"_upv_
CLS");

pointConstraint ($namechain+"_guide_"+$i+"_UPV") ($namechain+"_
"+$i+"_upv_CLS");

parentConstraint -mo -weight 1 ($namechain+"_guide_"+$i+"_LOC")
($namechain+"_guide_"+$i+"_UPV");
}

// controls creation
for ($i=0; $i<$jnt; $i++)

{

circle -n ($namechain+"_"+$i+"_CTL") -nr 0 1 0 -r .8 -d 3 -tol
0.01 -s 4 -ch 0;

parentConstraint -skipRotate x -skipRotate y -skipRotate z -n
temp ($namechain+"_guide_"+$i+"_LOC") ($namechain+"_"+$i+"_CTL") ;

delete temp;

parentConstraint ($namechain+"_"+$i+"_CTL") ($namechain+"_"+$i+"_
fk_JNT") ;

scaleConstraint ($namechain+"_"+$i+"_CTL") ($namechain+"_"+$i+"_
fk_JNT") ;
makeIdentity -apply true -t 1 -r 1 -s 0 -n 0 ($namechain+"_"+$i+"_
CTL");

setAttr ($namechain+"_"+$i+"_CTLShape.overrideEnabled") 1;

setAttr ($namechain+"_"+$i+"_CTLShape.overrideColor") 17;

setAttr -lock true -keyable false ($namechain+"_"+$i+"_CTL.tx");

setAttr -lock true -keyable false ($namechain+"_"+$i+"_CTL.ty");

setAttr -lock true -keyable false ($namechain+"_"+$i+"_CTL.tz");

}
// controls ELASTIX creation
for ($i=0; $i<$jnt; $i++)
{

circle -n ($namechain+"_"+$i+"_elx_CTL") -nr 0 0 1 -r .8 -d 3
-tol 0.01 -s 4 -ch 0;

parentConstraint -skipRotate x -skipRotate y -skipRotate z -n
temp ($namechain+"_guide_"+$i+"_LOC") ($namechain+"_"+$i+"_elx_CTL") ;

delete temp;

select ($namechain+"_"+$i+"_elx_CTL");

group -n ($namechain+"_"+$i+"_elx_GRP");

parentConstraint ($namechain+"_"+$i+"_elx_CTL") ($namechain+"_
guide_"+$i+"_LOC");

parentConstraint ($namechain+"_"+$i+"_CTL") ($namechain+"_"+$i+"_
elx_GRP") ;
makeIdentity -apply true -t 1 -r 1 -s 0 -n 0 ($namechain+"_"+$i+"_
elx_CTL");

setAttr ($namechain+"_"+$i+"_elx_CTLShape.overrideEnabled") 1;

setAttr ($namechain+"_"+$i+"_elx_CTLShape.overrideColor") 21;


rx");

ry");

rz");

setAttr -lock true -keyable false ($namechain+"_"+$i+"_elx_CTL.


setAttr -lock true -keyable false ($namechain+"_"+$i+"_elx_CTL.
setAttr -lock true -keyable false ($namechain+"_"+$i+"_elx_CTL.
}

$div = (1/($jnt-1));
select -cl;
for ($i=0; $i<$jnt; $i++)
{
joint -n ($namechain+"_crv_"+$i+"_JNT")-p 0 0 0;
setAttr ($namechain+"_crv_"+$i+"_JNT.radius") 2;
select ($namechain+"_crv_"+$i+"_JNT") ($namechain+"_CRV");
pathAnimation -n ($namechain+"_"+$i+"_MPT") -fractionMode true follow false ;
cutKey -cl -t ":" -f ":" -at "u" ($namechain+"_"+$i+"_MPT");
setAttr ($namechain+"_"+$i+"_MPT"+".uValue") ($i*$div);
polyCube -n ($namechain+"_"+$i+"_jnt_REF") -w 0.6 -h 1 -d 1 -sx 1
-sy 1 -sz 1 -ax 0 1 0 -tx 1 -ch 0;
setAttr ($namechain+"_"+$i+"_jnt_REFShape.template") 1;
setAttr ($namechain+"_"+$i+"_jnt_REFShape.primaryVisibility") 0;
parentConstraint ($namechain+"_crv_"+$i+"_JNT") ($namechain+"_
"+$i+"_jnt_REF");
connectAttr -f ($namechain+"_crv_"+$i+"_JNT.scale")($namechain+"_
"+$i+"_jnt_REF.scale");
select -cl;
spaceLocator -n ($namechain+"_"+$i+"_UPV");
scale 0.25 0.25 0.25;
select ($namechain+"_"+$i+"_UPV") ($namechain+"_upv_CRV");
pathAnimation -n ($namechain+"_"+$i+"_upv_MPT") -fractionMode true
-follow false ;
cutKey -cl -t ":" -f ":" -at "u" ($namechain+"_"+$i+"_upv_MPT");
setAttr ($namechain+"_"+$i+"_upv_MPT"+".uValue") ($i*$div);

parent ($namechain+"_crv_"+$i+"_JNT") ($namechain+"_notrasf_
GRP");
if ($i>0)
{
select -r ($namechain+"_crv_"+$i+"_JNT");
select -add ($namechain+"_crv_"+($i-1)+"_JNT") ;
aimConstraint -mo -weight 1 -aimVector 1 0 0 -upVector 0 1
0 -worldUpType "object" -worldUpObject ($namechain+"_"+$i+"_UPV");

}

// constraint creation

parentConstraint ($namechain+"_crv_"+$i+"_JNT")($namechain+"_
"+$i+"_JNT") ;

parentConstraint ($namechain+"_"+$i+"_fk_JNT") ($namechain+"_
"+$i+"_JNT") ;


// expressions and connections creation

addAttr -ln ("FKtoElastic") -at double -min 0 -max 1 -dv 0

275

($namechain+"_"+$i+"_elx_CTL");

setAttr -e -keyable true ($namechain+"_"+$i+"_elx_CTL.
FKtoElastic");

expression -s ($namechain+"_"+$i+"_JNT_parentConstraint1."+$namec
hain+"_"+$i+"_fk_JNTW1 \= 1-"+$namechain+"_"+$i+"_JNT_parentConstraint1."+
$namechain+"_crv_"+$i+"_JNTW0")

-o ($namechain+"_"+$i+"_JNT_parentConstraint1")

-ae 1 -uc all ;

connectAttr -f ($namechain+"_"+$i+"_elx_CTL.FKtoElastic")
($namechain+"_"+$i+"_JNT_parentConstraint1."+$namechain+"_crv_"+$i+"_
JNTW0");
select -cl;
}
// parenting
select ($namechain+"*_UPV") ($namechain+"*_CLS") ($namechain+"*_REF")
($namechain+"*0_fk_JNT") ($namechain+"_guide"+"*_LOC");
select -add ($namechain+"_notrasf_GRP") ;
parent;
hide ($namechain+"*_UPV") ($namechain+"*_CLS");
for ($i=$jnt;$i>1;$i--)
{
parent ($namechain+"_"+($i-1)+"_CTL") ($namechain+"_"+($i-2)+"_CTL");
}

select -r ($namechain+"_0_CTL");
select -add ($namechain+"_ROOT_GRP") ;
parent;
select -r ($namechain+"*_elx_GRP");
select -add ($namechain+"_ROOT_GRP") ;
parent;
hide "*_LOC" "*_UPV" "*_CLS" "*_crv*_JNT" "*_fk*_JNT";
select -cl;
// Squash spine
for ($i=0;$i<($jnt-1);$i++)
{
distanceDimension -sp 1 1 1 -ep 2 2 2 ;
rename distanceDimension1 ($namechain+"_"+$i+"_distance_DMN");
rename locator1 ($namechain+"_"+$i+"_squash_start_LOC");
rename locator2 ($namechain+"_"+$i+"_squash_end_LOC");
parentConstraint ($namechain+"_"+$i+"_elx_CTL")($namechain+"_"+$i+"_
squash_start_LOC");
parentConstraint ($namechain+"_"+($i+1)+"_elx_CTL")($namechain+"_"+$i+"_
squash_end_LOC");
expression -s ($namechain+"_"+$i+"_JNT.scaleX = (((1/"+$namechain+"_
"+$i+"_distance_DMNShape.distance) *2 )+1)") -o "" -ae 1 -uc all ;
expression -s ($namechain+"_"+$i+"_JNT.scaleZ = (((1/"+$namechain+"_

276

"+$i+"_distance_DMNShape.distance) *2 )+1)") -o "" -ae 1 -uc all ;


select -r ($namechain+"_"+$i+"_distance_DMN")($namechain+"_"+$i+"_squash_
start_LOC") ($namechain+"_"+$i+"_squash_end_LOC") ;
select -add GA00_M_spine_notrasf_GRP ;
parent;
}
//-----------------------END

05 _RIGGING PROCESS TAIL RIG

GA00_M_tail_1_squash_DMNShape.distance) *2 )-1);
GA00_M_tail_2_JNT.scaleX = (((GA00_M_tail_2_squash_hold_DMNShape.distance/
GA00_M_tail_2_squash_DMNShape.distance) *2 )-1);
GA00_M_tail_2_JNT.scaleZ = (((GA00_M_tail_2_squash_hold_DMNShape.distance/
GA00_M_tail_2_squash_DMNShape.distance) *2 )-1);

The rig of a tail is similar to that of a spine rig but sometimes


you need to create automatic animations of it...

To add dynamics, start with :

Basically the process is completely the same as that of the spine


rig but we need an additional dynamic chain to drive the main
one.

-
Duplicate the main base chain and rename it with the
suffix "_dyn_JNT"(e.g. "GA00_M_spine_0_dyn_JNT");
-
Select GA00_M_spine_CRV and press:
-
Hair ---> Make Selected Curves Dynamic
(Picture 05 _01)
Picture 05 _01

A little summary of the Spine Rig (same as Tail rig but without
dynamics) :
-
Create a duplicate of the main base chain renamed with
the prefix "_fk_JNT";
-

Make the controls to drive the "FK mode" chain;

-
Create a duplicate of the main base chain renamed with
the prefix "_elx_JNT";
-
Make the controls and build the curve to drive the
"Elastic mode" chain;
-
Make connections between the two chains ("FK mode"
and "Elastic Mode");
A similar expression can be used for the connections between
the two systems.
GA00_M_tail_0_JNT_pointConstraint1.GA00_M_tail_0_fk_JNTW2
tail_0_JNT_pointConstraint1.GA00_M_tail_0_elx_JNTW1;
GA00_M_tail_1_JNT_pointConstraint1.GA00_M_tail_1_fk_JNTW2
tail_1_JNT_pointConstraint1.GA00_M_tail_1_elx_JNTW1;
GA00_M_tail_2_JNT_pointConstraint1.GA00_M_tail_2_fk_JNTW0
tail_2_JNT_pointConstraint1.GA00_M_tail_2_elx_JNTW1;
GA00_M_tail_3_JNT_pointConstraint1.GA00_M_tail_3_fk_JNTW0
tail_3_JNT_pointConstraint1.GA00_M_tail_3_elx_JNTW1;

= 1- GA00_M_
= 1- GA00_M_
= 1- GA00_M_
= 1- GA00_M_

Make expressions for a Squash and Stretch spine;

These are the expressions that I use for the Squash and
Stretch;
GA00_M_tail_0_JNT.scaleX = (((GA00_M_tail_0_squash_hold_DMNShape.distance/
GA00_M_tail_0_squash_DMNShape.distance) *2 )-1);
GA00_M_tail_0_JNT.scaleZ = (((GA00_M_tail_0_squash_hold_DMNShape.distance/
GA00_M_tail_0_squash_DMNShape.distance) *2 )-1);
GA00_M_tail_1_JNT.scaleX = (((GA00_M_tail_1_squash_hold_DMNShape.distance/
GA00_M_tail_1_squash_DMNShape.distance) *2 )-1);
GA00_M_tail_1_JNT.scaleZ = (((GA00_M_tail_1_squash_hold_DMNShape.distance/

This tool creates two new nodes: "hairSystem" node and "follicle"
node and one additional curve that is directly connected to the
"elastic mode" curve (e.g. "GA00_M_spine_CRV").
-
rename the new curve properly with a "dyn_CRV" suffix
(e.g "GA00_M_spine_dyn_CRV");
-
rename the hairSystem node properly with "_HIR" suffix
(e.g. "GA00_M_spine_HIR");
-
change some settings on the "follicle node" Shape node:
Point Lock ---> Base.
If you want you can override the Dynamics stiffness from here
and put an appropriate value (e.g. 0.5 or 0.7)
27 7

(Picture 05 _02)

Picture 05 _04

Picture 05 _05

Picture 05 _06

Picture 05 _02

-
Select the first "dyn" joint and the last (e.g. "GA00_M_
spine_0_dyn_JNT" and "GA00_M_spine_3_dyn_JNT") and for the
third choice select the dynamic curve (e.g. GA00_M_spine_dyn_
CRV).
-
Now create an Ik Spline for the "dyn_JNT" joints chain :
Skeleton ---> IK Spline Handle Tool ---> Option, uncheck Auto
Create Curve. (Picture 05 _03) (Picture 05 _04)

Picture 05 _03

Now your joints chain labeled "dyn_JNT" is driven by the


dynamics curve.
ParentConstrain now the new dynamics ("_dyn_JNT") chain as
with the "FK mode or "Elastic Mode" to the main joint chain
procedure.
-
Select the first "_dyn_JNT" and "_JNT" then Constrain --->
Parent.
-
Create an attribute on the first "elastic ctrl" called
"dynamic" and connect it with the connection editor to the
relative "W2" weight of the parentConstraint of the first main
"_JNT" joint.
Do the same for the other elastic control.
(Picture 05 _05)

278

-
Select all new objects ;
-
Dyn joint chain , ikhandle, dyn curve and the hair node
and parent them under "notrasf" group;
-
For our last step create a parent locator for the first
tail control ("GA00_M_tail_0_CTL") and rename it correctly (e.g.
"GA00_M_tail_root_LOC");
-
Create a new control using a circle shape. Snap it's
position then freeze transformations and rename it "GA00_M_
root_CTL";
-
LOC";

Parent

"GA00_M_root_CTL"

under

"GA00_M_tail_root_

-
parentContrain now "GA00_M_tail_0_CTL" to the "GA00_
M_root_CTL".
You are able with these attributes to drive the main chain in
3 different modes: FK , Elastic and Dynamic and obviously you
can blend between these.
(Picture 05 _06)

279

06 _RIGGING PROCESS LEG RIG

In this section we are going to prepare an animation system for


the legs (for now without a foot, we will add that later).
Picture 06 _01

and an "IK Mode" (Inverse Kinematics) ;

Picture 06 _02

Picture 06 _04

We already know how to create an "elastic mode" and an "FK


Mode" but repeating the main step of the procedure for the leg
is not a bad idea :)
If you have added some useful scripts to clean the controls,
freeze and delete history in your custom shelf now you can
speed up your job.

Squash and Stretch spine


-
Remember to create a curve that matches the number
of joints you have, if you have four joints you will need to
have four control points and so on...
-
Click on the "CV curve Tool" ---> Options ---> Curve
Degree 2, Knot Spacing uniform;
-
Click four times pointing to the origin of every four
joints chain.
-

RMB to go to "Control vertex" edit mode

Snap your CV to the relative joint (hold "v" );

If you have some problem when you try to select the CV


points turn off the priority selection for the joint by clicking on
the icon on the main toolbar. (Picture 06 _02) (Picture 06 _03)
Picture 06 _03

- duplicate the main curve to create "offset upvector" curve.


-
Clusterize your two curves with: Edit Curves ---> Selection
---> Cluster Curve. (Picture 06 _04)

The method used for this rig is similar to the other modules rig
that we have already done for the spine and the tail, but in this
procedure we create an additional system to drive our leg joint
chain : with an IK handle mode.
What we need to do to drive our leg chain?
-
-
280

an "Elastic Mode" (our chain driven with a curve);


an "FK Mode" (Forward Kinematics);

-
Create a locator for each cluster and place it correctly
using "snap" again
-
Directly connect the locators and relative clusters using the
connections editor (the locator must drive the relative cluster).
-
ParentConstrain the "offset" locator with the relative
"guide" locator with the "maintain offset" option enabled.
-
Create a joint for each base joint chain
-
Orient the joint with the same axes to that of the base
joint chain
-
Connect the joint to the curve using motionPath, delete
the default U Value and set it to match the position of the
relative base joint
-
Repeat the "motion path" process using a new locator
"upv" for each "on curve" joint on the offset curve.
(Picture 06 _05)

281

Picture 06 _05

A useful little script called "snap to children" is good to automatically


snap an object to another and also make the snapped object
become the parent of the object used to snap. This is really
useful for a repetitive operation.

it is very similar. (Picture 06 _06)


Picture 06 _06

leg control shape), name it correctly and snap it to the knee


joint
-
Create a Nurbs primitive circle (or load your custom "FK"
leg control shape), name it correctly and snap it to the last joint
(foot of the leg)

//---------------// Maya Mel Script : snap to the childer


// select the "wannabe parent" object and the children snap to object
global proc snap_to_childen ()

-
Create a parent locator for each control or use the
"parent_loc" script to speed up the process.
-
Create a hierarchy from the last FK LOC to the first (e.g.
GA00_R_foot_fk_LOC children of GA00_R_knee_fk_LOC and also
GA00_R_knee_fk_LOC children of GA00_R_ankle_fk_LOC );

{
string $list[] = `ls -sl -fl`;
/
/
create a list of object
parentConstraint -n temp $list[1] $list[0];
/
/
snap to the children
delete temp;
//
makeIdentity -apply true -t 1 -r 1 -s 1 -n 0 $list[0];
//
freeze
transformation
parentConstraint $list[0] $list[1];
/
/
parentConstraint
select -cl;
//clear selection
}
// END
//----------------

-
ParentConstrain the fk controls and the fk joints (the
controls drive the bones) (Picture 06 _07) (Picture 06 _08)

Picture 06 _07

(It may be an idea to add this little useful utility to your custom
TD shelf)

Keep the knee in the middle


Sometimes it is useful to keep the knee control in the middle of
the first and the last controls this enables the animator to avoid
having to constantly animate the knee.
To solve this little issue we need to add a parent locator (you
can use your automatic script "parent_loc" to create that)

Create an aim constraint to orient every joint to the next one


using the "upv" vector for the second orient axis :
-
Select the first "crv" joint (e.g. GA00_R_leg_crv_0_JNT)
shift select the second (e.g. GA00_R_leg_crv_1_JNT);
-
Constraint ---> Aim ---> Options, "Maintain Offset" checked,
World Up Type "Object Up" then fill the World Up Object input
text with the name of the relative upv locator (e.g GA00_R_leg_
0_loc_UPV).
-
Create a control to drive your main guide locator
on the first curve. Remember to delete history and freeze
transformations before parenting . (e.g GA00_R_leg_elx_0_CTL)
282

-
select the knee control
-
create a parent locator
-
parentConstraint the new locator maintaining the offset
to the first control
-
parentConstraint the new locator maintaining the offset
to the last control
Now your control will have the same proportional distance
between the two controls if those controls are then translated.
At the end:
-
Naming convention is obviously fundamental.
-
Clean the channel to get rid of unuseful transformations
(keep the rotation attribute for the last "elx" control)
-
For more in depth instructions use the spine procedure,

Create an "FK Mode" for the leg


Creating an "FK Mode" for the leg is completely the same as the
procedure used for the spine :
-
Duplicate your base spine chain and rename your joints
with "fk" suffix (e.g. GA00_R_leg_0_JNT renamed to GA00_R_
leg_0_fk_JNT and so on...);
-
Orient the joint with the same axes as the base joint
chain.
-
Create a Nurbs primitive circle (or load your custom "FK"
leg control shape), name it correctly and snap it to the first joint
(base of the leg)
-

Create a Nurbs primitive circle (or load your custom "FK"


283

Picture 06 _08

Picture 06 _09

Picture 06 _11

Picture 06 _12

- Press "insert". Now press "v" to snap the effector node to the
last joint (Picture 06 _13)
Picture 06 _13

A new method to move our leg : "IK Mode"


"IK Mode" for a leg is used to keep the foot grounded. With
this rigging system you can directly move the foot and the leg
automatically follow. In addition, we create a control to will
decide the direction of the knee. This system is the opposite of
the "FK Mode" because when we use that to decide the position
of the foot you have to rotate all the leg controls individually
both of these methods are useful.

Picture 06 _10

Start with :
-
Duplicate the main chain and rename it properly with
"_IK" suffix (e.g. GA00_L_femur_ik_JNT, GA00_L_tibia_a_ik_JNT),
remember to keep the orient axis to equal that of the original
joint chain.
-
Create an IK handle node using IK Handle Tool: Skeleton
---> IK Handle Tool ---> Options,
Current Solver "ikRPsolver",
"Autopriority" checked.
-
Click with the LMB on the first "IK" labeled joint and
select the last joint minus one to create the handle (remember
to rename it properly with the suffix "_IKH"). (Picture 06 _09)
(Picture 06 _10) (Picture 06 _11)

28 4

This is a little trick to leave the rotation of the last joint free
because we need to use that rotation to solve "the candy effect"
issue in the binding procedure for this character.
.
-
Open the Outliner (I tend to have this on the left side of
my viewport) and select the effector node that is the children of
the first joint used for the IK handle.
(Picture 06 _12)

285

Now return to the "move tool" option (press


with the creation of the IK handle control:

"q") and proceed

-
Create a locator to drive the IK handle. Snap it to the
last joint used for the IK handle, rename it correctly (e.g. "GA00_
leg_ik_LOC") and freeze transformations.
-
Parent the IK handle under the locator.

-
Create a parent locator for the pole vector control and
pointContraint (constraint the parent locator only in translation
with the ik handle loc ) maintaining offset.
(Picture 06 _14)
Picture 06 _14

GA00_L_tibia_b_ik_JNT.scaleY = 1 * (1/ GA00_L_tibia_b_ik_JNT.scaleZ);

-
Create an attribute on "GA00_L_leg_ik_ikn_LOC" called
"leg_scale" (with a default value of "1");
-
Connect this new attribute to every "ScaleZ" attribute (e.g
"GA00_L_leg_ik_ikn_LOC.leg_scale" and "GA00_L_femur_ik_JNT.
scaleZ", etc...)

-
Create a locator to drive the base joint (for future leg
module connections). Snap the locator to the first joint used for
the ik handle, and rename it properly (e.g. "GA00_leg_base_ik_
LOC"). Freeze transformations again .
-
ParentConstrain the first joint to that locator.

Connections between the three leg rig


Picture 06 _16

The locators control the position of our leg(foot).

Pole Vector

"GA00_L_femur_JNT"

and

"GA00_L_

"GA00_L_femur_JNT"

and

"GA00_L_

"GA00_L_femur_JNT"

and

"GA00_L_

Do the same for the other joint of your base chain.


Create a locator called for example "GA00_L_leg_root_LOC",
this object will be uses to collect and drive all the weight of
the constraint switch between the "IK" "FK" and "Elastic" rigging
modes. You can also use a portion of those rigs to change
smoothly alter the influence weighting. Remember to snap this
locator to the base of the first joint of the chain and freeze the
transformations.
Select the control locator and press CTRL+a to open the attributes
panel;
-
Attributes ---> Add Attributes ---> Option name "IK", type
"Float" minimum value to 0 and maximum to 1, default value to
0.
-
Attributes ---> Add Attributes ---> Option name "FK", type
"Float" minimum value to 0 and maximum to 1, default value to
0.
-
Attributes ---> Add Attributes ---> Option name "Elastic",
type "Float" minimum value to 0 and maximum to 1, default value
to 0.
(Picture 06 _17)

The next step is to create a control object to allow the animator


to orient the position, in "IK Mode" ,of the knee .
-
Create or import a control. Snap it to the knee then
move it in the "Z" axis enough to create a 45 degree angle
between the base of the IK handle and the position of the
control object (pole vector) .
-
Rename it properly and freeze transformations.
-
Select the new control, shift select the Ik handle and in
the menu:
-

-
parentConstraint
femur_elx_JNT";
-
parentConstraint
femur_fk_JNT;
-
parentConstraint
femur_ik_JNT;

Constraint ---> Pole Vector; (Picture 06 _15)

Picture 06 _17

Picture 06 _15

The pole vector control now follows the foot locator in translation
and not in rotation. This allows the animator to maintain control
of the character and knee joint. We have now completed
the IK Mode , ready for the next step: connecting the different
rigging systems to the base leg chain.

"Ik mode" leg squash and stretch


Put this line in the animation expression editor to create a
squash and stretch effect :
GA00_L_femur_ik_JNT.scaleX = 1 * (1/ GA00_L_femur_ik_JNT.scaleZ);
GA00_L_femur_ik_JNT.scaleY = 1 * (1/ GA00_L_femur_ik_JNT.scaleZ);
GA00_L_tibia_a_ik_JNT.scaleX = 1 * (1/ GA00_L_tibia_a_ik_JNT.scaleZ);
GA00_L_tibia_a_ik_JNT.scaleY = 1 * (1/ GA00_L_tibia_a_ik_JNT.scaleZ);

We have three different rigging systems to connect to the our


leg joint chain :
-
-
-

an "Elastic Mode" rig;


an "FK Mode" rig;
an "IK Mode" rig;

Remember that in the picture the different rig are displayed in


different position for clarity but the creation must be in the same
position of the main leg chain!
The action to connect this is similar to the process that we used
for the spine rig with the addition of a small device that allows
us to switch effectively between modes.
First parentConstraint (without maintaining offset ) the first joint
to every first joint of the other rig systems:

Next use the connection editor window to connect the value


of "IK" to all the the weight value of the related parentConstraint
on our base joint chain.
For example:

GA00_L_tibia_b_ik_JNT.scaleX = 1 * (1/ GA00_L_tibia_b_ik_JNT.scaleZ);

286

287

-
Connect "GA00_L_leg_root_LOC.ik" to "GA00_L_femur_
JNT1.W0"
-
Connect "GA00_L_leg_root_LOC.fk" to "GA00_L_femur_
JNT.W1"
-
Connect "GA00_L_leg_root_LOC.elastic" to "GA00_L_
femur_JNT.W2" (Picture 06 _18)

Picture 06 _19

Picture 06 _20

Picture 06 _24b

Picture 06 _18

Repeat the same procedure for each parentConstraint node of


your base joint chain.
-
Connect the "IK" chain joint scale value to the main leg
joint chain scale value
-
Connect the value of every "IK" scale constraint of the
main leg joint chain to the "IK" value on "GA00_L_leg_root_
LOC"
Well done! Now we can switch between the rigging system but
unfortunately it is not finished yet.

Cleanup and Order

-
Parent under "notrasf_GRP" (not parent constrain)
-
"fk_JNT" chain hierarchy
-
"_JNT" chain hierarchy
-
"elx_JNT" chain hierarchy
-
the two curves used in elastic rig mode
-
all the "_CLS" clusters
-
all the locator and the locator "offset" and "_UPV"
drive the two curves
-
GA00_L_knee_ik_LOC
-
all the distanceDimension and relative locator
- Parent under "root_GRP"
-
GA00_L_leg_ik_ikn_GRP
-
GA00_L_leg_root_LOC

that

Finally in the Outliner Window you can see a list of hierarchy


similar to the following example:
(Picture 06 _20)

We will now parent and group several of the objects from our
three systems in order to create an ordered node hierarchy.
-
Group all the "_elx_CTL" rename the new group with this
name "GA00_L_rig_elx_GRP"
-
Parent "GA00_L_rig_elx_GRP" under "GA00_L_leg_root_
LOC";
-
Parent under "GA00_L_leg_root_LOC" the locator called
"GA00_L_femur_ik_LOC";

At the end hide "_fk_JNT" , "_ik_JNT" and "_elx_JNT" , and all


the locators shapes excluding "GA00_L_leg_root_LOC".

We still need to make some alterations to enable us to incorporate


IK mode.

From experience, animators find it tedious to manually switch


modes during the shot. They tend to decide their rig system at
the beginning.

-
Create a parent group for "GA00_L_leg_ik_ikn_LOC"
name it corractly (e.g "GA00_L_leg_ik_ikn_GRP").
-
ParentConstraint that group ("GA00_L_leg_ik_ikn_GRP")
to "GA00_L_leg_root_LOC"
-
Connect using the connection editor "GA00_L_leg_ik_
ikn_LOC.ik" tp the "W0" of the previous parentConstraint.
(Picture 06 _19)

-
Create or import a control shape for the "rigging system
driver", for example I often use an handle shaped control.
-
Rename it to "GA00_L_leg_root_CTL"
-
Select all the transformation attributes then RMB, select
"Lock and Hide Selected"
(Picture 06 _24b)

288

An Additional control between IK, FK and Elastic systems

289

-
Snap this control to the position of the first joint of the
leg and parent under "GA00_L_leg_root_LOC". The value of the
transformations for this control do not matter because it is used
only for visual reference and to switch between rig systems. It
will not used to move or rotate anything. (Picture 06 _24)

Picture 06 _25

-
-
-

"IK";
"FK";
"Elastic";

(Picture 06 _25)

290

is

fundamental

to

- Select the new control ("GA00_L_leg_root_CTL") and click and


hold RMB and press "Set Driven Key..." to open the window.
(Picture 06 _26)

Picture 06 _24

-
Create an "Enum" type attribute called "IK_FK_Elastic"
and name the enum name with :

Remember that the Online Maya Help


understanding how this program works.

-
Select the driver attribute ("IK_FK_Elastic") and press "Load
Driver";
-
Select the driven attributes ("IK","FK","Elastic") and press
"Load Driven"; (Picture 06 _27)
Picture 06 _27

Picture 06 _26

Lets use driven keys to drive our rigging systems.


From Maya Online Help:

We are ready to create the Driven keys.

"Maya has special driven keys that link one attribute value
to another. In regular animation keys, an attribute has values
keyed to times in the Time Slider. For a driven key, an attribute
has values keyed to the value of a driving attribute. A change
in a driver attribute alters the value of the driven attribute. For
instance, you can set driven keys to make a door open when
a person walks in front of the door. An attribute can be driven
by multiple attributes. For instance, you can make a muscle
bulge when an elbow rotates. You can make the muscle bulge
even more when the wrist rotates. "

-
Select "IK" option on "GA00_L_leg_root_CTL.IK_FK_Elastic"
attribute (keep the Driven Key Window open);
-

Change the value of :

-
-
-

"GA00_L_leg_root_LOC.IK" to 1;
"GA00_L_leg_root_LOC.FK" to 0;
"GA00_L_leg_root_LOC.Elastic" to 0;

(Picture 06 _28) (Picture 06 _29)

291

Picture 06 _28

Picture 06 _21

Picture 06 _22

07 _RIGGING PROCESS FOOT RIG

Picture 07 _01

Duplicating rig to the opposite side

Picture 06 _29

Sometimes characters have more than one leg (hehe) We then


have to duplicate our rigging system to the other side there are
some different method to do that:
-
Repeat the entire process for the right side;
-
Create a script that with an input leg joint chain can
procedurally repeat procedurally the rigging;
-
Brute force duplicate :)
The first choice is slow but is fine to allow you to completely
understand the process. You can then create your own script
like the spine rig in the past chapter.
In this case we are lucky because the chain of the leg were
placed facing forward therefore if we create an identical copy
place in the right position and rename properly with "Search
Replace" the job is done (choice three) :)

Press "Key" in the driven Key Window.

Great! The first driven key is now ready. Repeat the same
procedure for FK and Elastic.
Done :) Now we can control our three rigging systems using
only one animatable attribute.
Note

If you want you can drive the visibility of the different controls
for clarity in your scene and make easier for the animators.
Simply connect the value of "IK" in our "GA00_L_leg_root_LOC"
to the main visibility or shape visibility attribute of each control
("GA00_L_knee_ik_CTL", GA00_L_leg_ik_ikn_LOC);
Do the same for the other rig system :) (Picture 06 _21)
292

-Create a single file with the leg rig (only the 2 groups: "no_
trasf_GRP" and "root_GRP"), import another copy and rename
it with "_R_" named.
File ---> Import;
Modify ---> Search Replace.
(Picture 06 _22) (Picture 06 _23)

In the rigging process the foot rig is important because as well


as a spine our character may need to walk, run and jump.
The spectator needs to feel the weight of the character during
motion for it to be believable.
Picture 06 _23

The foot rig must be flexible and needs to allow the animator to
move different pivot points in order to achieve a good pose.
The foot receives the forward animation from the leg and drives
the movement of the leg in inverse kinematics ("IK Mode").
Reverse Foot technique

I usually use the reverse foot technique for his part of the rig.
The idea is to create an additional joint chain to drive the base
foot chain. This time, the new joint chain is complete different in
hierarchy from the first and is not a duplicate like the spine or
leg rig.
Start by connecting the toe joint to the ball joint and the ball
joint to the ankle :
For our Gaston character:
-
Select "GA00_L_foot_pinkie_a_JNT" shift select "GA00_L_
toe_JNT", press "p" to parent;
-
Select "GA00_L_foot_Index_a_JNT" shift select "GA00_L_
toe_JNT", press "p";
-
Select "GA00_L_foot_Thumb_a_JNT" shift select "GA00_L_
toe_JNT", press "p";
293

-
Select "GA00_L_toe_JNT" shift select "GA00_L_ankle_JNT",
press "p".

Picture 07 _03

Un-hide the RF joint chain


-
and

Your foot joints are now connected to each other.


(Picture 07 _02)

Picture 07 _06

Parent "GA00_L_ball_IKH" under "GA00_L_ball_rf_JNT"


"GA00_L_ball_IKH" under "GA00_L_ball_rf_JNT";

Perfect! Now the Reverse foot chain ("RF") will correctly drive
the base foot chain :), it is difficult and tedious directly animate
the joint we therefore need to create a control icon to drive
the foot rig.

Picture 07 _02

-
Create or import a new control for the foot. Freeze it
to the foot joint position and rename it. (e.g. "GA00_L_foot_CTL"), I
usually use a foot shaped nurbs curve.
The pivot of the foot control must be in the middle of the foot..
(Picture 07 _05)
Picture 07 _05

Next we will create a couple of IK handles: one between the


ankle joint and ball joints, and the second between ball and toe
joints. Creating an Ikhandle between two joints is a little trick
that allow us to drive the joint without disconnecting from the
joint chain.

Now create the "reverse foot" joint chain using the joint creation
tool for our Gaston character:
-
Skeleton ---> Joint Tool (use the same placement options
was used in previous chapters);
-
Click on the heel of the foot (use the figure to aid in
understanding the joint position) ;
-
Click for a second time directly opposite our first joint (in
the approximate location of the tip of our character's longest
toe);
-
Create the next joint in the same location as our ball
joint (created earlier);
-
Our final joint must be placed in the same position as the
ankle joint. This position is very important.
Remember to rename the new joint chain correctly (e.g. "GA00_
L_heel_rf_JNT", "GA00_L_ball_rf_JNT", "GA00_L_ankle_rf_JNT").
- Temporarily hide the joint chain (select the RF joint chain and
press "CTRL+H") (Picture 07 _03)

Use the IK handle tool:



Skeleton ---> IK Handle Tool;
-
Select the ankle joint and the ball joint, rename them
properly (e.g. "GA00_L_ankle_IKH");
-
Using the same tool select ball and toe joints. Rename the
handle properly. (e.g. "GA00_L_ball_IKH"); (Picture 07 _04)

Picture 07 _04

-
Parent the "GA00_L_rf_heel_JNT" under the control, the
main joint of the reverse foot system. This control fully drives
translations and rotations.
-
-
-
-
-

Add now this attributes (type float):


"ankle_rot";
"ball_swing";
"ball_rot" ;
"heel_rot";

Click with RMB on the attribute and press Connection Editor.


(Picture 07 _06)

-
Directly connect (using connection editor window) the
"ankle_rot" attribute to "GA00_L_rf_ankle_JNT.rotateX";
-
Now connect "ball_swing" with "GA00_L_rf_ball_JNT.
rotateY";
-
"ball_rot" with "GA00_L_rf_ball_JNT.rotateX";
-
"heel_rot" with "GA00_L_rf_heel_JNT.rotateX".
-
"heel_swing" with "GA00_L_rf_heel_JNT.rotateY".
Now we will tackle the toes:

294

295

-
Create a new shape for the toe control, e.g. A circle.
-
Rename it as "GA00_L_toe_CTL";
-
Delete the construction history and place the control
inside the shape of the foot and set the pivot to correspond to
the joint that collect all the toes (e.g. "GA00_L_ball_JNT") ;
-
create a parent locator for
"GA00_L_toe_LOC"

"GA00_L_toe_CTL" called

-
parentConstrain the locator translations to the translations
of GA00_L_ball_JNT, and move this control under "notraf_
GRP";

Now add the toes control. Every toe joint will be driven in
rotation and spread attributes.
-
-
-
-

Add 6 "float" type attributes to the


"Thumb_rot" and "Thumb_spread";
"Index_rot" and "Index_spread";
"Pinkie_rot" and "Pinkie_spread";

Picture 07 _09

toe control:

-f GA00_L_toe_CTL.pinkie_rot GA00_L_foot_pinkie_a_JNT.rotateX;
-f GA00_L_toe_CTL.pinkie_rot GA00_L_foot_pinkie_b_JNT.rotateX;
-f GA00_L_toe_CTL.pinkie_rot GA00_L_foot_pinkie_c_JNT.rotateX;
-f GA00_L_toe_CTL.pinkie_rot GA00_L_foot_pinkie_d_JNT.rotateX;
-f GA00_L_toe_CTL.pinkie_spread GA00_L_foot_pinkie_a_JNT.

Squash and stretch for toes

(Picture 07 _08)

Add this line in the Animation expression editor :

Picture 07 _08

GA00_L_foot_index_a_JNT.scaleX
GA00_L_foot_index_a_JNT.scaleY
GA00_L_foot_index_b_JNT.scaleX
GA00_L_foot_index_b_JNT.scaleY
GA00_L_foot_index_c_JNT.scaleX
GA00_L_foot_index_c_JNT.scaleY

-
Select the translations in the attribute editor then lock
and hide using RMB ---> Lock and Hide. (Picture 07 _07)
Picture 07 _07

- Connect "GA00_L_toe_CTL.thumb_rot" to "GA00_L_foot_thumb_


a_JNT.rotateX";
- Connect "GA00_L_toe_CTL.thumb_rot" to "GA00_L_foot_thumb_
b_JNT.rotateX";
- Connect "GA00_L_toe_CTL.thumb_rot" to "GA00_L_foot_thumb_
c_JNT.rotateX";
- Connect "GA00_L_toe_CTL.thumb_rot" to "GA00_L_foot_thumb_
d_JNT.rotateX";
-
Connect "GA00_L_toe_CTL.thumb_spread" to "GA00_L_
foot_thumb_a_JNT.rotateY";
Repeat the same procedure for the other toes.
(Picture 07 _09)
In Mel Script:
//
connectAttr
connectAttr
connectAttr
connectAttr
connectAttr
rotateY;
connectAttr
connectAttr
connectAttr
connectAttr
connectAttr
rotateY;

296

connectAttr
connectAttr
connectAttr
connectAttr
connectAttr
rotateY;
//

-f
-f
-f
-f

-f
-f
-f
-f

GA00_L_toe_CTL.thumb_rot GA00_L_foot_thumb_a_JNT.rotateX;
GA00_L_toe_CTL.thumb_rot GA00_L_foot_thumb_b_JNT.rotateX;
GA00_L_toe_CTL.thumb_rot GA00_L_foot_thumb_c_JNT.rotateX;
GA00_L_toe_CTL.thumb_rot GA00_L_foot_thumb_d_JNT.rotateX;
-f
GA00_L_toe_CTL.thumb_spread
GA00_L_foot_thumb_a_JNT.

GA00_L_toe_CTL.index_rot GA00_L_foot_index_a_JNT.rotateX;
GA00_L_toe_CTL.index_rot GA00_L_foot_index_b_JNT.rotateX;
GA00_L_toe_CTL.index_rot GA00_L_foot_index_c_JNT.rotateX;
GA00_L_toe_CTL.index_rot GA00_L_foot_index_d_JNT.rotateX;
-f
GA00_L_toe_CTL.index_spread
GA00_L_foot_index_a_JNT.

=
=
=
=
=
=

1
1
1
1
1
1

*
*
*
*
*
*

(1/
(1/
(1/
(1/
(1/
(1/

GA00_L_foot_index_a_JNT.scaleZ);
GA00_L_foot_index_a_JNT.scaleZ);
GA00_L_foot_index_b_JNT.scaleZ);
GA00_L_foot_index_b_JNT.scaleZ);
GA00_L_foot_index_c_JNT.scaleZ);
GA00_L_foot_index_c_JNT.scaleZ);

GA00_L_foot_pinkie_a_JNT.scaleX
scaleZ);
GA00_L_foot_pinkie_a_JNT.scaleY
scaleZ);
GA00_L_foot_pinkie_b_JNT.scaleX
scaleZ);
GA00_L_foot_pinkie_b_JNT.scaleY
scaleZ);
GA00_L_foot_pinkie_c_JNT.scaleX
scaleZ);
GA00_L_foot_pinkie_c_JNT.scaleY
scaleZ);

(1/

GA00_L_foot_pinkie_a_JNT.

(1/

GA00_L_foot_pinkie_a_JNT.

(1/

GA00_L_foot_pinkie_b_JNT.

(1/

GA00_L_foot_pinkie_b_JNT.

(1/

GA00_L_foot_pinkie_c_JNT.

(1/

GA00_L_foot_pinkie_c_JNT.

GA00_L_foot_thumb_a_JNT.scaleX
GA00_L_foot_thumb_a_JNT.scaleY
GA00_L_foot_thumb_b_JNT.scaleX
GA00_L_foot_thumb_b_JNT.scaleY
GA00_L_foot_thumb_c_JNT.scaleX
GA00_L_foot_thumb_c_JNT.scaleY

1
1
1
1
1
1

=
=
=
=
=
=

*
*
*
*
*
*

(1/
(1/
(1/
(1/
(1/
(1/

GA00_L_foot_thumb_a_JNT.scaleZ);
GA00_L_foot_thumb_a_JNT.scaleZ);
GA00_L_foot_thumb_b_JNT.scaleZ);
GA00_L_foot_thumb_b_JNT.scaleZ);
GA00_L_foot_thumb_c_JNT.scaleZ);
GA00_L_foot_thumb_c_JNT.scaleZ);

This expression drives the X and Y scale value of every toe's


joint based on the Z scale value.
If the value of Z scale is >1 the values of X and Y assume <1
and vice versa.
-
Create 3 additional float attribute for the toes control
called (with default value "1"):
-
-
-

"Thumb_scale"
"Index_scale"
"Pinkie_scale"

-
Connect "Thumb_scale" to GA00_L_foot_thumb_a_JNT.
scaleZ;
-
Connect the same "Thumb_scale" to GA00_L_foot_thumb_
b_JNT.scaleZ;
297

-
Now connect "Thumb_scale" to GA00_L_foot_thumb_c_
JNT.scaleZ;

Picture 07 _10

Connections" in the Hypershade window (Picture 07 _11)

Picture 07 _14

Picture 07 _11

Repeat the process for Index and Pinkie toes...


In Mel:
//
connectAttr -f GA00_L_toe_CTL.thumb_scale GA00_L_foot_thumb_a_JNT.scaleZ;
connectAttr -f GA00_L_toe_CTL.thumb_scale GA00_L_foot_thumb_b_JNT.scaleZ;
connectAttr -f GA00_L_toe_CTL.thumb_scale GA00_L_foot_thumb_c_JNT.scaleZ;
connectAttr -f GA00_L_toe_CTL.index_scale GA00_L_foot_index_a_JNT.scaleZ;
connectAttr -f GA00_L_toe_CTL.index_scale GA00_L_foot_index_b_JNT.scaleZ;
connectAttr -f GA00_L_toe_CTL.index_scale GA00_L_foot_index_c_JNT.scaleZ;
connectAttr
scaleZ;
connectAttr
scaleZ;
connectAttr
scaleZ;
//

-f

GA00_L_toe_CTL.pinkie_scale

GA00_L_foot_pinkie_a_JNT.

-f

GA00_L_toe_CTL.pinkie_scale

GA00_L_foot_pinkie_b_JNT.

-f

GA00_L_toe_CTL.pinkie_scale

GA00_L_foot_pinkie_c_JNT.

Additive attribute for toe animations

- Now select the "index_rot" on the left node ("GA00_L_toe_CTL")


(Picture 07 _15)
Picture 07 _15

In the node options there is the default operation "Sum" (what


we need now) (Picture 07 _12)
Picture 07 _12

- Click and hold on the the right arrow of the control node,
select ---> Single ---> all_rot; (Picture 07 _13)
Picture 07 _13

Sometimes in animation we need an easy way to control


secondary animation. Create an additional "overall" attribute to
drive simultaneously the rotation (and scale) of the toes:
-
Create two "float" type attributes called "all_rot" "all_
scale";
-
Create a "plusMinusAverage " node. To create this, open
the Hypershade Window, Create ---> General Utilities ---> Plus
Minus Average, rename properly "GA00_L_toe_Index_PMA".
(Picture 07 _10)

-
Click on the left arrow to connect the link on the "Plus
Minus" node input1D attribute and select input1D[n] ---> [0]
(Picture 07 _14)
This node receive as input a number of different attribute's
values and returns a result based on the choose Operation
(Sum,Subtract,Average).

-
Click on the left arrow to connect the link on the "Plus
Minus" node input1D attribute and select input1D[n] ---> [1]
-
Select now with the same procedure Output1D and
connect to the rotate X value of each index joint.
(Picture 07 _16)

-
Select the new node ("GA00_L_toe_Index_PMA") and
the toes control ("GA00_L_toe_CTL") and press "Input and Output
298

299

Picture 07 _16

Duplicate the foot rig (Brute force procedure)

To duplicate this foot rig to the right the best procedure is to


repeat the entire process on the other side. Instead, with a little
trick, we can do the same thing faster. I call this: "Brute Force
procedure":
-
Basically we need to create a parent group of all the
component in this scene. Name the group "GA00_L_foot_rig_
GRP" and snap the pivot to the world origin by holding down
"x" on the keyboard.
-
Duplicate this group using "Duplicate Input Graph" and
"Assign Unique Name to Child Nodes"; (Picture 07 _19)
Picture 07 _19

searchReplaceNames
searchReplaceNames
searchReplaceNames
searchReplaceNames
searchReplaceNames

"_DMN1"
"_JNT1"
"_UPV1"
"_CLS1"
"_CRV1"

"_DMN"
"_JNT"
"_UPV"
"_CLS"
"_CRV"

"all";
"all";
"all";
"all";
"all";

08 _RIGGING PROCESS ARM RIG

-
Change the colour of the foot control shape to red
(colour convention for the right side) .

Picture 08 _01

Note:
The controls created using the "Brute force procedure" are
flipped and if you try to rotate using local axis they will move
in the opposite direction. To solve this issue you can fix it by
recreating all the controls without using Scale set to "-1" or use
global rotation axis.
Done, Enjoy :)
Different character foot

We have created a standard foot rig. If your character has toes


in a different position (like a bird's foot or claws) or a different
shape and size we have to analyse the movement and apply
the procedure accordingly, possibly using a different pivot point
and a different start ball and end heel of the reverse foot. .
(Picture 07 _18)

-
Create another two "PlusMinusAverage" node for the
other two toes and repeat the same procedure (thumb and
pinkie).

Picture 07 _18

Now that you have understood the procedure you can repeat
it for the "all_scale" attribute and connect the "scaleZ" value of
all the toe's joints.

In character animation procedure, the arms play an important


role. Though arm gesture and acting both emotion and weight
can be relayed. In this chapter we are going to prepare an
arm animation system (without hands).

We now have a finished foot rig.

What do we need to do to drive our arm chain?

(Picture 07 _17)

Picture 07 _17

-
rename this group with "GA00_R_leg_foot_rig_GRP" and
change the value of "ScaleX" to "-1";
-
Use the "search and replace" utility under Modify --->
Search and Replace Names. Fill the text field with search for
"_L_" and replace with "_R_" with "hierarchy" option .

in "IK Mode" (Inverse Kinematics) ;

in "FK Mode" (Forward Kinematics);

in "Elastic Mode" (our chain driven with a curve);

Does this sound familiar? :) You would be right if you thought this
was the same procedure used for create the leg rig. Although
this has already been covered in earlier chapters, let us now
summarize the basic steps to create the base arm chains.

In Mel:
select -r GA00_R_arm_hand_rig_GRP ;
searchReplaceNames "_L_" "_R_" "hierarchy";

Automatically rename all duplicated nodes by entering this Mel


command in the script editor:
searchReplaceNames "_LOC1" "_LOC" "all";
searchReplaceNames "_GRP1" "_GRP" "all";
searchReplaceNames "_CTL1" "_CTL" "all";

300

Arm "IK Mode"

Ready for the next Chapter!!

-
Duplicate the main chain and rename properly with
"_IK" suffix (e.g. "GA00_L_humerus_ik_JNT",
"GA00_L_elbow_ik_JNT"), remember to keep the axis orientation
equal to the original joints chain.
-

Create an IK handle node using the "IK Handle" Tool :


301

-
Click with the LMB on the first "IK" labelled joint and
select the last joint minus one to create the handle (remember
to rename it properly with the suffix "_IKN").

Picture 08 _02

Note:
This expression is based on my orient joint setting. If you have
set it up differently you may have to use a different rotation
"Elastic Mode" for the arm

-
Open the Outliner and select the effector node that is the
child of the first joint used for the IK handle and snap to the last
joint (pressing "v");

-
Create a curve that matches your number of joints using
the CV curve tool. Snap the cv points to the joints.

-
Create a locator to drive the IK handle. Snap it to the
last joint used for the IK handle, and rename properly (e.g.
"GA00_arm_ik_LOC"). Freeze transformations and parent the IK
handle under the locator;

-
Duplicate the main curve and offset it in the "Y" axes.
Create "offset upvector" curve and "Clusterize" both.
(Picture 08 _03)

-
Create a control to drive your main guide locator on the
first curve. Remember to delete history and freeze transformations
before parenting . (e.g GA00_R_arm_elx_0_CTL)
-
Directly connect the last wrist "elx" joint (only rotations) to
the wrist "elx" control. (Picture 08 _04)
Picture 08 _04

Picture 08 _03

-
Create a locator to drive the base joint, snap it to the
first joint used for the IK handle, and rename it properly (e.g.
"GA00_arm_base_ik_LOC"). Freeze transformations again .
-

one using the "upv" vector for the


second orient axis.

ParentConstrain the first joint to that locator.

-
Directly connect the last wrist "ik" joint's rotations to the
wrist "ik" locator control.
-
Create a parent group for the locator called "GA00_
arm_base_ik_GRP"
-
Create a circle (or whatever you want) to control the
shape. Snap the shape to the locator by pressing and holding
"v". Rename the shape properly and freeze the transformations
(e.g. "GA00_L_arm_ik_CTL").
The locators control the position of our arm(wrist).
Pole Vector

-
Create or import a control. Snap it to the knee then
move it in the 'z' axis enough to create a 45 degree angle
between the base of the IK handle and the position of the
control object (pole vector) .
-

Rename it properly and freeze transformations.

-
Select the new control. Shift select the Ik handle and in
the menu:
-

Constraint ---> Pole Vector;

(Picture 08 _02)

302

"Ik mode" arm squash and stretch

Put this line in the animation expression editor to create a


squash and stretch effect :
GA00_L_humerus_ik_JNT.scaleX = 1 * (1/ GA00_L_humerus_ik_JNT.scaleZ);
GA00_L_humerus_ik_JNT.scaleY = 1 * (1/ GA00_L_humerus_ik_JNT.scaleZ);
GA00_L_elbow_ik_JNT.scaleX = 1 * (1/ GA00_L_elbow_ik_JNT.scaleZ);
GA00_L_elbow_ik_JNT.scaleY = 1 * (1/ GA00_L_elbow_ik_JNT.scaleZ);
GA00_L_ulna_ik_JNT.scaleX = 1 * (1/ GA00_L_ulna_ik_JNT.scaleZ);
GA00_L_ulna_ik_JNT.scaleY = 1 * (1/ GA00_L_ulna_ik_JNT.scaleZ);

-
Create an attribute on
"arm_scale" (with a default value
-
Connect this new attribute
"GA00_L_arm_ik_CTL.arm_scale"
scaleZ", etc...)

"GA00_L_arm_ik_CTL" called
of "1");
to every "ScaleZ" attribute (e.g
and "GA00_L_elbow_ik_JNT.

Ulna Fix for "Ik mode"

To ensure good deformations an extra joint called "ulna" is


added. This joint is only used for deformations and to prevent
"candy wrapping" (an unwanted bad twisting deformation).
We can fix this problem by adding the following line into the
expression editor;

Remember:

-
Create a locator for each cluster and place in the right
position using snap.
-
Directly connect the locators and relative clusters using the
connections editor (the locator must drive the relative cluster).
-
Now ParentConstrain the "offset" locator with the relative
"guide" locator with the "maintain offset" option enabled.
-
Create a joint for each base joints chain and orient them
with the same axes of the base joint chain.
-
Connect the joint to the curve using motionPath. Delete
the default U Value and set yours to match the position of the
relative base joint

GA00_L_ulna_ik_JNT.rotateZ = GA00_L_arm_ik_CTL.rotateX/2;

-
Repeat the "motion path" process using a new locator
"upv" for each "on curve" joint on the offset curve;

Now the rotation of the ulna joint is half the rotation of the
wrist.

Create an aim constraint to orient every joint to the next

Naming convention is obviously fundamental.

Clean the channels of unuseful transformations.


Arm "FK Mode"

-
Duplicate your base spine chain and rename your
joints with the "fk" suffix (e.g. GA00_R_humerus_JNT renamed to
GA00_R_humerus_fk_JNT and so on...).
-
Orient the joint with the same axes as the base joint
chain.
-
Create a Nurbs primitive circle (or load your custom "FK"
arm control shape), name it properly and snap it to the first
joint (base of the arm)
-
Create a Nurbs primitive circle (or load your custom "FK"
arm control shape), name it properly and snap it to the elbow
joint (elbow)
-

Create a Nurbs primitive circle (or load your custom "FK"


303

arm control shape), call that properly and snap to the last joint
(wrist)
-
Create a parent locator for each controls or for a fast
procedure you can use the "parent_loc" script

Now insert this line into the animation editor window:

GA00_L_ulna_fk_GRP.rotateY = - (GA00_L_wrist_fk_CTL.rotateY /2);

Done :) (Picture 08 _06)

-
Create a hierarchy from the last FK LOC to the first (e.g.
. GA00_R_wrist_fk_LOC children of GA00_R_elbow_fk_LOC and
also GA00_R_elbow_fk_LOC children of GA00_R_humerus_fk_
LOC );
-

Picture 08 _06

ParentConstrain the fk controls and the fk joint ( the

We have already done the fix for the "IK mode". For the FK the
procedure is:
-
Parent "GA00_L_wrist_fk_LOC" under "GA00_L_elbow_
fk_CTL";
-
Create a parent group the "GA00_L_ulna_fk_CTL" called
"GA00_L_ulna_fk_GRP". Snap the pivot of that group to the same
position as the control.
-
Break the connection of the "rotateY" value on the
"GA00_L_ulna_fk_JNT" by pressing RMB on the rotateY in the
attributes panel and press "break connetion";
(Picture 08 _05b)

-
Connect the value of "IK" "FK" and "Elastic" to all the the
weight values of the related parentConstraint and scaleConstraint
on our base joint chain;

Repeat the same procedure for each parentConstraint node of


your base joint chain.
Cleanup and Order

Create some groups and parent some objects of our three


systems in order to create a node hierarchy.

-
all the "_CLS" clusters;
-
all the locator and the locator "offset" and "_UPV" that
drive the two curves.
-
GA00_L_knee_ik_LOC;
-
the IKH node;
-
GA00_L_arm_ik_ikn_GRP;
-
-
-
-

Parent under "root_GRP" :


GA00_L_arm_ik_ikn_GRP;
GA00_L_elbow_ik_LOC;
GA00_L_arm_root_LOC;

At the end hide "_fk_JNT" , "_ik_JNT" and "_elx_JNT" , and all


the locator shapes but not "GA00_L_arm_root_LOC".
Arm Additional control

-
Create or import a control shape for the "rigging system
driver", for example, I often use a handle shaped control and
snap it to the position of the first joint of the arm and parent
under "GA00_L_arm_root_LOC";

Start with:

-
Rename it "GA00_L_arm_root_CTL";
-
Select all the transformation attributes then RMB, select
"Lock and Hide Selected";

ParentConstrain (without maintaining the offset ) the first joint to


every first joint of the other rig systems.

-
Group all the "_elx_CTL" rename the new group with this
name "GA00_L_arm_rig_elx_GRP";

-
Create an "Enum" type attribute called "IK_FK_Elastic"
and fill the enum name with :

-
parentConstrain "GA00_L_humerus_JNT" and "GA00_L_
humerus_elx_JNT";
-
parentConstrain "GA00_L_humerus_JNT" and "GA00_L_
humerus_fk_JNT;
-
parentConstrain "GA00_L_humerus_JNT" and "GA00_L_
humerus_ik_JNT;

-
Parent "GA00_L_rig_arm_elx_GRP"
arm_root_LOC";

-
-
-

Connections between the three arm rig

-
scaleConstrain
humerus_ik_JNT;

"GA00_L_humerus_JNT"

and

"GA00_L_

Do the same for the other joints of your base chain.


Create a locator called for example "GA00_L_arm_root_LOC" to
collect and drive the weight of the constraint to switch between
the "IK" "FK" and "Elastic" rigging modes.
Create the following 3 attributes for that control:
-
Attributes ---> Add Attributes ---> Option name "IK", type
"Float" minimum value to 0 and maximum to 1, default value to
0.
-
304

-
Attributes ---> Add Attributes ---> Option name "Elastic",
type "Float" minimum value to 0 and maximum to 1, default value
to 0.

-
Connect "GA00_L_arm_root_LOC.ik" to "GA00_L_humerus_
JNT1.W0"
-
Connect "GA00_L_arm_root_LOC.fk" to "GA00_L_humerus_
JNT.W1"
-
Connect "GA00_L_arm_root_LOC.elastic" to "GA00_L_
humerus_JNT.W2"

Ulna fix for "FK mode"

Picture 08 _05b

"Float" minimum value to 0 and maximum to 1, default value to


0.

Attributes ---> Add Attributes ---> Option name "FK", type

-
Parent the locator
"GA00_L_arm_root_LOC";

under

"GA00_L_

"GA00_L_humerus_ik_LOC"

under

-
Create a parent group of "GA00_L_arm_ik_CTL" and
rename it (e.g"GA00_L_arm_ik_ctl_GRP");
-
ParentConstrain that group ("GA00_L_arm_ik_ctl_GRP") to
"GA00_L_arm_root_LOC";
-
Connect using the connection editor "GA00_L_arm_root_
LOC.ik" to "W0" of the previous parentConstraint
-
parent GA00_L_humerus_fk_LOC under GA00_L_arm_
root_LOC;
-
-
-
-
-

Parent under "notrasf_GRP" (not parent constrain):


"fk_JNT" chain hierarchy;
"_JNT" chain hierarchy;
"elx_JNT" chain hierarchy;
the two curve used in elastic rig mode

"IK";
"FK";
"Elastic";

-
Select the new control ("GA00_L_arm_root_CTL") and
click and hold RMB and press "Set Driven Key..." to open the
window.
-
Select the driver attribute ("IK_FK_Elastic") and press "Load
Driver".
-
Select the driven attributes ("IK","FK","Elastic") and press
"Load Driven".
-
Select "IK" option on "GA00_L_arm_root_CTL.IK_FK_Elastic"
attribute (keep the Driven Key Window open).
-

Change the value of:

-
-
-

"GA00_L_arm_root_LOC.IK" to 1.
"GA00_L_arm_root_LOC.FK" to 0.
"GA00_L_arm_root_LOC.Elastic" to 0.

305

Press "Key" in the driven Key Window.

Repeat the same procedure for FK and Elastic.

Picture 09 _02

09 _ Rigging Process Hand Rig

Picture 09 _03

-
Connect all the shape visibility attributes of each rig
control to the relative attribute on "GA00_L_arm_root_LOC ";
Picture 09 _01

Duplicating arm rig to the opposite side

I think it is a good idea to replace the "brute force" procedure


to duplicate this rig to the other side. :)
This time we need to do an additional thing :
-
Select the "GA00_R_arm_CRV" snap it to the origin of the
world by holding "x" and change the value of the "scaleX" to
"-1". Repeat the same procedure with the "offset" curve.
Remember the same advice used for "Brute force procedure" in
the previous chapters. (Picture 08 _07)
-
Parent under the "GA00_L_wrist_LOC" the two group
and "GA00_L_hand_index_middle_GRP" and "GA00_L_hand_
thumb_GRP";

Picture 08 _07

-
Parent under the "GA00_L_fingers_LOC"
"GA00_L_hand_index_middle_GRP";
The hand rig is mainly based on the finger rig and the wrist
movement is based on its own free movement or on the arm
orientation.
-
Start with creating two locators, one on the middle hand
joint and one in the wrist position, freeze transformations and
rename correctly (e.g. "GA00_L_fingers_LOC" and "GA00_L_
wrist_LOC");
-
Select the root joint of the index joint chain and the
middle finger root joint chain and create a parent group, snap
the pivot to the middle hand joint (e.g. "GA00_L_hand_index_
middle_GRP");
-
Select the root joint of the pinkie finger and create
another group, rename correctly and snap the pivot of the
group in the same position as that of the wrist locator (e.g.
"GA00_L_hand_pinkie_GRP") ;
-
Change the pivot of the root joint of the pinkie finger to
the same position as that of the wrist.
-
Create a parent group of the thumb root joint and snap
it to the wrist locator, rename it correctly (e.g. "GA00_L_hand_
thumb_GRP") (Picture 09 _02)

306

-
LOC";

Parent

under

"GA00_L_wrist_LOC"

the

group

This control is made with five nurbs curve in hierarchy: the


finger control shapes are the children of the hand_CTL.
(Picture 09 _04)
Picture 09 _04

"GA00_L_fingers_

-
Freeze the translations of the entire parent group of the
fingers;
We have created a hierarchy for these fingers with the wrist.
Now the control to drive the hand:
-
Create a shape for the finger control and the main
hand/wrist control, snap to the better position and freeze
transformations, rename it correctly. (e.g. "GA00_hand_CTL"
"GA00_index_CTL" "GA00_middle_CTL" "GA00_pinkie_CTL" "GA00_
thumb_CTL");
-
Change the pivot of main "hand" shape to the Wrist
locator;
-

Parent under "GA00_hand_CTL" the "GA00_L_wrist_LOC";

I've created a human based shape for my hand and finger


control. (Picture 09 _03)

307

-
Create three attributes on each finger control to drive
the rotations of each finger joint. (e.g."index_a_rot" , "index_b_
rot", "index_c_rot" )
In Mel:
// index attributes
addAttr -ln index_a_rot -at double GA00_index_CTL;
setAttr -e -keyable true GA00_index_CTL.index_a_rot;
addAttr -ln index_b_rot -at double GA00_index_CTL;
setAttr -e -keyable true GA00_index_CTL.index_b_rot;
addAttr -ln index_c_rot -at double GA00_index_CTL;
setAttr -e -keyable true GA00_index_CTL.index_c_rot;
// middle attributes
addAttr -ln middle_a_rot
setAttr -e -keyable true
addAttr -ln middle_b_rot
setAttr -e -keyable true
addAttr -ln middle_c_rot
setAttr -e -keyable true

-at double GA00_middle_CTL;


GA00_middle_CTL.middle_a_rot;
-at double GA00_middle_CTL;
GA00_middle_CTL.middle_b_rot;
-at double GA00_middle_CTL;
GA00_middle_CTL.middle_c_rot;

// pinkie attributes
addAttr -ln pinkie_a_rot
setAttr -e -keyable true
addAttr -ln pinkie_b_rot
setAttr -e -keyable true
addAttr -ln pinkie_c_rot
setAttr -e -keyable true

-at double GA00_pinkie_CTL;


GA00_pinkie_CTL.pinkie_a_rot;
-at double GA00_pinkie_CTL;
GA00_pinkie_CTL.pinkie_b_rot;
-at double GA00_pinkie_CTL;
GA00_pinkie_CTL.pinkie_c_rot;

setAttr -e -keyable true GA00_middle_CTL.middle_scale;


addAttr
setAttr
addAttr
setAttr

-ln pinkie_spread -at double GA00_pinkie_CTL;


-e -keyable true GA00_pinkie_CTL.pinkie_spread;
-ln pinkie_scale -at double GA00_pinkie_CTL;
-e -keyable true GA00_pinkie_CTL.pinkie_scale;

addAttr
setAttr
addAttr
setAttr

-ln thumb_spread -at double GA00_thumb_CTL;


-e -keyable true GA00_thumb_CTL.thumb_spread;
-ln thumb_scale -at double GA00_thumb_CTL;
-e -keyable true GA00_thumb_CTL.thumb_scale;

addAttr
setAttr
addAttr
setAttr

-ln thumb_palm -at double GA00_thumb_CTL;


-e -keyable true GA00_thumb_CTL.thumb_palm;
-ln pinkie_palm -at double GA00_pinkie_CTL;
-e -keyable true GA00_pinkie_CTL.pinkie_palm;

// roll attr

-
Create two more controls on each finger in order to
drive the spread and the scale of each of the finger controls.
(e.g. "index_spread" "index_scale");
-
create an additional attribute on the thumb and the
pinkie to drive the palm side. (e.g. "thumb_palm" "pinkie_palm");
- Finally, create a "roll" attribute on each finger (e.g. "thumb_
roll")

addAttr -ln index_roll -at double GA00_index_CTL;


setAttr -e -keyable true GA00_index_CTL.index_roll;

On the main hand control:


- Create two new attributes, being "global_scale" (with default
value "1") and "global_rot".
Connection between controls attributes and joint chain of the hand

Like the feet, the procedure for animating the fingers is almost
the same. As an example, "Thumb_a_rot" and "hand_global_rot"
is connected with a plusMinusAverage node to the "GA00_L_
hand_thumb_a_JNT" , and so on for the other finger rotation
attributes:
-
Create a "plusMinusAverage" node. In order to create
this, open the Hypershade Window, Create ---> General Utilities
---> Plus Minus Average and rename it correctly as"GA00_L_
hand_Index_PMA", using the "sum" option.

addAttr -ln middle_roll -at double GA00_middle_CTL;


setAttr -e -keyable true GA00_middle_CTL.middle_roll;

-
Select the new node ("GA00_L_hand_Index_PMA") and
the index finger ctrl ("GA00_L_index_CTL") and press "Input and
Output Connections" in the Hypershade windows.

addAttr -ln pinkie_roll -at double GA00_pinkie_CTL;


setAttr -e -keyable true GA00_pinkie_CTL.pinkie_roll;

-
Click on left arrow to connect the link on the "Plus Minus"
node input1D attribute and select input1D[n] ---> [0].

addAttr -ln thumb_roll -at double GA00_thumb_CTL;


setAttr -e -keyable true GA00_thumb_CTL.thumb_roll;

-
Now select the "index_rot" on the left node ("GA00_L_
index_CTL").

//

-
Click on the left arrow to connect the link on the "Plus
Minus" node input1D attribute and select input1D[n] ---> [1].

(Picture 09 _05)

-
Using the same procedure Output1D, now select and
connect to the rotate X on "GA00_L_hand_index_a_JNT".
Repeat the same procedure for each finger control.

in Mel:
308

It will insert the two adder attributes and finally, the boosted
attribute and the script will create and automatically connect
the new plusMinusAverage node and the attributes :)
//
// adder booster
global
proc
booster_add_attr
(string
$boosterattr,
$boosteraddattr,string $boostedattr,string $type)
{
string $boosterattr;

addAttr -ln middle_spread -at double GA00_middle_CTL;


setAttr -e -keyable true GA00_middle_CTL.middle_spread;
addAttr -ln middle_scale -at double GA00_middle_CTL;

// thumb and pinkie palm attr

// thumb attributes
addAttr -ln thumb_a_rot -at double GA00_thumb_CTL;
setAttr -e -keyable true GA00_thumb_CTL.thumb_a_rot;
addAttr -ln thumb_b_rot -at double GA00_thumb_CTL;
setAttr -e -keyable true GA00_thumb_CTL.thumb_b_rot;
addAttr -ln thumb_c_rot -at double GA00_thumb_CTL;
setAttr -e -keyable true GA00_thumb_CTL.thumb_c_rot;
//

Picture 09 _05

// scale and spread


addAttr -ln index_spread -at double GA00_index_CTL;
setAttr -e -keyable true GA00_index_CTL.index_spread;
addAttr -ln index_scale -at double GA00_index_CTL;
setAttr -e -keyable true GA00_index_CTL.index_scale;

I have also created an automatic script for this particular


procedure called "booster_add_attr".

string

string $boosteraddattr;
string $boostedattr;
$basename = `basenameEx($boostedattr)`;
string $stripnamex = `substring $basename 0 (size($basename)-3)`;
string $stripname = ($stripnamex+$type+"_");
createNode plusMinusAverage;
rename plusMinusAverage1 ($stripname+"PMA");
connectAttr -f $boosterattr ($stripname+"PMA.input1D[0]");
connectAttr -f $boosteraddattr ($stripname+"PMA.input1D[1]");
connectAttr -f ($stripname+"PMA.output1D") $boostedattr;
}
// End

Hand rig setup:


booster_add_attr ("GA00_index_CTL.index_a_rot","GA00_hand_CTL.global_rot",
"GA00_L_hand_index_a_JNT.rotateX","rot");
booster_add_attr ("GA00_index_CTL.index_b_rot","GA00_hand_CTL.global_rot",
"GA00_L_hand_index_b_JNT.rotateX","rot");
booster_add_attr ("GA00_index_CTL.index_c_rot","GA00_hand_CTL.global_rot",
"GA00_L_hand_index_c_JNT.rotateX","rot");
booster_add_attr
("GA00_middle_CTL.middle_a_rot","GA00_hand_CTL.global_
rot", "GA00_L_hand_middle_a_JNT.rotateX","rot");
booster_add_attr
("GA00_middle_CTL.middle_b_rot","GA00_hand_CTL.global_
rot", "GA00_L_hand_middle_b_JNT.rotateX","rot");
booster_add_attr
("GA00_middle_CTL.middle_c_rot","GA00_hand_CTL.global_
rot", "GA00_L_hand_middle_c_JNT.rotateX","rot");
booster_add_attr
("GA00_pinkie_CTL.pinkie_a_rot","GA00_hand_CTL.global_
rot", "GA00_L_hand_pinkie_a_JNT.rotateX","rot");
booster_add_attr
("GA00_pinkie_CTL.pinkie_b_rot","GA00_hand_CTL.global_
rot", "GA00_L_hand_pinkie_b_JNT.rotateX","rot");
booster_add_attr
("GA00_pinkie_CTL.pinkie_c_rot","GA00_hand_CTL.global_
rot", "GA00_L_hand_pinkie_c_JNT.rotateX","rot");
booster_add_attr ("GA00_thumb_CTL.thumb_a_rot","GA00_hand_CTL.global_rot",
"GA00_L_hand_thumb_a_JNT.rotateY","rot");
booster_add_attr ("GA00_thumb_CTL.thumb_b_rot","GA00_hand_CTL.global_rot",
"GA00_L_hand_thumb_b_JNT.rotateY","rot");
booster_add_attr ("GA00_thumb_CTL.thumb_c_rot","GA00_hand_CTL.global_rot",
"GA00_L_hand_thumb_c_JNT.rotateY","rot");

Enjoy :)
309

-
Connect manually "GA00_index_CTL.index_spread" to
"GA00_L_hand_index_a_JNT.rotateY";
-
"GA00_middle_CTL.middle_spread"
to
"GA00_L_hand_
middle_a_JNT.rotateY";
-
"GA00_pinkie_CTL.pinkie_spread"
to
"GA00_L_hand_
pinkie_a_JNT.rotateY";
-
"GA00_pinkie_CTL.thumb_spread"
to
"GA00_L_hand_
thumb_a_JNT.rotateX";
-
Connect manually "GA00_index_CTL.index_roll" to "GA00_
L_hand_index_a_JNT.rotateZ";
-
"GA00_middle_CTL.middle_roll" to "GA00_L_hand_middle_
a_JNT.rotateZ";
-
"GA00_pinkie_CTL.pinkie_roll" to "GA00_L_hand_pinkie_
a_JNT.rotateZ";
-
"GA00_pinkie_CTL.thumb_roll" to "GA00_L_hand_thumb_
a_JNT.rotateX";
Squash and stretch for fingers

Add this line in the Animation expression editor:


GA00_L_hand_index_a_JNT.scaleX
GA00_L_hand_index_a_JNT.scaleY
GA00_L_hand_index_b_JNT.scaleX
GA00_L_hand_index_b_JNT.scaleY
GA00_L_hand_index_c_JNT.scaleX
GA00_L_hand_index_c_JNT.scaleY

=
=
=
=
=
=

1
1
1
1
1
1

*
*
*
*
*
*

(1/
(1/
(1/
(1/
(1/
(1/

GA00_L_hand_index_a_JNT.scaleZ);
GA00_L_hand_index_a_JNT.scaleZ);
GA00_L_hand_index_b_JNT.scaleZ);
GA00_L_hand_index_b_JNT.scaleZ);
GA00_L_hand_index_c_JNT.scaleZ);
GA00_L_hand_index_c_JNT.scaleZ);

GA00_L_hand_middle_a_JNT.scaleX
scaleZ);
GA00_L_hand_middle_a_JNT.scaleY
scaleZ);
GA00_L_hand_middle_b_JNT.scaleX
scaleZ);
GA00_L_hand_middle_b_JNT.scaleY
scaleZ);
GA00_L_hand_middle_c_JNT.scaleX
scaleZ);
GA00_L_hand_middle_c_JNT.scaleY
scaleZ);

(1/

GA00_L_hand_middle_a_JNT.

(1/

GA00_L_hand_middle_a_JNT.

(1/

GA00_L_hand_middle_b_JNT.

(1/

GA00_L_hand_middle_b_JNT.

(1/

GA00_L_hand_middle_c_JNT.

(1/

GA00_L_hand_middle_c_JNT.

GA00_L_hand_pinkie_a_JNT.scaleX
scaleZ);
GA00_L_hand_pinkie_a_JNT.scaleY
scaleZ);
GA00_L_hand_pinkie_b_JNT.scaleX
scaleZ);
GA00_L_hand_pinkie_b_JNT.scaleY
scaleZ);
GA00_L_hand_pinkie_c_JNT.scaleX
scaleZ);
GA00_L_hand_pinkie_c_JNT.scaleY

(1/

GA00_L_hand_pinkie_a_JNT.

(1/

GA00_L_hand_pinkie_a_JNT.

(1/

GA00_L_hand_pinkie_b_JNT.

(1/

GA00_L_hand_pinkie_b_JNT.

(1/

GA00_L_hand_pinkie_c_JNT.

(1/

GA00_L_hand_pinkie_c_JNT.

310

scaleZ);
GA00_L_hand_thumb_a_JNT.scaleX
GA00_L_hand_thumb_a_JNT.scaleY
GA00_L_hand_thumb_b_JNT.scaleX
GA00_L_hand_thumb_b_JNT.scaleY
GA00_L_hand_thumb_c_JNT.scaleX
GA00_L_hand_thumb_c_JNT.scaleY

The next step is connecting the "palm" attributes:


=
=
=
=
=
=

1
1
1
1
1
1

*
*
*
*
*
*

(1/
(1/
(1/
(1/
(1/
(1/

GA00_L_hand_thumb_a_JNT.scaleZ);
GA00_L_hand_thumb_a_JNT.scaleZ);
GA00_L_hand_thumb_b_JNT.scaleZ);
GA00_L_hand_thumb_b_JNT.scaleZ);
GA00_L_hand_thumb_c_JNT.scaleZ);
GA00_L_hand_thumb_c_JNT.scaleZ);

This expression drives the X and Y scale value of every finger


joint in the base of the value of the Z scale value.
If the value of Z scale is > 1 the values of X and Y assume <
1 and vice versa. This is equal to the scale of the toes of the
feet.
Connect using "booster_add_attr" script the two boosters "GA00_
index_CTL.index_scale"
"GA00_hand_CTL.global_scale" ""attribute to the "GA00_L_hand_
index_a_JNT.scaleZ" boosted , repeat for the ScaleZ on the
"GA00_L_hand_index_b_JNT "and "GA00_L_hand_index_c_JNT"
follow the same procedure for the other fingers.
In Mel:
(after source booster_add_attr procedure)
booster_add_attr
("GA00_index_CTL.index_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_index_a_JNT.scaleZ");
booster_add_attr
("GA00_index_CTL.index_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_index_b_JNT.scaleZ");
booster_add_attr
("GA00_index_CTL.index_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_index_c_JNT.scaleZ");

-
Connect "GA00_thumb_CTL.thumb_palm"
hand_thumb_GRP.rotateX";

to

"GA00_L_

-
Connect "GA00_thumb_CTL.pinkie_palm"
hand_pinkie_GRP.rotateX";

to

"GA00_L_

10 _Connection Between Rig Modules

Connection Hand - Arm


Picture 10 _01

Final connections:
-

Parent

"GA00_L_wrist_LOC" under "GA00_hand_CTL";

-
Create a parent group of the "GA00_hand_CTL" called
"GA00_hand_root_GRP"with the same pivot as the wrist locator;
-
Create a parent locator of the "GA00_hand_GRP" called
"GA00_hand_root_LOC".

Duplicate on the other side

We have written a number of small scripts for quick rigging of


this hand and we can quickly repeat the procedure for the
other hand.
finished :) (Picture 09 _06)
Picture 09 _06

To connect the hand module rig to the arm rig :


Create a new file and import the two rig modules:

booster_add_attr
("GA00_middle_CTL.middle_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_middle_a_JNT.scaleZ");
booster_add_attr
("GA00_middle_CTL.middle_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_middle_b_JNT.scaleZ");
booster_add_attr
("GA00_middle_CTL.middle_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_middle_c_JNT.scaleZ");

-
pointConstrain "GA00_hand_root_LOC" to "GA00_L_wrist_
JNT" keeping the offset option turned "on";

booster_add_attr
("GA00_pinkie_CTL.pinkie_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_pinkie_a_JNT.scaleZ");
booster_add_attr
("GA00_pinkie_CTL.pinkie_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_pinkie_b_JNT.scaleZ");
booster_add_attr
("GA00_pinkie_CTL.pinkie_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_pinkie_c_JNT.scaleZ");

-
LOC";

booster_add_attr
("GA00_thumb_CTL.thumb_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_thumb_a_JNT.scaleZ");
booster_add_attr
("GA00_thumb_CTL.thumb_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_thumb_b_JNT.scaleZ");
booster_add_attr
("GA00_thumb_CTL.thumb_scale","GA00_hand_CTL.global_
scale", "GA00_L_hand_thumb_c_JNT.scaleZ");

The "hand orient" switch allows the animator to turn on or off


the automatic orientations of the wrist to the arm. This is very
useful for animation.

-
aimConstrain "GA00_hand_GRP" to "GA00_L_ulna_JNT"
keeping the offset option turned "on" and using the world up
type "vector"option;
parentConstrain "GA00_L_hand_JNT" to "GA00_L_wrist_

-
Create a new "boolean" type attribute on "GA00_L_
hand_CTL" called "hand_orient" and connect with the "W0"
weight value of the aim constrain on "GA00_hand_GRP";

We also need to change the "Ulna candy wrapping fix"


expression,
311

-
start by breaking the connection on "GA_L_ulna_fk_JNT.
rotateZ"
open the expression editor and replace the old expression with
this new one:
GA00_L_ulna_ik_JNT.rotateZ = (GA00_L_hand_CTL.rotateX+GA00_
L_ulna_fk_CTL.rotateY)/2;
GA00_L_ulna_fk_JNT.rotateZ = (GA00_L_hand_CTL.rotateX+GA00_
L_ulna_fk_CTL.rotateY)/2;
Repeat for the right hand side.
Let's go to the next connection. (Picture 10 _02)
Connection Foot - Ankle
Picture 10 _02

To make the connection between foot rig and leg rig:


-

In a new file import the two rig modules.

-
Create a parent group of all the "GA00_L_foot_CTL"
called "GA00_L_foot_ctl_GRP" ;
-
parentConstrain "GA00_L_foot_ctl_GRP" to the "GA00_L_
tibia_c_fk_CTL" "GA00_L_tibia_c_elx_CTL";
-
Create a driven key between "GA00_L_leg_root_CTL.
IK_FK_Elastic" and the "W0" weight ("elx" ctl) and "W1" weight ("fk"
ctl) :

-
When "IK_FK_Elastic" is set to "IK" set "W0" "W1" to "0";
-
to "1";

Else "IK_FK_Elastic" is set to "FK" set "W0" to "0" and "W1"

-
then else "IK_FK_Elastic" is set to "Elastic" set "W0" to "1"
and "W1" to "0"; (Picture 10 _03)
Picture 10 _03

When the leg rig is in "IK" the foot control needs to become the
driver of the "GA00_L_leg_ik_ikn_GRP". This group is already
controlled by the leg root locator in "FK mode" and "Elastic
Mode" by a parentConstraint but we need to create another
one to drive the "IK mode" rig :
-
parentConstraint "GA00_L_leg_ik_ikn_GRP" to the last
joint of the reverse foot ankle and create a driven key to drive
the weight value. Turn it on when When "IK_FK_Elastic" is set to
"IK" and turn off when (value of "0") in "FK" and "Elastic".
-
Create a "float" type attribute called "leg_scale" with
a default value of "1" on "GA00_L_foot_CTL" and connect using
connections editor with the same name attribute on "GA00_R_
leg_ik_ikn_LOC";
Now we can control the scale value of the leg using the foot
ctrl :)
-
For future binding parent the "GA00_L_ball_JNT" to
the "GA00_L_ankle_JNT", this connection does not break our
previous connections.
Repeat for the other leg (right side).
Connection Legs - Hip

First create a control shape for the hip and the pelvis and place
with its pivot in the same position of the root control as the
spine locator. Freeze transformations and rename properly (e.g.
"GA00_M_pelvis_CTL" "GA00_hip_CTL"). Create a parent locator
for these two controls.
-

Picture 10 _05

-
parentContrain "GA00_R_leg_root_LOC" with "GA00_R_
pelvis_LOC" and "GA00_L_leg_root_LOC" with "GA00_L_pelvis_
LOC", the hip locator must drive the leg root locators;
Good now the two leg rig are connected to the pelvis :)
Connection Spine - Hip

Now connect the spine rig to the hip:


-

Import the spine rig module;

-
parentContraint "GA00_M_spine_0_elx_CTL" to "GA00_M_
pelvis_CTL" and the "GA00_M_spine_0_CTL" with "GA00_hip_CTL";
-
Hide the shape of "GA00_M_spine_0_elx_CTL" and "GA00_
M_spine_0_CTL". Rename these two controls with the "_oCTL"
suffix ("old control"). We do not need those anymore.
(Picture 10 _04)
Picture 10 _04

Import the two rig module of the left and right legs.

-
Create another two locators. Snap one to the left leg
root locator and the other to the right leg root locator. Freeze
transformations and rename "GA00_L_hip_LOC" and "GA00_R_
hip_LOC";
-
Put "GA00_pelvis_LOC" under "GA00_hip_CTL" , "GA00_L_
hip_LOC" and "GA00_R_hip_LOC" under "GA00_M_pelvis_CTL"
(Picture 10 _05)

312

313

-
parentContrain "GA00_M_tail_guide_SHP" to "GA00_M_
spine_0_JNT";

Connection Tail - Hip

-
Import the tail rig module and parentContraint "GA00_
M_tail_root_LOC" to the "GA00_M_pelvis_CTL" whilst maintaining
the offset.
-
Create a nurbs semi sphere and change the shape so
that it approximately fits the bottom part of Gaston. Rename it
with "GA00_M_tail_guide_SHP";
-
In the Render Stats panel tab turn off the "Primary
Visibility" option of our sphere. We don't want to render this
object; (Picture 10 _07)

Picture 10 _09

objects;
-
Create a control shape for the shoulder. Snap it to the
arm root locator. Freeze transformations and rename properly
(e.g. "GA00_L_shoulder_CTL"). Repeat for the other sides.

Hide the "GA00_M_tail_guide_SHP" sphere guide;

-
Hide the shape of "GA00_M_tail_0_CTL" . Rename it with
the "_oCTL" suffix ("GA00_M_tail_0_oCTL"). We do not need these
anymore.

-
Create a parent locator of the two controls named
"GA00_L_shoulder_ctl_LOC"
and
"GA00_R_shoulder_ctl_LOC"
respectively. (Picture 10 _11)

With these steps we have created a little procedure to allow the


tail to move around the "bottom" of Gaston :) (Picture 10 _06)

Picture 10 _11

Picture 10 _06

Picture 10 _07

Start with:
-
Create two locators called "GA00_L_shoulder_LOC" and
"GA00_R_shoulder_LOC". Snap each respectively to "GA00_
L_arm_root_LOC" and "GA00_R_arm_root_LOC".
Freeze the
transformations;
-
Create parent groups with the same pivot as these two
shoulder locators and rename them as "GA00_L_shoulder_loc_
GRP" and "GA00_R_shoulder_loc_GRP";
-
Create a nurbs semi sphere "GA00_M_chest_guide_SHP",
and place it at the origin of the chest joint. Use a radius value
to calculate the position of the two shoulder locators;
(Picture 10 _10)
Connection Arm - Shoulder - Spine

Picture 10 _10

To create the connection between arm and spine rig we need


to create a shoulder.
-
Create a geometryConstraint between "GA00_M_tail_0_
CTL" and the new semisphere "GA00_M_tail_guide_SHP";
(Picture 10 _08)
Picture 10 _08

Constraints:
-
parentConstrain
"GA00_L_shoulder_CTL";

"GA00_L_shoulder_loc_GRP"

the

-
parentConstrain "GA00_L_shoulder_LOC" to the "GA00_L_
shoulder_CTL";

Import the file with the arm rigs (left and right sides).

-
geometryConstrain "GA00_L_shoulder_loc_GRP" to the
"GA00_M_chest_guide_SHP";

To make a good shoulder rig we need to create a system


similar to the connection for the tail and the hip that we have
made before. A locator that can slide around a semi sphere
is needed. This locator can drive the positions of our arm.
Afterwords, we will add an attribute to switch this option on
and off. (Picture 10 _09)

-
parentContrain "GA00_L_arm_root_LOC" to the "GA00_L_
shoulder_LOC";
-

Create a "boolean" type attribute called "free_shoulder";

-
Connect this new attribute to the
parentContraint on "GA00_L_shoulder_LOC".

-
parentContrain "GA00_M_chest_guide_SHP" to "GA00_M_
spine_2_JNT" (chest joint);
-
On the Render Stats panel tab turn off the "Primary
Visibility" option of our sphere. We don't want to render these
314

to

"W0"

of

the

Repeat this connection pass with the right control ("GA00_R_


shoulder_CTL").
Now we are able to switch between the shoulder sliding systems.
We will add an additional attribute to control whether "GA00_L_
arm_ik_CTL" follows the shoulder or not.
315

-
Create a new "boolean" attribute on "GA00_L_shoulder_
CTL" called "hand_follow".
-
Create a parent group of the "GA00_L_arm_ik_CTL"
called "GA00_L_arm_ik_ctl_GRP".
-
parentContrain "GA00_L_arm_ik_ctl_GRP" to the "GA00_
L_shoulder_CTL".
-
Connect "hand_follow" value with the
parentContraint on "GA00_L_arm_ik_ctl_GRP".

"W0"

of

the

-
Create two joints called "GA00_L_shoulder_JNT" and
"GA00_R_shoulder_JNT" place near the "GA00_L_shoulder_LOC"
and "GA00_R_shoulder_LOC" respectively.
(Picture 10 _21)

Connection Head - Neck - Spine

Picture 10 _13

-
"GA00_R_arm_root_LOC.ScaleZ" to "-1" value;
-
"GA00_R_arm_ik_ctl_GRP" the value for "ScaleX" and
"ScaleZ" to "-1";

Here we will only connect the head joint to the neck rig because
later we will add the full head facial setup for Gaston.
(Picture 10 _15)
Picture 10 _15

Chest Control

We already have a chest control but in this case we need to


improve the shape to make it more "animator friendly".
Create a new shape and once in the scene, rename it with
"GA00_M_chest_CTL", snap the pivot point to the chest joint
("GA00_M_spine_2_JNT") and freeze the transformations.
(Picture 10 _12)
Picture 10 _21

Picture 10 _21

-
Parent the two parent locator of the shoulder controls
("GA00_L_shoulder_ctl_LOC"
and
"GA00_R_shoulder_ctl_LOC")
under "GA00_M_chest_CTL" ; (Picture 10 _14)
Picture 10 _13

-
Parent the new chest control "GA00_M_chest_CTL" under
"GA00_M_spine_1_CTL".
-
parentConstrain these two joints to the respective shoulder
locator (e.g. "GA00_R_shoulder_JNT" constrained to "GA00_R_
shoulder_LOC");

-
CTL".

-
Create a group called "GA00_notrasf_shoulder_GRP" and
parent under "GA00_R_shoulder_JNT" "GA00_R_shoulder_JNT" ,
"GA00_R_shoulder_loc_GRP" and "GA00_L_shoulder_loc_GRP"

-
Turn off the visibility of the "GA00_M_spine_2_CTL" shape
and give it a "_oCTL" suffix (e.g. "GA00_M_spine_2_oCTL"). This is
not animatable now; (Picture 10 _13)

Parent

-
joint.

"GA00_M_chest_CTL" under "GA00_M_spine_2_

Create a locator and snap it to the base of the head


Freeze transformations and rename it "GA00_head_LOC";

-
Rename "GA00_M_spine_3_CTL" to "GA00_M_neck_CTL"
and "GA00_M_spine_3_elx_CTL" to "GA00_M_neck_elx_CTL";
-

Unhide "GA00_M_chest_guide_SHP";

-
Hide "GA00_M_chest_guide_SHP" and turn off the visibility
of the two shoulder locators.

This procedure is similar to the shoulder and tail connections


rig;

Note:
If you have used the "brute force" procedure to duplicate the
right hand side arm rig and hand rig you may need to change
the value of "ScaleZ" and "ScaleX" for some groups or locators. If
at creation some constraints cause "flipping" of the entire hand
module rig.
For example, in my rig, I have changed :

-
parentContrain "GA00_head_loc_GRP" to the "GA00_M_
neck_elx_CTL";
-
geometryConstrain "GA00_head_loc_GRP" to "GA00_M_
chest_guide_SHP";
-
parentContrain "GA00_head_LOC" to the "GA00_M_neck_
elx_CTL"; (Picture 10 _16)

316

Done! :)
317

Picture 10 _16

Picture 10 _17

-
parent
body_CTL";

"GA00_squash_hold_GRP"

under

Picture 10 _19

"GA00_local_

-
Create an additional shape called "GA00_name_SHP",
parent under "GA00_global_body_CTL";
This object will collect different attributes to setup some preference
for Gaston, such as turning the visibility of the controls on and
off, etc...
-
Create "boolean" type attributes on "GA00_name_SHP"
called "L_arm_ctl_vis", "L_leg_ctl_vis", "R_arm_ctl_vis", "R_leg_ctl_
vis", "M_spine_ctl_vis", "M_tail_ctl_vis";
-
Connect each attribute to the respective "visibility" attribute
shape. If the visibility attribute of that control is already connected
you can use the "Lod visibility" attribute of each control. (Picture
10 _18)

-
Create a "boolean" type attribute called "free_neck" on
"GA00_M_neck_elx_CTL";
-
Connect the "free_neck" attribute to the "W0" value of
the parentConstraint of the "GA00_head_LOC";
-
parentConstrain "GA00_M_head_a_JNT" to the "GA00_
M_neck_elx_CTL";
-
Hide "GA00_M_chest_guide_SHP"
"GA00_head_LOC";

and

the

shape

of

Now we can control all the movement of the neck and head
of Gaston. Enjoy!
Global Controls Rig

It is important to be able to move and scale our rig anywhere


and to any size. This is a must!
Start with:
-
Create two circular shape controls. Place them at the
base of the Gaston foot and freeze the transformation. Scale
one of the control to make it smaller than the other. Rename
the big one "GA00_global_body_CTL" and the small "GA00_local_
body_CTL";
-
Create a parent locator of "GA00_local_body_CTL" called
"GA00_local_body_ctl_LOC"; (Picture 10 _17)

-
-
-
-
-

Parent the following object under "GA00_notrasf_GRP" :


"GA00_M_spine_notrasf_GRP" ;
"GA00_notrasf_shoulder_GRP";
"GA00_tail_notrasf_GRP";
"GA00_geo_GRP";

-
:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Parent the following object under "GA00_local_body_CTL"


"GA00_hip_LOC";
"GA00_L_leg_foot_rig_GRP";
"GA00_R_leg_foot_rig_GRP";
"GA00_L_arm_hand_rig_GRP";
"GA00_R_arm_hand_rig_GRP";
"GA00_M_tail_guide_SHP";
"GA00_M_chest_guide_SHP";
"GA00_head_loc_GRP";
"GA00_M_head_a_JNT";
"GA00_M_spine_root_LOC";
"GA00_M_tail_0_elx_ctl_GRP";
"GA00_M_tail_1_elx_ctl_GRP";
"GA00_M_tail_2_elx_ctl_GRP";
"GA00_M_tail_3_elx_ctl_GRP";
"GA00_M_spine_0_JNT" chain;
"GA00_M_tail_0_JNT" chain;

-
Create a group of all the squash system "hold" objects
for the tail (e.g. "GA00_M_tail_0_squash_start_hold_LOC" "GA00_
M_tail_0_squash_end_hold_LOC" "GA00_M_tail_0_squash_hold_
DMN") and rename it "GA00_squash_hold_GRP";
318

Picture 10 _18

-
Create a group called "GA00_notrasf_GRP" and another
one "GA00_root_GRP";

Cleanup

The rig needs further cleanup locking and hiding useless


attributes for every controls of our character.
Character selections Set

We need to create a "character controls set" to permit the


animator to select all the controls at the same time, to put for
example, a keyframe.

In the Outliner panel or window open the list of Gaston's controls


set and check every control for useless attributes, select them
and with RMB use "lock and hide";
(Picture 10 _23) (Picture 10 _24)
Picture 10 _23

At this stage it is extremely easy for us to create a character


set for Gaston because every control is properly named and
we can therefore carry out the process with a simple Mel
command.
-

In the script editor

select "*_CTL";

Now all the controls are selected.


Create ---> Set ---> Set with option box , name it "GA00_body_
controls_SET";
(Picture 10 _19)

319

Picture 10 _24

Picture 11 _03

11 _Body Skin Binding

This is a very important step to do perfectly because the


of a character TD basically consists of "moving vertices in
elegant way". We have completed all the rigging section to
improving deformations. Now we shall bind this skeleton to
Gaston mesh geometry. (Picture 11 _01)

job
an
aid
the

select
select
select
select
select
//

-tgl
-tgl
-tgl
-tgl
-tgl

GA00_R_hand_pinkie_a_JNT ;
GA00_M_tail_0_JNT ;
GA00_L_shoulder_JNT ;
GA00_R_shoulder_JNT ;
GA00_body_GEO ;

-
Now press Skin ---> Bind Skin ---> Smooth Bind with
options , reset the tool and use the default setting ---> Bind Skin.
(Picture 11 _02)
Picture 11 _02

Picture 11 _01

Select all the main chain root joints of each module :


Head: ("GA00_M_head_a_JNT");

Spine: ("GA00_M_spine_0_JNT");

-
JNT");

Shoulders:

Arms: ("GA00_L_humerus_JNT", "GA00_R_humerus_JNT");

("GA00_L_shoulder_JNT","GA00_R_shoulder_

-
Fingers:
("GA00_L_hand_pinkie_a_JNT",
"GA00_L_
hand_middle_a_JNT",
"GA00_L_hand_index_a_JNT",
"GA00_
L_hand_thumb_a_JNT"
and
"GA00_R_hand_pinkie_a_JNT",
"GA00_R_hand_middle_a_JNT","GA00_R_hand_index_a_JNT",
"GA00_R_hand_thumb_a_JNT");

That's it.....
Gooooood!! finally we have finished the full body rig!! well
done!!
Ready for the body mesh skin binding! (Picture 10 _25)
Picture 10 _25

Start with:
-
Turn Gaston's geometry layer into "selectable" mode, press
the button in the display layer panel; (Picture 11 _03)

320

Legs(foot and toes): ("GA00_L_femur_JNT");

Tail ("GA00_M_tail_0_JNT");

and last, select the geometry "GA00_body_GEO";

Good! :) The geometry now is "connected" to our skeleton


system. That means that every vertex is now influenced by our
skeleton.
Edit and Painting weights

This process consists of changing the default vertex weights


assignment to each joints. Every vertex point is influenced by a
joint between a value of "0" to "1".
Our new goal is to reach a good deformation between joints e.g.
Between shoulder and arm or hip and legs. Vertex assignment
is directly associated to the UV map used for geometry. If the
UVs aren't correct or overlap we may obtain unpredictable
result during animation.

In Mel:

We can edit the Skin weights going to :

//
select
select
select
select
select
select
select
select
select
select
select
select
select

Select your character mesh (e.g. "GA00_body_GEO");

Skin ---> Edit Smooth Skin ---> Paint Skin Weights Tool;

-r GA00_L_femur_JNT ;
-tgl GA00_R_femur_JNT ;
-tgl GA00_M_spine_0_JNT ;
-tgl GA00_L_humerus_JNT ;
-tgl GA00_M_head_a_JNT ;
-tgl GA00_R_humerus_JNT ;
-tgl GA00_L_hand_pinkie_a_JNT ;
-tgl GA00_L_hand_middle_a_JNT ;
-tgl GA00_L_hand_index_a_JNT ;
-tgl GA00_L_hand_thumb_a_JNT ;
-tgl GA00_R_hand_thumb_a_JNT ;
-tgl GA00_R_hand_index_a_JNT ;
-tgl GA00_R_hand_middle_a_JNT ;

(Picture 11 _04)

321

Picture 11 _04

There are certain panels we must analyse:


-

Picture 11 _14

Brush

This "GA00_M_spine_1_JNT" joint is principally used to blend the


weights between the hip and the chest joints. (Picture 11 _16)
Picture 11 _16

You can choose the size of your paint brush, the radius and the
opacity. When you are painting you can press and hold "b" key
button use the MMB (scrolling) to change the radius.
-

Stroke

The most important option in this panel is the ability to mirror


and paint at the same time on the both side of your polygonal
mesh. This is really useful for the spine weighting and tail.
-

Paint Weights

Inside this panel you can choose different "Paint Operations":


-
Add: add a specified value of influence to that relative
vertex;
-
Replace: replace the old vertex weight with a specified
one;
-
Smooth: blend a weight value between two or more
vertices.

(very useful)
-

When we use this paint tool a "Paint Skin Weights Tool" panel will
be appear automatically on the right of your viewport.
(Picture 11 _09)
Picture 11 _09

Influence

In this panel all the joints which are bound to our smooth
skinned geometry are listed. They will be sorted alphabetically
order or by hierarchy.
If you have correctly named all your skeleton joints it should not
be hard for you to find the selection that you want.
The "Toggle Weights on Selected" button is really useful if you
want to keep and hold the value of one or more joints when
you use the "Smooth" paint operation.

This is the influence weight of "GA00_M_spine_0_JNT" root spine


joint (hip) and it looks quite similar to underpants :)
(Picture 11 _15)
Picture 11 _15

This is the weight influence of the "GA00_M_spine_2_JNT" chest


joint , you can see that is seems to be a shirt shape.
(Picture 11 _17)
Picture 11 _17

So...now you have the necessary information to start painting


you character! I recommend you to first paint the spine then
the right side because these weight values can be mirrored to
the opposite side.
Here are some sample images of joint influences for the body
of our character.
(Picture 11 _14)

322

32 3

This is the weight influence of the "GA00_M_head_a_JNT" joint,


I only use one joint to paint all the head because of facial
animations (explained in the next chapters) I will use a different
method to deform the face vertices.

Picture 11 _13

Picture 11 _14

How to mirror skin weights values

When you are satisfied with your painted left side weights you
can easily mirror (if you have a good uv map, no overlapping
) to the right side using "Mirror Skin Weights Tool":

During painting I often use keyframes to create some extreme


poses. This can help to reveal any weighting problems. You can
use the timeslider to moving between the poses.

-
Skin ---> Edit Smooth Skin ---> Mirror Skin Weights with
option box , mirror across "YZ" and "positive" direction.
(Picture 11 _07) (Picture 11 _08)

Use the "Smooth" paint operation to fix and obviously smooth the
influence between joints. (Picture 11 _12) (Picture 11 _13)

Picture 11 _07

Picture 11 _12

This "Prune Small Weights Tools" turns unexpected weight values


to zero.
To use this :
Prune Small Weights Tool

When we paint a character, sometimes we can make some


small error in painting: (Picture 11 _14)

-
Skin ---> Edit Smooth Skin ---> Prune Small Weights with
option box. Choose the more appropriate value for your scene;
(Picture 11 _15)
Picture 11 _15

Picture 11 _08

As this quick and concise method mirroring can speed up the


process.

324

325

How to mirror skin weights values

Exporting skin weight maps is a good habit which helps us not


to lose work on vertex assignment. This procedure is a little
slow because we are exporting a huge number of maps, one
for each joint used in binding.

This is an example image of a weight map image for "GA00_


M_spine_0_JNT"and "GA00_M_spine_1_JNT"

12 _Second deformation step :


Additional deformation passes

Picture 12 _03

Picture 11 _06

In the enveloping/binding process sometimes a character TD


needs to work harder to achieve good geometric deformations.
The important thing is to prepare a good first deformation
pass and just in case add some "deformation tweaks" e.g. Maya
sculpt object or other deformation tools. For example, for our
Gaston character, we need a couple of sculpt objects to keep
his body volume during motion.

For Gaston I have exported approximately 90 weight maps in


TIF image format.
To export all the skin weight maps :
-
Skin ---> Edit Smooth Skin ---> Export Skin Weight Maps
with options "Luminance", map size XY "1024", image format "TIFF".
(Picture 11 _05) (Picture 11 _06)

Adding sculpt objects to keep Gaston shape volume

Picture 11 _05

To maintain the volume of both of Gaston's femurs it is useful to


use a sculpt object (see Maya help for more information). Start
with :
Every time you need to import your weight maps again you
can use " Import Skin Weight Maps" :)
The first deformation pass using the smooth skin tool is done but
maybe we are not completely happy with how the character
body moves. If this is the case you will have to repeat steps from
earlier chapters.

-
Create two nurbs sphere object and place them in
the positions shown in the picture. Freeze transformations and
rename them "GA00_L_femur_SCL " and "GA00_R_femur_SCL ";
-
parentConstrain these two objects to the relative femur
joint "GA00_L_femur_JNT"; (Picture 12 _02)

Picture 11 _06

Picture 12 _02

-
Select the body mesh and the "GA00_R_femur_SCL " and
press in the menu:
Deform ---> Create Sculpt Deformer with option , mode "flip" ,
inside mode "ring",
Max Displacement value "0.100", Dropoff Distance value "0.6".
(Picture 12 _03) (Picture 12 _01)

326

327

Delete the the Sculpt origin locators;

Gaston belly control

-
Hide the two sculpt spheres and parent under "notrasf"
group;
Done! You can also add more sculpt objects to maintain, for
example, the volume of the arm. (Picture 12 _04)
Picture 12 _04

Picture 12 _07

A funny control to animate for Gaston is the belly, although it


is not difficult to add.
Start with :

Hide the locator and the joint;

Parent "GA00_belly_LOC" under "GA00_M_pelvis_CTL";

Connect the visibility of this belly control to the "M_spine_ctl_vis";


(Picture 12 _09)

-
Create a joint and place it in the middle of the belly,
rename it "GA00_belly_JNT";

Picture 12 _09

-
Import a control shape like the knee pole vector control
and snap it to the locator. Move +2 in "translateZ"
and then
freeze transformations and rename it "GA00_belly_CTL";
-
Create a parent locator of that control. Freeze the
transformations and rename it properly "GA00_belly_LOC";
-
Parent the belly control, "GA00_belly_CTL", under "GA00_
belly_LOC".
-
Parent "GA00_belly_JNT" under
(Picture 12 _06)

"GA00_belly_CTL";

Picture 12 _06

Sculpt object deformations slow down our rig a little bit. To


add more control to the velocity of our rig we can create
"boolean" type attribute on "GA00_name_SHP" called "adv_def"
and connect (using connection editor) to the envelope value
of each sculpt object. This allow us to turn on or off all the
advanced deformations objects used in the rig.
(Picture 12 _05)

-
Use the paint skin tool to paint the weight of the belly
joint; (Picture 12 _08)
Picture 12 _08

Remember to include your new control with the Gaston control


Set, to do that open :
Window ---> Relationship Editors ---> Sets
Picture 12 _10

Picture 12 _05

Next add an influence object ("GA00_belly_JNT") to our skin


system :
-
Select the geometry and shift select the belly joint. Press
Skin ---> Edit Smooth Skin ---> Add Influence with options, use
default. (Picture 12 _07)

328

329

In this window first select the set and then click on the belly
control to add it. (Picture 12 _11)

Picture 12 _12

Picture 12 _11

-
Change the value of Low Bound to "0" and High Bound
to "2". Then place the Nonlinear deformer at the base of
Gaston, the same place as the "GA00_nonlin_base_CTL";
(Picture 12 _14) (Picture 12 _15)

Picture 12 _16

Picture 12 _14

Hide the visibility of all this new deformer.

Some connections:
Picture 12 _15

Full Body Squash and Stretch System

-
Connect the "GA00_nonlin_top_CTL.translateY" with the
value "factor" of the squash Nonlinear deformer;
-
Connect the "GA00_nonlin_top_CTL.rotateY" attribute with
"twist1.endAngle";

This consist of creating a couple of non linear deformers driven


by two controls, one placed on the base and one on the top
of Gaston head.

-
Connect the "GA00_nonlin_base_CTL.rotateY" attribute
with "twist1.startAngle";

Once complete these two controls will allow the animator


to squash, stretch and bend the full body. This is funny to
animate.

-
Connect the "GA00_nonlin_top_CTL.translateX" attribute
with "bend1.curvature";

Start with:

Now select "GA00_geo_GRP" group and in the menu:

-
Create two controls with a shape similar to the picture
and put one at the base of Gaston and the other a little
bit above to the head. Freeze transformations and rename it
respectively "GA00_nonlin_base_CTL" and "GA00_nonlin_top_CTL";
(Picture 12 _12)

-
Deform ---> Create Nonlinear ---> Squash
(Picture 12 _13)

-
Connect the "GA00_nonlin_top_CTL.translateZ" attribute
with "bend2.curvature";
-
Create a new "boolean" type attribute on GA00_name_
SHP called "nonlinear_ctl_vis" and connect with the shape
visibility of the two Nonlinear controls.

Picture 12 _13

-
Parent the "GA00_nonlin_base_CTL"
control of Gaston ("GA00_local_body_CTL");

under

the

local

Done :)
(Picture 12 _17)

-
Repeat the same process to create the two bends (the
second one rotated of -90 degree on the Y axes) and a twist
Nonlinear deformer;
In the Outliner the hierarchy will appear like this:
(Picture 12 _16)
330

331

Picture 12 _17-18

Non-keyable" in the Right Display option of the Connection Editor


window. (Picture 12 _20) (Picture 12 _21)

Picture 13 _02

13 _Facial Rig

Picture 12 _20

Picture 13 _01

Picture 13 _03

Global Movement Pivot Control

The global movement pivot control is a control to change the


rotation position of the world of our rig. If in animation we use
the "GA00_local_body_CTL", the pivot is placed at the base every
time. Sometimes however if Gaston's need to swim or jump or
do a flip, the pivot may need to be in the middle of the body
or a similar location.

Picture 12 _21

The most important part of a character during the acting


process is the face, body expressions are also important but the
face is vital.

To create this animation system :


-
Import or create a control with a star or recognizable
shape and snap it to the "GA00_local_body_ctl_LOC". Freeze
transformations and rename with "GA00_mvp_CTL" ;
(Picture 12 _19)

During this chapter we shall analyze :

Picture 12 _19

-
Parent "GA00_mvp_CTL" under "GA00_global_body_CTL".
-
Add this new control to the selection set ("GA00_body_
controls_SET");
Remember you can only use this control to change the rotation
point of Gaston at the beginning of your animation because
if you alter it more than once you will have weird global
movements.

-
Connect "GA00_mvp_CTL" translations to the "Rotate Pivot"
attribute in the "GA00_local_body_ctl_LOC" and directly connect
the rotations to the rotation of the locator.

-
Eye animation rig : aiming
animation;
-
Eye Blink setup;
-
Eyebrow animation rig ;
-
Jaw animation rig ;
-
Mouth animation rig;
-
Tongue animation rig;
-
Ear animation rig;

of

the

eye

and

pupil

-
Create a parent locator for left and right eye controls
called respectively "GA00_R_eye_LOC" and "GA00_L_eye_
LOC", place both under "GA00_M_eye_aim_CTL", freeze the
transformations. (Picture 13 _04)
Picture 13 _04

Eyes Setup

This section explains a method to prepare a good eye rig,


Start:
-
Import or create three control shape for the eye aim,
one main control and two for the left and right eye, freeze
transformations and rename them properly (e.g "GA00_M_eye_
aim_CTL" "GA00_L_eye_CTL" "GA00_R_eye_CTL")
(Picture 13 _02) (Picture 13 _03)

To find the "Rotate Pivot" attribute you have to turn on "Show


332

333

Select the pupil's vertex of the left eye mesh and press:

Deform ---> Create Cluster with "relative" option turned on,


rename it properly ("GA00_L_eye_CLS")
Using this cluster deformer create a group of vertices that you
can move, rotate and scale at the same time.
Parent the cluster under a new group called "GA00_notrasf_
face_GRP" and hide it. (Picture 13 _05) (Picture 13 _06)

-
Create a parent group of "GA00_L_eye_GEO", rename it
"GA00_L_eye_GRP";
-
Select the left eye control "GA00_L_eye_CTL" shift select
the "GA00_L_eye_GRP" and press:


Constrain ---> Aim with "maintain offset" option enabled
and "none" with world up type. (Picture 13 _07)
Picture 13 _07

Picture 13 _05

Picture 13 _06

This constraint works like the aiming cannon of a tank, we "look


at" the target object every time we take aim. This is what we
want to control the eye.
-
Lock and hide all the useless attribute on the eye. In this
rig we shall only using the X and Y translations and all the scale
values;
-
Lock and hide all the attributes of the main aim control
of the eye (except the rotations).
-
Connect "GA00_L_eye_CTL .scale" "with GA00_L_eye_CLS.
scale";
Cool, we are now able to decide the size value of the pupil.
Repeat this process for the right eye.
-
Now create a "float" type attribute on "GA00_M_eye_
aim_CTL" called "cross_eyed";
In the animation
expression:

33 4

expression

editor

window,

add

new

335

GA00_R_eye_LOC.translateX = - GA00_L_eye_LOC.translateX;
- Connect "GA00_M_eye_aim_CTL.cross_eyed" to "GA00_L_eye_
LOC.translateX";
This "cross_eyed" attribute drives the position of the both eye
locators allowing for the eyes to reach both cross eyed and
wall eyed positions. (Picture 13 _08)

-
Add this new joint to the skin cluster deformer. Select the
joint and shift select the mesh :
Skin ---> Edit Smooth Skin ---> Add Influence with option box. Set
"Lock Weights"on and default weight value "0";
(Picture 13 _10)

Picture 13 _12

- Create or import a new shape for the head control. Place it


in a easily accessible position and rename it "GA00_face_CTL" .
ParentConstrain it to the head joint ("GA00_M_head_a_JNT");
(Picture 13 _14)
Picture 13 _14

Picture 13 _10

Picture 13 _08

-
Paint the weight of this new joint using "Paint Skin Weight
Tool", rotate the "X" joint value to reach the upper blink position
of the mesh vertex point; (Picture 13 _11)

Picture 13 _13

Picture 13 _11
Blink animation setup

One of the most important features to make a character


believable is eyes blinking.
To make Gaston's blink:
-
place a single joint, in the same pivot position as the left
eye geometry and rename it "GA00_L_ublink_JNT".
(Picture 13 _09)

-
Add four "float" type attributes called "L_ublink" "R_ublink"
"L_lblink" "R_lblink", these attribute will drive the rotation "X" of
our blink joint;

Picture 13 _09

-
create another joint in the same position as the previous
and rename it "GA00_L_lblink_JNT";
-
add it to the skin cluster and paint the weight to reach
the lower blink position;
(Picture 13 _12) (Picture 13 _13)

-
Now select
"GA00_R_ublink_JNT" "GA00_R_lblink_JNT"
and use the "Mirror Joint Tool" to duplicate those new joints.
-
You don't have to repaint the weights because these can
be mirrored symmetrically to the other side.
To do this use "Mirror Skin Weights" and Tadaaa its done :)

Connect "L_ublink" with "GA00_L_ublink_JNT.rotateX" ;

Connect "L_lblink" with "GA00_L_lblink_JNT.rotateX" ;

Connect "R_ublink" with "GA00_R_ublink_JNT.rotateX";

Connect "R_lblink" with "GA00_R_lblink_JNT.rotateX" ;

-
Create two new attributes called "L_blink_orient" "R_
blink_orient";
-
Connect "L_blink_orient" with "GA00_L_ublink_JNT.rotateZ"
and "GA00_L_lblink_JNT.rotateZ";

Next step:
336

337

-
Connect
"R_blink_orient"
with
"GA00_R_ublink_JNT.
rotateZ" and "GA00_R_lblink_JNT.rotateZ";
-
Select all the blink joints and create a parent group
called "GA00_blink_jnt_GRP";

Picture 13 _16

-
SFM";

Rename this new modification "GA00_L_eyebrow_a_

Picture 13 _21

Now if you move this new "s" shaped handle you can create
cool eyebrow expressions, "sad" and "angry".

-
ParentConstrain "GA00_blink_jnt_GRP" to the "GA00_M_
head_a_JNT";

(Picture 13 _19) (Picture 13 _20)


Picture 13 _19

Gaston now has more life....and he decides to take a nap :P


(Picture 13 _15)
Picture 13 _15

-
with this tool open, use shift+CTRL to add a vertex to
the membership. Select the two vertices in the middle of the
eyebrow; (Picture 13 _22)

Picture 13 _17

Picture 13 _22

Picture 13 _20

Eyebrows Setup

Picture 13 _18

For the eyebrow setup we will use "Soft Modification


Deformer":
-
Select a vertex at the beginning of the left eyebrow
mesh and press:
At this point you can manually move the shape of the eyebrow
but it is difficult for an animator to control that. We must create
four new attributes and drive these two deformers with them.

Deform ---> Soft Modification with option "Mask Unselected" off


and "Falloff around
Selection" On, "Falloff Radius" value of "0.6";
(Picture 13 _16) (Picture 13 _17) (Picture 13 _18)

-
Duplicate "GA00_L_eyebrow_a_SFM" and rename with
"GA00_L_eyebrow_b_SFM";
-
Assign a different set of mesh vertices for this new
deformer using:
Deform ---> Edit Membership Tool
(Picture 13 _21)

338

-
Add two float type attribute called "L_eyebrow_a" and
"L_eyebrow_b" with a minimum value of "-1", a maximum of "1",
and default of "0" to the "GA00_face_CTL".
-
Create a drivenkey using the first attribute to drive the
"GA00_L_eyebrow_a_SFM" position in the space for a "sad"
position and "angry" position. Remember that you have to drive
the transformations translations and rotations of the handle:

339

-
"L_eyebrow_a" set to "0" , "GA00_L_eyebrow_a_SFM" set
all transformations to zero.

Picture 13 _24

Parent "GA00_jaw_a_LOC" under "GA00_jaw_CTL";

Picture 13 _28

-
Create a parent locator of "GA00_jaw_CTL" called "GA00_
jaw_ctl_LOC" (Picture 13 _26) (Picture 13 _27)

-
"L_eyebrow_a" set to "-1" , "GA00_L_eyebrow_a_SFM" set
to your chosen "sad" position;

Picture 13 _26

-
"L_eyebrow_a" set to "1" , "GA00_L_eyebrow_a_SFM" set
to your chosen "angry" position;
-
"L_eyebrow_b" set to "0" , "GA00_L_eyebrow_b_SFM" set
all transformations to zero.
-
"L_eyebrow_b" set to "-1" , "GA00_L_eyebrow_b_SFM" set
to your chosen "sad" position;

Picture 13 _27

-
"L_eyebrow_b" set to "1" , "GA00_L_eyebrow_b_SFM" set
to your chosen "angry" position;
-

Hide all the "_SFM" objects.

With these two controls you can create different cool expressions
:)
Repeat this process for the other eyebrow. Duplicate the control
to the other side create a duplicate copy and change the pivot
manually to the right eyebrow vertex point.
(Picture 13 _23)

-
add this joint to the skin cluster (with the same procedure
that we have already used for the blink system) and paint the
weight; (Picture 13 _25)

Mouth Setup

Picture 13 _25

Picture 13 _23

-
Hide the shape of both the jaw control and joint
locators;
-
Select the lower gum and the teeth and create a group
called "GA00_l_mouth_obj_GRP". ParentConstrain to the "GA00_
M_jaw_a_LOC" locator.
-
Create a "boolean" type attribute for "GA00_jaw_CTL"
called "teeth_vis" and connect the visibility attributes of the teeth
and gum geometry.
Gaston now can now move the jaw but he cannot do any
phonemes. We need to improve the mouth controls.

The main idea is to create a bunch of joints driven by controls


that move around a guide surface. This method allow the
animator to have only two animation curves ( x and y axes ) to
manage and not three. This is a big improvement because we
save 1/3 of our time.
Start with:
-
Place mouth joint around the lips (only on the left side)
and rename it properly (e.g. Middle mouth joints "GA00_M_
umouth_0_JNT", left mouth lower joints "GA00_L_lmouth_0_LOC");
(Picture 13 _29)

Picture 13 _29

(Picture 13 _28)

Jaw Setup

Start with:
-
create a joint called "GA00_M_jaw_a_JNT" and place
"anatomically-cartoony" correct. Remember to not rotate the joint
but only move the position using "insert" on your keyboard;
-
Create a parent locator called "GA00_M_jaw_a_LOC".
Look at the picture to locate the position where I placed that
joint: (Picture 13 _24)

3 40

-
Import a new control for the jaw. This time I shall use a
triangle shaped control. Place in the same position as the jaw
locator and freeze the transformations. Rename it as "GA00_
jaw_CTL";
3 41

-
side;

Use mirror joint tool to duplicate the joint to the other

-
Create a parent locator for each joint and freeze
transformations; (Picture 13 _30)
Picture 13 _30

This surface will be the guide for the movement of our parent
locators of the mouth joints.
Some connections:
-
geometryConstrain each joint's parent locators to the
guide surface (every "rmouth_LOC" and "lmouth_LOC" with
"GA00_mouth_guide_SHP").
In Mel:

In Mel:

-
Select all "_umouth" controls and create a parent group
called "GA00_umouth_ctl_GRP";

//
select -r GA00_body_GEO ;
select -add "*mouth*_JNT";
skinClusterInfluence 1 "-ug -dr 4 -ps 0 -ns 10 -lw true -wt 0";
//

-
Paint every right mouth joint influence using "Paint Skin
Weight Tool". When you are satisfied with one side, mirror the
weight map to the other side; (Picture 13 _33) (Picture 13 _34)

//
select "*mouth*_LOC";
$list = `ls -sl`;
for ($item in $list)

{

geometryConstraint -weight 1 GA00_mouth_guide_SHP $item;

}
//

Picture 13 _31

-
Select all "_lmouth" controls and create a parent group
called "GA00_lmouth_ctl_GRP";
-
ParentConstrain "GA00_lmouth_ctl_GRP" to the "GA00_M_
jaw_a_JNT" head joint;
-

Unhide "GA00_mouth_guide_SHP";

-
Select "GA00_M_head_a_JNT" "GA00_M_jaw_a_JNT" and
shift select the guide geometry "GA00_mouth_guide_SHP".Add a
skin deformer to that surface;
Picture 13 _33

At this point the translations are not in the zero position, This is
not a problem.
-
Create a nurbs sphere control for each locator. Freeze
transformations and rename it properly (e.g. "GA00_L_lmouth_
0_CTL"); (Picture 13 _31)

-
ParentConstrain "GA00_umouth_ctl_GRP" to the "GA00_
M_head_a_JNT" head joint;

-
Paint the weights of the two bones to that guide surface;
(Picture 13 _35) (Picture 13 _36)
Picture 13 _35

-
parentConstrain every locator, maintaining offset with
relative controls.
-

Hide the shape of all the joint locators;

In Mel:
//
select "*mouth*_LOC";
$list = `ls -sl`;

-
Create a nurbs guide surface. Change the shape as
shown and rename "GA00_mouth_guide_SHP";
Remember that the area of this guide surface MUST BE very
close to the joints position. (Picture 13 _32)
Picture 13 _32

for ($item in $list)



{

string $namestrip = `substring $item 1 (size($item)-4)` + "_CTL";

parentConstraint -mo $namestrip $item;

setAttr ($item+"Shape.visibility") 0;

}
//

Picture 13 _34
Picture 13 _36

Hide the "GA00_mouth_guide_SHP" guide shape.

Add all the mouth joints to the skin deformer:


-
Select the Gaston geometry ("GA00_body_GEO") and shift
select all the mouth joints Skin ---> Edit Smooth Skin ---> Add
Influence with "Lock Weights" enabled and default weight set to
"0";

3 42

3 43

Set all the top vertices of the nurbs surface's head joint influence
to "1", the middle to "0.7", set jaw joint influence to "1" for all the
bottom vertecies and "0.3" for the middle vertecies.
When you move the jaw control, the guide shape follow the
movement and the mouth joint we also follow.
-

Add a parent locator for each tongue circle controls;

-
ParentConstrain and scaleConstrain each joint to the
relative tongue controls; (Picture 13 _38)
Picture 13 _38

Once again, hide "GA00_mouth_guide_SHP";

"GA00_L_ear_dyn_CRV" ;

-
Parent
group;

-
Create an IK spline handle using the new dynamics
curve. Rename the IK handle to "GA00_L_ear_dyn_HIK";
(Picture 13 _41)

-
Lock and hide the useless attributes on the mouth controls
e.g. the "translateZ, "rotationY" and rotationZ" and all the scale
values.

"GA00_tongue_GEO"

under

"GA00_geo_GRP"

Unhide all the geometry;

Change the follicle "Point Lock" option to "Base";

Picture 13 _41

Done.
Ears Setup

Ear setup is simple because it is identical to the tail setup.


Begin with:

This rig is similar to the tail rig:


-

-
Create a parent locator for the main tongue root control
"GA00_tongue_root_CTL" and rename it "GA00_tongue_root_ctl_
LOC";

-
Place the ear joints chain. Orient the chain. Rename all
the joints e.g. "GA00_L_ear_a_JNT". (Picture 13 _40)

Hide all the geometry except the tongue mesh.

Picture 13 _40

-
Create a joint chain. Orient the joint and rename properly
(e.g. "GA00_tongue_a_JNT","GA00_tongue_b_JNT",etc... )
(Picture 13 _37)
Picture 13 _37

hide all the tongue control locators.

-
Select the main tongue joints ("GA00_tongue_a_JNT") shift
select the tongue geometry and add a smooth skin deformer.
-

-
Create a circle control for each joint of the "FK" chain
and also one for each cluster.

Paint the tongue skin weights.

(Picture 13 _39)

-
Create a parent locator for the first joint of the tongue
chain. Freeze transformations and rename it in
"GA00_tongue_root_LOC";
-
Import a "handle" shaped control (like the arm or leg
root controls). Place in the same position as the tongue locator.
Rename it "GA00_tongue_root_CTL" and freeze transformations;
-
Parent "GA00_tongue_root_LOC" under "GA00_tongue_
root_CTL";
-
Create a nurbs circle control for each joint of the tongue
chain except the first and the last. Freeze transformations and
rename it "GA00_tongue_a_CTL" "GA00_tongue_b_CTL", etc.. ;
3 44

-
Import or create a handle control for the left ear. Snap
it to the base of the first ear joint. Freeze transformations and
rename it "GA00_L_ear_CTL";
Picture 13 _39

Create a parent locator of this control;

-
Create two duplicates of the left ear chain and rename
them with the "_fk_JNT" and "_dyn_JNT"suffix;
-
Create a curve with the CV point in the same positions
and numbers as the "_dyn" joints chain. Rename it "GA00_L_
ear_CRV";
-
Create clusters for each CV point of your "GA00_L_ear_
CRV".Curve using "cluster curve" tool. Rename them properly;
-

Make the curve dynamic.

-
Create a parent locator for all the controls, and rename
them properly;
-

Parent "GA00_L_ear_c_LOC" under GA00_L_ear_b_CTL;

-
CTL;

Parent "GA00_L_ear_c_crv_LOC" under GA00_L_ear_c_

-
Parent "GA00_L_ear_b_crv_LOC" under GA00_L_ear_
b_CTL;
-
CTL;

Parent "GA00_L_ear_c_crv_LOC" under GA00_L_ear_b_

(Picture 13 _42)

Rename the new curve to


345

Picture 13 _42

ear_b_JNT_parentConstraint1.GA00_L_ear_b_fk_JNTW0;
GA00_L_ear_c_JNT_parentConstraint1.GA00_L_ear_c_dyn_JNTW1 = 1 - GA00_L_
ear_c_JNT_parentConstraint1.GA00_L_ear_c_fk_JNTW0;
GA00_L_ear_d_JNT_parentConstraint1.GA00_L_ear_d_dyn_JNTW1 = 1 - GA00_L_
ear_d_JNT_parentConstraint1.GA00_L_ear_d_fk_JNTW0;
//

Picture 13 _44

-
Create a "float" type attribute called "dyn_to_FK" on the
main "GA00_L_ear_CTL" ear control;
-
Connect the "GA00_L_ear_CTL.dyn_to_FK" attribute to
each "W0" weight of every main joint of the base chain.

-
Hide all the new locators and the IK spline handle, the
two curve and the hair system;
Some connections:
-
parentConstrain "GA00_L_ear_CTL" to "GA00_L_ear_a_
dyn_CLS";

-
parent
-
-
-
-
-

Create a parent group called "GA00_L_ear_GRP" and


under :
all the ear joint chain;
all the clusters;
the IK handle;
the hair system node;
the main ear locator;

Duplicate the rig for the right side, using this process or the
"brute force" method :)
Select both ear's base chain joints and add as influence to the
main body smooth skin. Paint the weights.

-
GRP"

Parent "GA00_notrasf_face_GRP" under "GA00_notrasf_

Select all the "eye", "face", "jaw", "mouth", "tongue" and ear
controls and create a new control set for the face called
"GA00_face_controls_SET".
(Picture 13 _45)

It's done.

-
parentConstrain "GA00_L_ear_b_CTL" to "GA00_L_ear_
b_fk_JNT";

Order and Connection with the Body Rig

-
parentConstrain "GA00_L_ear_d_CTL" to "GA00_L_ear_
d_fk_JNT";

We need to create some hierarchy in order to connect the


facial setup to the entire body rig.
Start:

Chain connections:

3 46

all the soft modification tools "_SFM";


all the mouth joint locators;
"GA00_mouth_guide_SHP";
"GA00_blink_jnt_GRP";
"GA00_umouth_ctl_GRP";
"GA00_lmouth_ctl_GRP";
"GA00_L_ear_GRP" and "GA00_R_ear_GRP";

Face control Set

-
parentConstrain "GA00_L_ear_CTL" to "GA00_L_ear_a_
fk_JNT";

//
GA00_L_ear_a_JNT_parentConstraint1.GA00_L_ear_a_dyn_JNTW1 = 1 - GA00_L_
ear_a_JNT_parentConstraint1.GA00_L_ear_a_fk_JNTW0;
GA00_L_ear_b_JNT_parentConstraint1.GA00_L_ear_b_dyn_JNTW1 = 1 - GA00_L_

-
-
-
-
-
-
-

Picture 13 _43

-
parentConstrain "GA00_L_ear_d_crv_CTL" to "GA00_L_
ear_d_dyn_CLS";

Insert this line into the animation expression editor to change the
weighting of all the "fk" to "1" and automatically the weight the
"dyn" joints chain to "0" on the parentConstraint of main joints
chain:

Parent under "GA00_notrasf_face_GRP" :

-
Create a new "boolean" type attribute on "GA00_name_
SHP" called "facial_ctl_vis" and connect all the visibility attributes
of every face controls.

-
parentConstrain "GA00_L_ear_c_crv_CTL" to "GA00_L_
ear_c_dyn_CLSe";

-
ParentConstrain each joint of the main chain to the "_fk"
and the "_dyn" joints chain;

-
Add all the new facial joints to the "_jnt_DSP" display
layer set.

(Picture 13 _43)

-
parentConstrain "GA00_L_ear_b_crv_CTL" to "GA00_L_
ear_b_dyn_CLS";

jaw_a_LOC" and snap the pivot point to the same position as the
jaw joint.

snap the point of this group to the world origin;

(Picture 13 _44)

Create a group called "GA00_face_rig_GRP";

Parent under "GA00_face_rig_GRP" :

-
-
-

"GA00_jaw_ctl_LOC";
"GA00_face_CTL";
"GA00_L_ear_LOC"" and "GA00_R_ear_LOC";

-
CTL";

Parent "GA00_jaw_ctl_LOC" under "GA00_M_neck_elx_

-
-

Parent "GA00_M_eye_aim_CTL" under "GA00_face_CTL";


Parent "GA00_tongue_root_ctl_LOC" under "GA00_M_
3 47

Picture 13 _45

of "GA00_gui_LOC" gui locator. (Picture 14 _02)

14 _Additional Stuff

Picture 14 _03
Picture 14 _02

Mouth Phonemes Preset

A useful addition to the rig could be an interface how automatically


drive the mouth control positions to allow for preset positions like
the phonemes. This is very useful for animators.
First create a different shape for each phoneme (text inside a
nurbs circle). (Picture 14 _01)
Picture 14 _01

Using a Mel command we can open a pop up window for the


GUI camera, I wrote a script for this procedure:
// Face Gui Popup window
string $faceguiwindow;
select "*gui_fac_CAM";
$cam =`ls -sl`;
if(`window -query -exists $faceguiwindow`)
deleteUI $faceguiwindow;
$faceguiwindow = `window -w 300 -h 300 "Face Rig GUI"`;
paneLayout;
modelPanel -mbv 0 -cam $cam;
showWindow $faceguiwindow;
//

Looks a bit like contemporary art!


-
Rename each shape properly with the relevant name
(e.g. "GA00_ai_SHP", "GA00_mbp_SHP",etc...);
-
Turn off the "Primary visibility" option for each control
shape (we don't want to render this!)
-
Create a camera that aims at the front of this shape.
Rename it "GA00_gui_fac_CAM" and turn off the "renderable"
option.
-
Create a parent group for the shape and the camera
called "GA00_gui_LOC";
-
-
3 48

Parent "GA00_gui_LOC" under "GA00_global_body_CTL" ;


Connect the "GA00_name_SHP.facial_ctl_vis" to the visibility

Put this script on your shelf.


(Picture 14 _03)

The next step is to save the poses of our mouth controls


Create a base pose with all zero values.
global proc GA00_base_mouth ()
{
string $list[] =`ls -sl `;
int $ctl = `gmatch $list[0] "*_base_SHP"`;
if ($ctl ==1) {

setAttr "GA00_jaw_CTL.translateX" 0;

setAttr "GA00_L_umouth_3_CTL.translateX"

setAttr "GA00_L_umouth_2_CTL.translateX"

setAttr "GA00_L_umouth_1_CTL.translateX"

setAttr "GA00_L_umouth_0_CTL.translateX"

setAttr "GA00_M_umouth_0_CTL.translateX"

setAttr "GA00_R_umouth_0_CTL.translateX"

setAttr "GA00_R_umouth_1_CTL.translateX"

setAttr "GA00_R_umouth_2_CTL.translateX"

setAttr "GA00_R_umouth_3_CTL.translateX"

setAttr "GA00_M_lmouth_0_CTL.translateX"

setAttr "GA00_L_lmouth_0_CTL.translateX"

setAttr "GA00_L_lmouth_1_CTL.translateX"

setAttr "GA00_L_lmouth_2_CTL.translateX"

setAttr "GA00_R_lmouth_2_CTL.translateX"

setAttr "GA00_R_lmouth_1_CTL.translateX"

setAttr "GA00_R_lmouth_0_CTL.translateX"

setAttr "GA00_jaw_CTL.translateY" 0;

setAttr "GA00_L_umouth_3_CTL.translateY"

setAttr "GA00_L_umouth_2_CTL.translateY"

0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;

3 49

setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr

"GA00_L_umouth_1_CTL.translateY"
"GA00_L_umouth_0_CTL.translateY"
"GA00_M_umouth_0_CTL.translateY"
"GA00_R_umouth_0_CTL.translateY"
"GA00_R_umouth_1_CTL.translateY"
"GA00_R_umouth_2_CTL.translateY"
"GA00_R_umouth_3_CTL.translateY"
"GA00_M_lmouth_0_CTL.translateY"
"GA00_L_lmouth_0_CTL.translateY"
"GA00_L_lmouth_1_CTL.translateY"
"GA00_L_lmouth_2_CTL.translateY"
"GA00_R_lmouth_2_CTL.translateY"
"GA00_R_lmouth_1_CTL.translateY"
"GA00_R_lmouth_0_CTL.translateY"

setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr

"GA00_jaw_CTL.translateZ" 0;
"GA00_jaw_CTL.rotateX" 0;
"GA00_L_umouth_3_CTL.rotateX"
"GA00_L_umouth_2_CTL.rotateX"
"GA00_L_umouth_1_CTL.rotateX"
"GA00_L_umouth_0_CTL.rotateX"
"GA00_M_umouth_0_CTL.rotateX"
"GA00_R_umouth_0_CTL.rotateX"
"GA00_R_umouth_1_CTL.rotateX"
"GA00_R_umouth_2_CTL.rotateX"
"GA00_R_umouth_3_CTL.rotateX"
"GA00_M_lmouth_0_CTL.rotateX"
"GA00_L_lmouth_0_CTL.rotateX"
"GA00_L_lmouth_1_CTL.rotateX"
"GA00_L_lmouth_2_CTL.rotateX"
"GA00_R_lmouth_2_CTL.rotateX"
"GA00_R_lmouth_1_CTL.rotateX"
"GA00_R_lmouth_0_CTL.rotateX"
"GA00_jaw_CTL.rotateY" 0;
"GA00_jaw_CTL.rotateZ" 0;
"GA00_jaw_CTL.teeth_vis" 1;

0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;

0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
0;


select -cl;

}
}
int $base_mouth = `scriptJob -kws -e "SelectionChanged" GA00_base_mouth`;
//end

duplicate this procedure and rename it "reset_mouth";

This script is evaluated every time the selection changes. When


this happens Maya will run the script as instructed "if u_shape
is selected set the value of that mouth control and clear the
selection at the end.
Add this procedure to a script node that will run when the
scene file is opened.
To do this :

350

-
Open the animation expression editor and go to :
Select Filter ---> By Script Node Name
-
-

Picture 14 _05

Insert the script and press "create";


Change the "Execute on" value to "Open/Close";

Remember to insert a reset_mouth procedure at the beginning


of your phonemes script to reset the values of the attributes:

Now, each time you open this scene Maya will automatically run
this ScriptJob. (Picture 14 _04)

global proc GA00_u_mouth ()


{
string $list[] =`ls -sl `;

Picture 14 _04

For the "key" button create a procedure to set a keyframe for


all the mouth controls like this:
//
global proc GA00_key_mouth ()
{
string $list[] =`ls -sl `;
int $ctl = `gmatch $list[0] "*_key_SHP"`;
if ($ctl ==1) {

select "*mouth*CTL" "*jaw*CTL";

SetKey;

select -cl;

}
}
int $key_mouth = `scriptJob -kws -e "SelectionChanged" GA00_key_mouth`;
//

Change the position of the mouth controls using the script editor
window, make a note of the Mel command that we are used
by Maya to make these changes. (Picture 14 _05)

Now create a script job (see Maya help for more information
about this Mel command).

for example this is the setting for the "U" vowel :


//
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
setAttr
//

int $ctl = `gmatch $list[0] "*_u_SHP"`;


if ($ctl ==1) {

reset_mouth;

setAttr "GA00_M_umouth_0_CTL.translateY" .15;

setAttr "GA00_M_lmouth_0_CTL.translateY" -.1;

setAttr "GA00_M_lmouth_0_CTL.rotateX" -50;

setAttr "GA00_L_umouth_1_CTL.translateY" -.3;

setAttr "GA00_L_umouth_1_CTL.translateX" -.25;

setAttr "GA00_L_lmouth_1_CTL.translateX" -.8;

setAttr "GA00_L_lmouth_1_CTL.translateY" .3;

setAttr "GA00_L_lmouth_0_CTL.translateY" 0.2;

setAttr "GA00_L_lmouth_2_CTL.translateX" -.32;

setAttr "GA00_R_umouth_1_CTL.translateY" -.3;

setAttr "GA00_R_umouth_1_CTL.translateX" .25;

setAttr "GA00_R_lmouth_1_CTL.translateX" .8;

setAttr "GA00_R_lmouth_1_CTL.translateY" .3;

setAttr "GA00_R_lmouth_0_CTL.translateY" 0.2;

setAttr "GA00_R_lmouth_2_CTL.translateX" .32;

setAttr "GA00_jaw_CTL.rotateX" -32;

setAttr "GA00_M_umouth_0_CTL.rotateX" -90;

setAttr "GA00_jaw_CTL.teeth_vis" 0;

select -cl;

}
}
int $u_mouth = `scriptJob -kws -e "SelectionChanged" GA00_u_mouth`;
// END

"GA00_M_umouth_0_CTL.translateY" .15;
"GA00_M_lmouth_0_CTL.translateY" -.1;
"GA00_M_lmouth_0_CTL.rotateX" -50;
"GA00_L_umouth_1_CTL.translateY" -.3;
"GA00_L_umouth_1_CTL.translateX" -.25;
"GA00_L_lmouth_1_CTL.translateX" -.8;
"GA00_L_lmouth_1_CTL.translateY" .3;
"GA00_L_lmouth_0_CTL.translateY" 0.2;
"GA00_L_lmouth_2_CTL.translateX" -.32;
"GA00_R_umouth_1_CTL.translateY" -.3;
"GA00_R_umouth_1_CTL.translateX" .25;
"GA00_R_lmouth_1_CTL.translateX" .8;
"GA00_R_lmouth_1_CTL.translateY" .3;
"GA00_R_lmouth_0_CTL.translateY" 0.2;
"GA00_R_lmouth_2_CTL.translateX" .32;
"GA00_M_umouth_0_CTL.rotateX" -90;
"GA00_jaw_CTL.rotateX" -32;

351

Picture 14 _06

15 _F inal Gaston E xpressions Rig

(1/

GA00_R_hand_middle_a_JNT.

(1/

GA00_R_hand_middle_a_JNT.

(1/

GA00_R_hand_middle_b_JNT.

(1/

GA00_R_hand_middle_b_JNT.

(1/

GA00_R_hand_middle_c_JNT.

(1/

GA00_R_hand_middle_c_JNT.

GA00_L_hand_index_c_JNT.scaleY = 1 * (1/ GA00_L_hand_index_c_JNT.scaleZ);

GA00_R_hand_middle_a_JNT.scaleX
scaleZ);
GA00_R_hand_middle_a_JNT.scaleY
scaleZ);
GA00_R_hand_middle_b_JNT.scaleX
scaleZ);
GA00_R_hand_middle_b_JNT.scaleY
scaleZ);
GA00_R_hand_middle_c_JNT.scaleX
scaleZ);
GA00_R_hand_middle_c_JNT.scaleY
scaleZ);

GA00_L_hand_middle_a_JNT.scaleX
scaleZ);
GA00_L_hand_middle_a_JNT.scaleY
scaleZ);
GA00_L_hand_middle_b_JNT.scaleX
scaleZ);
GA00_L_hand_middle_b_JNT.scaleY
scaleZ);
GA00_L_hand_middle_c_JNT.scaleX
scaleZ);
GA00_L_hand_middle_c_JNT.scaleY
scaleZ);

(1/

GA00_L_hand_middle_a_JNT.

(1/

GA00_R_hand_pinkie_a_JNT.

(1/

GA00_L_hand_middle_a_JNT.

(1/

GA00_R_hand_pinkie_a_JNT.

(1/

GA00_L_hand_middle_b_JNT.

(1/

GA00_R_hand_pinkie_b_JNT.

(1/

GA00_L_hand_middle_b_JNT.

(1/

GA00_R_hand_pinkie_b_JNT.

(1/

GA00_L_hand_middle_c_JNT.

(1/

GA00_R_hand_pinkie_c_JNT.

(1/

GA00_L_hand_middle_c_JNT.

GA00_R_hand_pinkie_a_JNT.scaleX
scaleZ);
GA00_R_hand_pinkie_a_JNT.scaleY
scaleZ);
GA00_R_hand_pinkie_b_JNT.scaleX
scaleZ);
GA00_R_hand_pinkie_b_JNT.scaleY
scaleZ);
GA00_R_hand_pinkie_c_JNT.scaleX
scaleZ);
GA00_R_hand_pinkie_c_JNT.scaleY
scaleZ);

(1/

GA00_R_hand_pinkie_c_JNT.

GA00_L_hand_pinkie_a_JNT.scaleX
scaleZ);
GA00_L_hand_pinkie_a_JNT.scaleY
scaleZ);
GA00_L_hand_pinkie_b_JNT.scaleX
scaleZ);
GA00_L_hand_pinkie_b_JNT.scaleY
scaleZ);
GA00_L_hand_pinkie_c_JNT.scaleX
scaleZ);
GA00_L_hand_pinkie_c_JNT.scaleY
scaleZ);

(1/

GA00_L_hand_pinkie_a_JNT.

(1/

GA00_L_hand_pinkie_a_JNT.

(1/

GA00_L_hand_pinkie_b_JNT.

GA00_R_hand_thumb_a_JNT.scaleX
GA00_R_hand_thumb_a_JNT.scaleY
GA00_R_hand_thumb_b_JNT.scaleX
GA00_R_hand_thumb_b_JNT.scaleY
GA00_R_hand_thumb_c_JNT.scaleX
GA00_R_hand_thumb_c_JNT.scaleY

1
1
1
1
1
1

(1/

GA00_L_hand_pinkie_b_JNT.

The expressions used in the Gaston Rig :


//
GA00_L_hand_index_a_JNT.scaleX
GA00_L_hand_index_a_JNT.scaleY
GA00_L_hand_index_b_JNT.scaleX
GA00_L_hand_index_b_JNT.scaleY
GA00_L_hand_index_c_JNT.scaleX

Once you have understood this procedure you will be able


to create any mouth pose that you want!!You can adapt this
procedure to create eye expressions.

352

=
=
=
=
=

1
1
1
1
1

*
*
*
*
*

(1/
(1/
(1/
(1/
(1/

GA00_L_hand_index_a_JNT.scaleZ);
GA00_L_hand_index_a_JNT.scaleZ);
GA00_L_hand_index_b_JNT.scaleZ);
GA00_L_hand_index_b_JNT.scaleZ);
GA00_L_hand_index_c_JNT.scaleZ);

(1/

GA00_L_hand_pinkie_c_JNT.

(1/

GA00_L_hand_pinkie_c_JNT.

GA00_L_hand_thumb_a_JNT.scaleX
GA00_L_hand_thumb_a_JNT.scaleY
GA00_L_hand_thumb_b_JNT.scaleX
GA00_L_hand_thumb_b_JNT.scaleY
GA00_L_hand_thumb_c_JNT.scaleX
GA00_L_hand_thumb_c_JNT.scaleY

=
=
=
=
=
=

1
1
1
1
1
1

*
*
*
*
*
*

(1/
(1/
(1/
(1/
(1/
(1/

GA00_L_hand_thumb_a_JNT.scaleZ);
GA00_L_hand_thumb_a_JNT.scaleZ);
GA00_L_hand_thumb_b_JNT.scaleZ);
GA00_L_hand_thumb_b_JNT.scaleZ);
GA00_L_hand_thumb_c_JNT.scaleZ);
GA00_L_hand_thumb_c_JNT.scaleZ);

GA00_R_hand_index_a_JNT.scaleX
GA00_R_hand_index_a_JNT.scaleY
GA00_R_hand_index_b_JNT.scaleX
GA00_R_hand_index_b_JNT.scaleY
GA00_R_hand_index_c_JNT.scaleX
GA00_R_hand_index_c_JNT.scaleY

=
=
=
=
=
=

1
1
1
1
1
1

*
*
*
*
*
*

(1/
(1/
(1/
(1/
(1/
(1/

GA00_R_hand_index_a_JNT.scaleZ);
GA00_R_hand_index_a_JNT.scaleZ);
GA00_R_hand_index_b_JNT.scaleZ);
GA00_R_hand_index_b_JNT.scaleZ);
GA00_R_hand_index_c_JNT.scaleZ);
GA00_R_hand_index_c_JNT.scaleZ);

=
=
=
=
=
=

*
*
*
*
*
*

(1/
(1/
(1/
(1/
(1/
(1/

GA00_R_hand_thumb_a_JNT.scaleZ);
GA00_R_hand_thumb_a_JNT.scaleZ);
GA00_R_hand_thumb_b_JNT.scaleZ);
GA00_R_hand_thumb_b_JNT.scaleZ);
GA00_R_hand_thumb_c_JNT.scaleZ);
GA00_R_hand_thumb_c_JNT.scaleZ);

GA00_M_tail_0_JNT.scaleX = (((GA00_M_tail_0_squash_hold_DMNShape.distance/
GA00_M_tail_0_squash_DMNShape.distance) *2 )-1);
GA00_M_tail_0_JNT.scaleZ = (((GA00_M_tail_0_squash_hold_DMNShape.distance/
GA00_M_tail_0_squash_DMNShape.distance) *2 )-1);
GA00_M_tail_1_JNT.scaleX = (((GA00_M_tail_1_squash_hold_DMNShape.distance/
GA00_M_tail_1_squash_DMNShape.distance) *2 )-1);
GA00_M_tail_1_JNT.scaleZ = (((GA00_M_tail_1_squash_hold_DMNShape.distance/
GA00_M_tail_1_squash_DMNShape.distance) *2 )-1);
GA00_M_tail_2_JNT.scaleX = (((GA00_M_tail_2_squash_hold_DMNShape.distance/
GA00_M_tail_2_squash_DMNShape.distance) *2 )-1);
GA00_M_tail_2_JNT.scaleZ = (((GA00_M_tail_2_squash_hold_DMNShape.distance/
GA00_M_tail_2_squash_DMNShape.distance) *2 )-1);

GA00_M_tail_0_JNT_pointConstraint1.GA00_M_tail_0_fk_JNTW2
tail_0_JNT_pointConstraint1.GA00_M_tail_0_elx_JNTW1;
GA00_M_tail_1_JNT_pointConstraint1.GA00_M_tail_1_fk_JNTW2

1-

GA00_M_

1-

GA00_M_

tail_1_JNT_pointConstraint1.GA00_M_tail_1_elx_JNTW1;
GA00_M_tail_2_JNT_pointConstraint1.GA00_M_tail_2_fk_JNTW0
tail_2_JNT_pointConstraint1.GA00_M_tail_2_elx_JNTW1;
GA00_M_tail_3_JNT_pointConstraint1.GA00_M_tail_3_fk_JNTW0
tail_3_JNT_pointConstraint1.GA00_M_tail_3_elx_JNTW1;

1-

GA00_M_

1-

GA00_M_

GA00_M_spine_0_JNT_parentConstraint1.GA00_M_spine_0_fk_JNTW1
spine_0_JNT_parentConstraint1.GA00_M_spine_crv_0_JNTW0;
GA00_M_spine_1_JNT_parentConstraint1.GA00_M_spine_1_fk_JNTW1
spine_1_JNT_parentConstraint1.GA00_M_spine_crv_1_JNTW0;
GA00_M_spine_2_JNT_parentConstraint1.GA00_M_spine_2_fk_JNTW1
spine_2_JNT_parentConstraint1.GA00_M_spine_crv_2_JNTW0;
GA00_M_spine_3_JNT_parentConstraint1.GA00_M_spine_3_fk_JNTW1
spine_3_JNT_parentConstraint1.GA00_M_spine_crv_3_JNTW0;

1-GA00_M_

1-GA00_M_

1-GA00_M_

1-GA00_M_

GA00_L_humerus_elx_JNT.scaleY = (((GA00_L_arm_humerus_squash_hold_DMNShape.
distance/GA00_L_arm_humerus_squash_DMNShape.distance) *2 )-1);
GA00_L_humerus_elx_JNT.scaleZ = (((GA00_L_arm_humerus_squash_hold_DMNShape.
distance/GA00_L_arm_humerus_squash_DMNShape.distance) *2 )-1);
GA00_L_elbow_elx_JNT.scaleY = (((GA00_L_arm_elbow_squash_hold_DMNShape.
distance/GA00_L_arm_elbow_squash_DMNShape.distance) *2 )-1);
GA00_L_elbow_elx_JNT.scaleZ = (((GA00_L_arm_elbow_squash_hold_DMNShape.
distance/GA00_L_arm_elbow_squash_DMNShape.distance) *2 )-1);
GA00_L_ulna_elx_JNT.scaleY
=
(((GA00_L_arm_ulna_squash_hold_DMNShape.
distance/GA00_L_arm_ulna_squash_DMNShape.distance) *2 )-1);
GA00_L_ulna_elx_JNT.scaleZ
=
(((GA00_L_arm_ulna_squash_hold_DMNShape.
distance/GA00_L_arm_ulna_squash_DMNShape.distance) *2 )-1);
GA00_L_humerus_ik_JNT.scaleX = 1 * (1/ GA00_L_humerus_ik_JNT.scaleZ);
GA00_L_humerus_ik_JNT.scaleY = 1 * (1/ GA00_L_humerus_ik_JNT.scaleZ);
GA00_L_elbow_ik_JNT.scaleX = 1 * (1/ GA00_L_elbow_ik_JNT.scaleZ);
GA00_L_elbow_ik_JNT.scaleY = 1 * (1/ GA00_L_elbow_ik_JNT.scaleZ);
GA00_L_ulna_ik_JNT.scaleX = 1 * (1/ GA00_L_ulna_ik_JNT.scaleZ);
GA00_L_ulna_ik_JNT.scaleY = 1 * (1/ GA00_L_ulna_ik_JNT.scaleZ);
GA00_R_humerus_elx_JNT.scaleY = (((GA00_R_arm_humerus_squash_hold_DMNShape.
distance/GA00_R_arm_humerus_squash_DMNShape.distance) *2 )-1);
GA00_R_humerus_elx_JNT.scaleZ = (((GA00_R_arm_humerus_squash_hold_DMNShape.
distance/GA00_R_arm_humerus_squash_DMNShape.distance) *2 )-1);
GA00_R_elbow_elx_JNT.scaleY = (((GA00_R_arm_elbow_squash_hold_DMNShape.
distance/GA00_R_arm_elbow_squash_DMNShape.distance) *2 )-1);
GA00_R_elbow_elx_JNT.scaleZ = (((GA00_R_arm_elbow_squash_hold_DMNShape.
distance/GA00_R_arm_elbow_squash_DMNShape.distance) *2 )-1);
GA00_R_ulna_elx_JNT.scaleY
=
(((GA00_R_arm_ulna_squash_hold_DMNShape.
distance/GA00_R_arm_ulna_squash_DMNShape.distance) *2 )-1);
GA00_R_ulna_elx_JNT.scaleZ
=
(((GA00_R_arm_ulna_squash_hold_DMNShape.
distance/GA00_R_arm_ulna_squash_DMNShape.distance) *2 )-1);

353

GA00_R_humerus_ik_JNT.scaleX = 1 * (1/ GA00_R_humerus_ik_JNT.scaleZ);


GA00_R_humerus_ik_JNT.scaleY = 1 * (1/ GA00_R_humerus_ik_JNT.scaleZ);
GA00_R_elbow_ik_JNT.scaleX = 1 * (1/ GA00_R_elbow_ik_JNT.scaleZ);
GA00_R_elbow_ik_JNT.scaleY = 1 * (1/ GA00_R_elbow_ik_JNT.scaleZ);
GA00_R_ulna_ik_JNT.scaleX = 1 * (1/ GA00_R_ulna_ik_JNT.scaleZ);
GA00_R_ulna_ik_JNT.scaleY = 1 * (1/ GA00_R_ulna_ik_JNT.scaleZ);
GA00_R_ear_a_JNT_parentConstraint1.GA00_L_ear_a_dyn_JNTW1 = 1 - GA00_R_
ear_a_JNT_parentConstraint1.GA00_L_ear_a_fk_JNTW0;
GA00_R_ear_b_JNT_parentConstraint1.GA00_L_ear_b_dyn_JNTW1 = 1 - GA00_R_
ear_b_JNT_parentConstraint1.GA00_L_ear_b_fk_JNTW0;
GA00_R_ear_c_JNT_parentConstraint1.GA00_L_ear_c_dyn_JNTW1 = 1 - GA00_R_
ear_c_JNT_parentConstraint1.GA00_L_ear_c_fk_JNTW0;
GA00_R_ear_d_JNT_parentConstraint1.GA00_L_ear_d_dyn_JNTW1 = 1 - GA00_R_
ear_d_JNT_parentConstraint1.GA00_L_ear_d_fk_JNTW0;
GA00_L_femur_elx_JNT.scaleY = (((GA00_L_leg_femur_squash_hold_DMNShape.
distance/GA00_L_leg_femur_squash_DMNShape.distance) *2 )-1);
GA00_L_femur_elx_JNT.scaleZ = (((GA00_L_leg_femur_squash_hold_DMNShape.
distance/GA00_L_leg_femur_squash_DMNShape.distance) *2 )-1);
GA00_L_tibia_a_elx_JNT.scaleY = (((GA00_L_leg_tibia_a_squash_hold_DMNShape.
distance/GA00_L_leg_tibia_a_squash_DMNShape.distance) *2 )-1);
GA00_L_tibia_a_elx_JNT.scaleZ = (((GA00_L_leg_tibia_a_squash_hold_DMNShape.
distance/GA00_L_leg_tibia_a_squash_DMNShape.distance) *2 )-1);
GA00_L_tibia_b_elx_JNT.scaleY = (((GA00_L_leg_tibia_b_squash_hold_DMNShape.
distance/GA00_L_leg_tibia_b_squash_DMNShape.distance) *2 )-1);
GA00_L_tibia_b_elx_JNT.scaleZ = (((GA00_L_leg_tibia_b_squash_hold_DMNShape.
distance/GA00_L_leg_tibia_b_squash_DMNShape.distance) *2 )-1);
GA00_L_foot_index_a_JNT.scaleX
GA00_L_foot_index_a_JNT.scaleY
GA00_L_foot_index_b_JNT.scaleX
GA00_L_foot_index_b_JNT.scaleY
GA00_L_foot_index_c_JNT.scaleX
GA00_L_foot_index_c_JNT.scaleY

=
=
=
=
=
=

GA00_L_foot_pinkie_a_JNT.scaleX
scaleZ);
GA00_L_foot_pinkie_a_JNT.scaleY
scaleZ);
GA00_L_foot_pinkie_b_JNT.scaleX
scaleZ);
GA00_L_foot_pinkie_b_JNT.scaleY
scaleZ);
GA00_L_foot_pinkie_c_JNT.scaleX
scaleZ);
GA00_L_foot_pinkie_c_JNT.scaleY
scaleZ);

1
1
1
1
1
1

*
*
*
*
*
*

(1/
(1/
(1/
(1/
(1/
(1/

GA00_L_foot_index_a_JNT.scaleZ);
GA00_L_foot_index_a_JNT.scaleZ);
GA00_L_foot_index_b_JNT.scaleZ);
GA00_L_foot_index_b_JNT.scaleZ);
GA00_L_foot_index_c_JNT.scaleZ);
GA00_L_foot_index_c_JNT.scaleZ);

(1/

GA00_L_foot_pinkie_a_JNT.

(1/

GA00_L_foot_pinkie_a_JNT.

(1/

GA00_L_foot_pinkie_b_JNT.

(1/

GA00_L_foot_pinkie_b_JNT.

(1/

GA00_L_foot_pinkie_c_JNT.

(1/

GA00_L_foot_pinkie_c_JNT.

GA00_L_foot_thumb_a_JNT.scaleX = 1 * (1/ GA00_L_foot_thumb_a_JNT.scaleZ);

35 4

GA00_L_foot_thumb_a_JNT.scaleY
GA00_L_foot_thumb_b_JNT.scaleX
GA00_L_foot_thumb_b_JNT.scaleY
GA00_L_foot_thumb_c_JNT.scaleX
GA00_L_foot_thumb_c_JNT.scaleY

=
=
=
=
=

1
1
1
1
1

*
*
*
*
*

(1/
(1/
(1/
(1/
(1/

GA00_L_foot_thumb_a_JNT.scaleZ);
GA00_L_foot_thumb_b_JNT.scaleZ);
GA00_L_foot_thumb_b_JNT.scaleZ);
GA00_L_foot_thumb_c_JNT.scaleZ);
GA00_L_foot_thumb_c_JNT.scaleZ);

GA00_R_femur_elx_JNT.scaleY = (((GA00_R_leg_femur_squash_hold_DMNShape.
distance/GA00_R_leg_femur_squash_DMNShape.distance) *2 )-1);
GA00_R_femur_elx_JNT.scaleZ = (((GA00_R_leg_femur_squash_hold_DMNShape.
distance/GA00_R_leg_femur_squash_DMNShape.distance) *2 )-1);
GA00_R_tibia_a_elx_JNT.scaleY = (((GA00_R_leg_tibia_a_squash_hold_DMNShape.
distance/GA00_R_leg_tibia_a_squash_DMNShape.distance) *2 )-1);
GA00_R_tibia_a_elx_JNT.scaleZ = (((GA00_R_leg_tibia_a_squash_hold_DMNShape.
distance/GA00_R_leg_tibia_a_squash_DMNShape.distance) *2 )-1);
GA00_R_tibia_b_elx_JNT.scaleY = (((GA00_R_leg_tibia_b_squash_hold_DMNShape.
distance/GA00_R_leg_tibia_b_squash_DMNShape.distance) *2 )-1);
GA00_R_tibia_b_elx_JNT.scaleZ = (((GA00_R_leg_tibia_b_squash_hold_DMNShape.
distance/GA00_R_leg_tibia_b_squash_DMNShape.distance) *2 )-1);
GA00_R_foot_index_a_JNT.scaleX
GA00_R_foot_index_a_JNT.scaleY
GA00_R_foot_index_b_JNT.scaleX
GA00_R_foot_index_b_JNT.scaleY
GA00_R_foot_index_c_JNT.scaleX
GA00_R_foot_index_c_JNT.scaleY

=
=
=
=
=
=

1
1
1
1
1
1

*
*
*
*
*
*

(1/
(1/
(1/
(1/
(1/
(1/

GA00_R_foot_index_a_JNT.scaleZ);
GA00_R_foot_index_a_JNT.scaleZ);
GA00_R_foot_index_b_JNT.scaleZ);
GA00_R_foot_index_b_JNT.scaleZ);
GA00_R_foot_index_c_JNT.scaleZ);
GA00_R_foot_index_c_JNT.scaleZ);

GA00_R_foot_pinkie_a_JNT.scaleX
scaleZ);
GA00_R_foot_pinkie_a_JNT.scaleY
scaleZ);
GA00_R_foot_pinkie_b_JNT.scaleX
scaleZ);
GA00_R_foot_pinkie_b_JNT.scaleY
scaleZ);
GA00_R_foot_pinkie_c_JNT.scaleX
scaleZ);
GA00_R_foot_pinkie_c_JNT.scaleY
scaleZ);

(1/

GA00_R_foot_pinkie_a_JNT.

(1/

GA00_R_foot_pinkie_a_JNT.

(1/

GA00_R_foot_pinkie_b_JNT.

(1/

GA00_R_foot_pinkie_b_JNT.

(1/

GA00_R_foot_pinkie_c_JNT.

(1/

GA00_R_foot_pinkie_c_JNT.

GA00_R_foot_thumb_a_JNT.scaleX
GA00_R_foot_thumb_a_JNT.scaleY
GA00_R_foot_thumb_b_JNT.scaleX
GA00_R_foot_thumb_b_JNT.scaleY
GA00_R_foot_thumb_c_JNT.scaleX
GA00_R_foot_thumb_c_JNT.scaleY

1
1
1
1
1
1

=
=
=
=
=
=

*
*
*
*
*
*

(1/
(1/
(1/
(1/
(1/
(1/

GA00_R_foot_thumb_a_JNT.scaleZ);
GA00_R_foot_thumb_a_JNT.scaleZ);
GA00_R_foot_thumb_b_JNT.scaleZ);
GA00_R_foot_thumb_b_JNT.scaleZ);
GA00_R_foot_thumb_c_JNT.scaleZ);
GA00_R_foot_thumb_c_JNT.scaleZ);

GA00_M_spine_0_JNT.scaleX
=
(((GA00_M_spine_0_squash_hold_DMNShape.
distance/GA00_M_spine_0_squash_DMNShape.distance) *2 )-1);
GA00_M_spine_0_JNT.scaleZ
=
(((GA00_M_spine_0_squash_hold_DMNShape.
distance/GA00_M_spine_0_squash_DMNShape.distance) *2 )-1);
GA00_M_spine_1_JNT.scaleX
=
(((GA00_M_spine_1_squash_hold_DMNShape.
distance/GA00_M_spine_1_squash_DMNShape.distance) *2 )-1);

GA00_M_spine_1_JNT.scaleZ
=
(((GA00_M_spine_1_squash_hold_DMNShape.
distance/GA00_M_spine_1_squash_DMNShape.distance) *2 )-1);
GA00_M_spine_2_JNT.scaleX
=
(((GA00_M_spine_2_squash_hold_DMNShape.
distance/GA00_M_spine_2_squash_DMNShape.distance) *2 )-1);
GA00_M_spine_2_JNT.scaleZ
=
(((GA00_M_spine_2_squash_hold_DMNShape.
distance/GA00_M_spine_2_squash_DMNShape.distance) *2 )-1);
GA00_M_spine_1_JNT_orientConstraint1.GA00_M_spine_1_fk_JNTW1 = 1 - GA00_M_
spine_1_JNT_orientConstraint1.GA00_M_spine_crv_1_JNTW0;
GA00_M_spine_2_JNT_orientConstraint1.GA00_M_spine_2_fk_JNTW1 = 1 - GA00_M_
spine_2_JNT_orientConstraint1.GA00_M_spine_crv_2_JNTW0;
GA00_M_spine_0_JNT_orientConstraint1.GA00_M_spine_0_fk_JNTW1 = 1 - GA00_M_
spine_0_JNT_orientConstraint1.GA00_M_spine_crv_0_JNTW0;
GA00_L_femur_ik_JNT.scaleX = 1 * (1/ GA00_L_femur_ik_JNT.scaleZ);
GA00_L_femur_ik_JNT.scaleY = 1 * (1/ GA00_L_femur_ik_JNT.scaleZ);
GA00_L_tibia_a_ik_JNT.scaleX = 1 * (1/ GA00_L_tibia_a_ik_JNT.scaleZ);
GA00_L_tibia_a_ik_JNT.scaleY = 1 * (1/ GA00_L_tibia_a_ik_JNT.scaleZ);

GA00_L_tibia_b_ik_JNT.scaleX = 1 * (1/ GA00_L_tibia_b_ik_JNT.scaleZ);


GA00_L_tibia_b_ik_JNT.scaleY = 1 * (1/ GA00_L_tibia_b_ik_JNT.scaleZ);

GA00_R_femur_ik_JNT.scaleX = 1 * (1/ GA00_R_femur_ik_JNT.scaleZ);


GA00_R_femur_ik_JNT.scaleY = 1 * (1/ GA00_R_femur_ik_JNT.scaleZ);

GA00_L_ear_c_JNT_parentConstraint1.GA00_L_ear_c_dyn_JNTW1 = 1 - GA00_L_
ear_c_JNT_parentConstraint1.GA00_L_ear_c_fk_JNTW0;
GA00_L_ear_d_JNT_parentConstraint1.GA00_L_ear_d_dyn_JNTW1 = 1 - GA00_L_
ear_d_JNT_parentConstraint1.GA00_L_ear_d_fk_JNTW0;
// End

16 _AFTER WORDS - FINALIZING

During the rigging process and once completed it is vital to


receive feedback from animators.
After working on a rig I would pass it on to the animators
and let them play with it for a while and get some feedback
from them and probably for do some revisions. Most animators
have their preferred methods of animation and way they use
controls. Your job is to satisfy them in all the specifications given
to you at the beginning.
The aim is to create a modular rig with a script base which
allow us to rebuild the rig as necessary.
Changes can therefore be made quickly which allows for
improvements to be made while saving time.
But this is another story...

GA00_R_tibia_a_ik_JNT.scaleX = 1 * (1/ GA00_R_tibia_a_ik_JNT.scaleZ);


GA00_R_tibia_a_ik_JNT.scaleY = 1 * (1/ GA00_R_tibia_a_ik_JNT.scaleZ);

GA00_R_tibia_b_ik_JNT.scaleX = 1 * (1/ GA00_R_tibia_b_ik_JNT.scaleZ);


GA00_R_tibia_b_ik_JNT.scaleY = 1 * (1/ GA00_R_tibia_b_ik_JNT.scaleZ);

GA00_L_ulna_ik_JNT.rotateZ = (GA00_L_hand_CTL.rotateX+GA00_L_ulna_fk_CTL.
rotateY)/2;
GA00_L_ulna_fk_JNT.rotateZ = (GA00_L_hand_CTL.rotateX+GA00_L_ulna_fk_CTL.
rotateY)/2;
GA00_R_ulna_ik_JNT.rotateZ = (GA00_R_hand_CTL.rotateX+GA00_R_ulna_fk_CTL.
rotateY)/2;
GA00_R_ulna_fk_JNT.rotateZ = (GA00_R_hand_CTL.rotateX+GA00_R_ulna_fk_CTL.
rotateY)/2;
GA00_R_eye_LOC.translateX = - GA00_L_eye_LOC.translateX;

GA00_L_ear_a_JNT_parentConstraint1.GA00_L_ear_a_dyn_JNTW1 = 1 - GA00_L_
ear_a_JNT_parentConstraint1.GA00_L_ear_a_fk_JNTW0;
GA00_L_ear_b_JNT_parentConstraint1.GA00_L_ear_b_dyn_JNTW1 = 1 - GA00_L_
ear_b_JNT_parentConstraint1.GA00_L_ear_b_fk_JNTW0;

355

35 6

357

06
Eyeball
Tutor ial

The Art of Cartoon Animation

1 _Creating the Eyeball

01 _ Creating the Eyeball


First there is something I must clarify about the idea of building
eyeballs. Eyeballs can be made in two diferent ways, you can
choose the geometric way wich concentrates the job in the
modelling stage or you can choose the texturing way with
leaves the job to the texturing stage.
These two methods have their advantages and disadvantages
of course.
The "geometric" way is the most commonly used in the 3D
world and all the tutorials you may found around the net talk
about this method, although they might differ from the point of
view used in each case, they build the entire eyeball like in
reality, with the cornea, the iris, the pupil and so on. The main
disadvantage of this method is that it is a bit complicated and
don't let you change it's shape rapidly in order to use the eye in
a diferent kind of creature, not to mention that the cornea may
intersect with the eyelids, this is not really visible in a mid-range
shot but certainly obvious in a close-up shot.
I prefer the "texture" method over the "geometric" for several
reasons. The first is the freedom it gives you to change it's shape
and look rapidly, the second and not so obvious is the possibility
to use it in non spherical eyeballs, Have you ever thought of a
square eyeball? Sounds funny and it's possible to make it this
way, so this will be the method commonly used with cartoon
characters, and the one used in this book, so let's get started.
The first thing we need to do is to create the eyeball. For this
the best is to create a NURBS sphere (create->NURBS Primitives>Sphere), rename it to "eyeball" and rotate it 90 degrees in the
X axis, we do this because we will be using the internal NURBS
UVs so we need the sphere to point forward instead of upward.
With this simple step we are finished with the modelling part.
(Picture 01_1)
Picture 01 _1

Now we must understand the way we see the eye. We have


the iris which is bumped inwards, and the cornea, which bumps
outwards. We will be doing this with a layered shader with two
shaders in it, one for the iris, one for the cornea. As we don't
have a boss telling us what kind of eye our character needs,
we will build a bit of a complex shading network in order
to have the best control we can over the entire shape and
shade of the eyeball. To do this we will have every atribute
of the shader mapped with procedural textures, so no bitmaps
needed.
I usually use the Multilister (Windows->Rendering Editors->Multilister),
but you can use the Hypershade instead.
I like Multilister
because I come from Alias Power Animator, but you can use
whatever you like. So in the Multilister, open the "Create render
node" window and create a "Layered shader" and rename
the "Shading group" to something like "eyeballShaderSG" and the
"shader" to "eyeballShader".
Delete the default layer and Add two new layers to the shader.
Select the left one, make sure you make it 99.9% transparent and
click on the "Color" texture button and create a "phong shader",
rename it to "cornea" to find it easily later. Make this shader
black and fully transparent, change its diffuse channel to "0" so
it won't receive any shading information.
Now we want a strong and sharp specular light so up the
"cosine power" to something around 400 and make sure the
specular color is set to super white to make it visible and set the
reflectivity to whenever you want it to reflect or not.
To make a "super white" color, do the following, click in the
specular color slot so the "color chooser" window will open and
Picture 01 _2

choose a white color with a "value" of something like 750.


Now click on the "bump mapping" slot and choose "ramp" in
the "create Render node" window, don't forget to rename it
to something like "bumpCornea", make sure the "type" is set to
"U Ramp" and change the colors to make a black and white
gradient in top like in the Picture 01_2, this will make the outwards
bump of the cornea. It's a good idea to change the interpolation
to "smooth" to get better results, although it doesn't work that
way in the real life, it will look less "CG-ish" with "smooth".
Return to the "eyeballShaderSG" and
make it totally opaque, next click on
and create a "phong E" shader from
window and rename it so something

Picture 01 _3

select the "iris" layer and


the "color" texture button
the "Create Render node"
like "iris".

Now it's time to explain the textures we need to get the most
with the fewer procedural textures as we can. Basically we
want to texture its color, bump, whiteness and specular color.
In the color we will have a ramp on top of the color's shading
network to control the overall shade of the iris so we can make
it brighter in the middle and darker in the borders. Connected
to it we will have a "fractal noise" to make the caracteristic iris
veins, a "ramp" to control the color of the "fractal" and another
"ramp" to control the fractal's "ratio".
Next we have a ramp to control the inwards bump of the iris
which, in fact, will bring us the photoreal touch we need to
make this eye look good.

Although the "fractalColor" is first mapped into the second color


of the ramp, when the entire color shading network is done we
will need to connect the fractal node to the third color of the
color ramp so you may have more control over it.

Then we have to control the way the specular component


works in the shader. To make this I divide the specular in two
textures, one will be the actual color of the specular, and the
other to control the power of the specular (well, sort of), so with
this explained we can go on with the shader.

Go back to the "Fractal" node and create another ramp for the
"Color gain" attribute to control the color of the iris and rename
it to something like "rampColor", change the colors to whatever
you like you eye to look like.

With the "phong E" shader opened in our "Atribute editor" we


will create the color ramp, choose "ramp" from the "Create
Render node" window and rename it to something like "Color"
and change its "type" to "U Ramp", create four color slots, one
at the bottom, one at 0.2, one at 0.8 and another at the top like
in the Picture 01_3.
Now go to its "place2DTexture" and set the "U_Coverage" to 0.09
and the "Translate frame_U to 0.86. You don't have to be exact
with these values since we will be driving them with a "Set
Driven Key" in order to be able to animate the size of the pupil,
so you might find more suitable numbers for that node.
Next you have to come back to the ramp node and select the
second color slot. In "selected color" click in the "texture" button
and create a "fractal", rename it to something like "fractalColor"
and set its "amplitude" to 1.0, "threshold" to 0.0, "Frecuency ratio"
to 1.8, "Level min" to 0.0 and "Level max" to 9.0. Press the "texture"
button in the "Ratio" slot and create a "Ramp" for it, rename the

360

ramp to something like "rampRatio" and make it look like the


Picture 01_4, this ramp will control the sharpness of the veins.

With the color shading node created now we must make the ramps
share the same "place2dTexture" node as the first ramp called
"Color". To do this we must locate that node in the "hypershade"
window, to make this step easier in the future, rename the
"place2dTexture" node to something like "main2dplacement",
when you are ready click on it and drag it to the "rampRatio"
ramp with the default options and to the "rampColor" the same
way, now they all share the same place2DTexture" so it will be
easier to change their values.
With the color shading network job almost done we can test it,
so apply the "eyeballShaderSG" to the eye and perform a test
render. Oh, the iris looks decent but we forgot a critical step.
Since we are restricting the "coverage" and "translate frame" of
the "place2dTexture" nodes we only have the textures applied
in a small area of our eye, we need to fix this.
Select the ramp called "Color" and click on the "texture" button
in the "defaultColor" slot and create a ramp and rename it
361

to something like "pupilColor". As we need two colors for the


"defaultColor" we need to make the ramp look like the Picture
01 _5, with most part of it colored in white and a small portion
colored in black, so the black part will be the pupil color.

Picture 01 _6

real or a total fake.


For this eye I set the "roughness" and the "highlight size" attributes
to either "0.711" and "0.777" to make it look properly.
So back to the texturing step, the first thing we want to map is
the "whiteness" attribute of the shader. So click on it to create
another "ramp" for it and rename it to something like "specSize".
Delete it's colors and create a three or four color gradient,
from black to white and back to black like in Picture 01 _7.
As we need it to appear only in the iris, we need to set its
"defaultColor" to black, so no specular appears on the outside.

Picture 01 _4

Picture 01 _7

Now drag it to the other fractal with the default options and
you are done. Don't forget to rename this "place2dTexture" node
to something like "fractals2dPlacement" so you can find it easily
later.
With this step we have forced the specular color to appear
only at the iris veins so it will look more real. Although this book
covers cartoon characters animation, realistic eyes will make
your character more believable, so this shader is critical for
that.
Ok, now we have a white specular, to be able to control it's color
we will need to create another ramp in the "colorGain" attribute
of the "fractalSpecular" node. So click on the attribute and create
a "ramp" for it and rename it to something like "rampSpecColor"
and make a gradient from Black to the color you want for the
iris color, to black again, this will get a smooth transition and thus
make it more real. Again we want it to appear only in the iris,
so we need to set it's "defaultColor" to black.
This ramp needs to share the "main2dPlacement" so drag it to
the ramp and connect it with the default options.
Now we are about to finish, but we still need to be able
to animate the iris size so the next step will cover the SDK
creation.

Picture 01 _5

As you can imagine, the iris bump is the opposite of the specular
one so we will be doing it the same way. Press on the "texture"
button in the bump slot of the shader and create a "ramp"
for it and rename it to something like "bumpIris". Change its
interpolation type to "U_Ramp", in fact, all the ramps we will
be creating for the eyeball shader will be "U_Ramp", so check
them all.
Delete all the color entries and create a "black to white"
gradient, black on the top, white on the bottom, and change
the interpolation to "spike" to make the gradient smoother in the
white part. This ramp will share the "main2dPlacement" as the
others, so drag that node on top of the "bumpIris" ramp with the
default options and you are done.
Drag also the "pupilColor" ramp to the "defaultColor" of the
"bumpIris" ramp to make sure the bump is smooth in both sides.

Now we can test the shader again to verify if it works properly


now (Picture 01 _6)
Now that the eye looks as we want, at least its color, we will be
moving to the next step, the bump stage.
362

To increase the bump effect you only have to adjust the


"bumpDepth" attribute in the "bump2D" node, in my scene a
value of 2 will work perfectly.
Now we will go on to the next step, the control of the specular
of the eyeball.
This step is crucial since this will definetly make your eye look

Since this is a shader animation we will want to creat a float


custom attribute to control the iris, to do this select the eyeball
shading group "eyeballShaderSG" and go to "Modify->Add
attribute". Set the "attributeName" to something like "irisSize" and
the range to a minimum of "-10", a maximum of "10" and a
default number of "0" and click OK.
Agan, this ramp needs to share the "main2dPlacement" node, so
drag it to the "specSize" ramp and connect it with the default
options.
So now we are ready to create the actual color of the shader's
specular.
Click on the "specular color" of the iris shader and create a "fractal"
node for it and rename it to something like "fractalSpecular".
Now we need to connect the fractal used for the color of the
shader to the newly created for the specular color. So drag the
"fractalColor" node to the "fractalSpecular" and the "connection
editor" will pop up, connect all the attributes you find but the
"default color", "color gain" and "color offset" in order to mimic
both shaders.
Both fractals need to share the same "place2dTexture" node,
but this one will be diferent from the "main2dPlacement" used
for the ramps. So select one of the two fractals and press
the "inputConnections" button to locate its "place2dTexture" node.

We set this range to make "0" the "relax" size of the pupil so you
can always return to this value to get it's normal size.
Now
select
the
"main2dPlacement"
node
and
the
"fractals2dPlacement" node, then open the SDK window in
"Animate->SetDrivenKey->Set->Options". In that window click on
the "load driven" button, then select the "eyeballShaderSG" and
click on the "load driver" button.
In the driver's right side you have all the keyable attributes it
may have, found the "irisSize" attribute and select it.
In the driven's right side you have all of its keyable attributes,
select "U_Coverage" of both the "main2dPlacement" node and
the "fractals2dPlacement" node and click on the "key" button, this
will create the default position of the "irisSize" attribute.
Select the "eyeballShaderSG" by clicking on its name in the driver's
window and chage the "irisSize" attribute to its minimum (-10). Then
select the "main2dPlacement" node and change its "U_Coverage"
363

to "0.05". Select the "fractals2dPlacement"and set its "U_Coverage"


to "0.95". In the driver's right side select "U_Coverage" of both
the "main2dPlacement" node and the "fractals2dPlacement" node
and click on the "key" button, this will create the key for the
minimum size of the iris.
Now Select the "eyeballShderSG" by clicking on its name in the
driver's window and chage the "irisSize" attribute to its maximum
(10). Then select the "main2dPlacement" node and change its "U_
Coverage" to "0.125". Select the "fractals2dPlacement"and set its "U_
Coverage" to "1.05". In the driver's right side select "U_Coverage" of
both the "main2dPlacement" node and the "fractals2dPlacement"
node and click on the "key" button, this will create the key for
the maximum size of the iris.
Now we can close the "SetDrivenKey" window and test it. The
shader works as we espect it to do, so go the viewport and
press "6" to change to the "hardwareTexturing" mode and play
with the numbers of the "irisSize" attribute to see the pupil grow
or shrink.
In the character design process we would need to change the
size of the entire iris, the only thing we have to do is to change
the "translateFrame" attribute of the two "place2dTexture" nodes
we have in the shading group and then adjust the size of the
pupil to get the desired overall size.
With this step we are done, just light your eyeball and have fun
with it. (Picture 01 _8)

36 4

365