interview news tutorial video

Rigging Tips and Tricks : Rigging Beautiful Eyes by Marco Giordano

The Eyes have it or We’ve got our eyes on you!

3d mesh of eye and the skeleton in it to animate it

(Rigging Tips and Tricks :  Rigging Beautiful Eyes by Marco Giordano)

It is that time of year here in Austin Texas that the sun starts to shine and many people head to the local swimming pool or to Barton Springs for a cold refreshing swim in its spring fed waters. At Rigging Dojo it also means ice coffee and the search for something to do indoors by late afternoon. We can’t give you the springs or coffee here but we do hope you find this guest post and tutorial on rigging flexible cartoon eyes both refreshing and cool, while you hide from the heat of summer.
Marco has created a great 3 part tutorial series for us, on a way he has used to rig up eyes in Maya. The rig is flexible and can be expanded upon to make a very expressive and transferable rig. He is also showing of some never before images from his custom rigging tools and images from his more recent rigging work. If you have seen the iAnimate dog rig, Marco created it and has done some other outstanding work (read to the end  for the sneak peek)
iAnimate dog - cartoon doberman
Once you finish your eye rig, go over and read the Ten Things to Think About – #9 Eyes @ Thinking Animation by Angie Jones and Jamie Oliff  for some solid reference and insight in to how animators think about the eyes. Then give some of the poses a try on your rig to test it out.

Begin Guest post:

Marco Giordano
Hello, my name is Marco Giordano,
I currently work in the industry as a senior character TD in film . When I was little I was completely amazed by “Jurassic Park” . When I was told the dinosaurs were made with computer graphics, I promised myself that one day I was going to learn how to do that.
When I started high-school,, I quickly realized that what I was learning was not going to allow me to do a job that would make me happy, so I started learning computer graphics after school. At the beginning I was learning just a base in every field, but then I decided to be an animator, and that I never was going to do rigging or programming because I really did not like that.glaiator
It is funny to see how that quickly changed, I decided to do Animation Mentor, but at that time, that school required a high-school diploma so I had to wait. Meanwhile, I started doing some rigging because I wanted to fix some rigs or make them able to perform what I wanted to animate, and that is how it started.
From there on I started learning only rigging and programming. When I was in my 4th year of high-school I started doing freelance at night and school during the day.
It was a hard time juggling both, but nothing made me more happy then following my passion. As soon as I graduated I got hired to work for a tv series and that is how my career started.
During my studies and my career I had the luck to meet so many great people willing to share their knowledge. I would like to thank two of my mentors because without them I would not be where I am now! The first one is Edoardo Pili, an amazing rigger, brilliant mind always coming up with good ideas and deep knowledge of his work. The second one is Alan Stanzione, the best programmer I ever met, he took me under his wing and taught me so much about programming and Maya API.
The thing that I love about rigging is that there are countless ways to build something, often during production when I get a task, and it isn’t crunch-time, I have some time to sit there and study the problem and prototype, or explore different ways to do stuff, being able to write plugins also extends a lot of this freedom.
I decided to start releasing my code, tools and tutorials for a couple of reasons. First of all I learned so much from the whole community that it just feels really good to give something back and it also helped me so much to avoid people from giving me quick judgment based on my age, rather than on what I am capable of, and it is actually pretty cool when older colleagues veterans of this industry come to my desk after watching my tutorials and ask some extra questions about that topic.
In some studios, production even gave us the opportunity to organize internal courses about many different topics , that was super cool because everyone was able to learn so much from each other.

About the Maya eye-rig tutorial, I first got in touch to this kind of technique (object attached to curves or surfaces) from my mentor Edoardo Pili, and later also Alessandro Boschian Pest did some great developing on this field.
This kind of setup allows you to take the eyelid from the regular blinking to a whole new level of expressions where a skilled animator can use that to create extreme and effective expressions.

Rigging Tips and Tricks :  Rigging Beautiful Eyes by Marco Giordano


Part 1 :


Part 2:

Part 2: new end with fixed audio

MAYA TUTORIAL : Cartoon eyeLid rigging PT2B from Marco Giordano on Vimeo.


Part 3:

 —Downloadable scene files–



: End of guest post:


Thanks again to Marco for a taking time to share all this with the Rigging Dojo and tech art community. You can connect with Marco and find out more here


Twitter – @MarcoG_Rigger
Linked-in –
Find more tips and tricks on his site


Sneak Peek:

Here is a sneak  peek at Marcos autorig tool, this has never been showed in public before.

For this autorig I created first of all an object oriented python wrap around Maya cmds and api (kinda like pymel) that allowed me way more efficient programming.


I wrote from scratch a “node editor” in pyqt that allowed me to create piece of rig as nodes instance and combine them, however, I wanted, like a puzzle and then in the end build the final rig , load all deformers , shape controls etc… and much much more but, I just wanted to give you and idea of what the screens show here.



20 replies on “Rigging Tips and Tricks : Rigging Beautiful Eyes by Marco Giordano”

hi marco,
i have no knowledge on python scripting.
i run the script and it says-
from maya import cmds , OpenMaya
sel = = 1)
crv = “curveShape36”
for s in sel :
pos = cmds.xform(s , q=1 , ws = 1 , t = 1)
print getUParam(pos ,crv)
# Error: NameError: file line 9: name ‘getUParam’ is not defined #

Thank you for the tutorial but i can get the script from lesson 2A work. this is the script as your writed but an error come all the time
# Error: line 1: RuntimeError: file S:\Maya_2016_DI\build\Release\runTime\Python\Lib\site-packages\maya\ line 10923: (kInvalidParameter): Object does not exist #

from maya import cmds , OpenMaya

sel = =1 )
crv = “curveShape1”
for s in sel :
pos = cmds.xform(s ,q = 1 , ws = 1 , t = 1)
u = getUParam(pos , crv)
name = s.replace(“_LOC” , “_PCI”)
pci = cmds.createNode(“pointOnCurveInfo” , n = name )
cmds.connectAttr(crv + ‘.worldSpace’ , pci + ‘.inputCurve’)
cmds.setAttr(pci + ‘.parameter’ , u )
cmds.connectAttr( pci + ‘.position’ , s + ‘.t’)

def getUParam( pnt = [], crv = None):

point = OpenMaya.MPoint(pnt[0],pnt[1],pnt[2])
curveFn = OpenMaya.MFnNurbsCurve(getDagPath(crv))
isOnCurve = curveFn.isPointOnCurve(point)
if isOnCurve == True:

curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject )
else :
point = curveFn.closestPoint(point,paramPtr,0.001,OpenMaya.MSpace.kObject)
curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject )

param = paramUtill.getDouble(paramPtr)
return param

def getDagPath( objectName):

if isinstance(objectName, list)==True:
for o in objectName:
selectionList = OpenMaya.MSelectionList()
oNode = OpenMaya.MDagPath()
selectionList.getDagPath(0, oNode)
return oNodeList
selectionList = OpenMaya.MSelectionList()
oNode = OpenMaya.MDagPath()
selectionList.getDagPath(0, oNode)
return oNode

Great tutorial. Thanks for sharing!!!
Is there a huge advantage to using python here instead of MEL? I’m assuming all this could be done with MEL??
Anyone successfully adopt this curve method to controlling the mouth?
Thanks again!


I ran into the exact same error as you did. I have very little knowledge of scripting (Python or otherwise), but I did find the solution.

Marco kind of glossed over it but it’s a crucial step to get the thing to work.
In part 2A at 4:30 he runs the previously placed script where ‘getUParam’ is actually defined to Maya.

So before you can run the script that attaches the locators to the controlVerts (the script you type as you go along with the tutorial), you have to run the downloaded script first.

It’s probably very obvious to people who know scripting, but for the monkey-see-monkey-do types like me, not so much.

Other than that: excellent tutorial Marco, I’m really learning some great stuff. I’ve been re-creating the character Penny from Disney’s ‘The Rescuers’ in 3D and I just couldn’t get the eyelids to work properly over those huge Disney-eyes in the conventional one-bone-per-eyelid way, but this is just the ticket. I’m gonna try and apply this technique to the mouth as well.

Thanks for sharing your knowledge with us.



HI… it is an awsome setup rig… loved it
really helpful for flexible charecters..
thank you so much, iam planning to apply the same technique to mouth, still confused where to keep the center point.

and one more doubt regarding the eye rig… the curves you have done with wire deformer… usually wire deformer dosent like scaling..

the question is… while SCALING will the curve attached with wire deformer scales with it?

looking forward to find a solution for it…


hi marco,
i have no knowledge on python scripting.
i run the script and it says-
from maya import cmds , OpenMaya

sel = = 1)

crv = “curveShape36”

for s in sel :
pos = cmds.xform(s , q=1 , ws = 1 , t = 1)
print getUParam(pos ,crv)
# Error: NameError: file line 9: name ‘getUParam’ is not defined #

Thank you very much for sharing this awesome tutorial.
This kind of rig give so much control over the eyes, it’s really a lot of fun!
Now let’s bring some life into those eyes ^^

I discovered an interesting problem. If I have Maya set to use feet instead of the default centimeters, getUParam returns 0.0. I am trying to find a way around this and was wondering if anyone else has any ideas.

This is a great toturial.I want to learn it.I have downloaded this toturial, but script is not seeing clearly.due to which i am not able to do this.can you help me please…

I know I discovered the script like two years ago and nevers top using it.
It has some down sides , sometimes the pure average is not what you need so the tool doesn’t work the best , it s a bit slow ( I always wanted to convert it in cpp but never got the chance) and doesnt have undo , BUT with a bit of pratice you can see when use it and how and speed up the workflow like crazy! thumb up for the guy that wrote it

Hi Marco and Dojo,

Thanks both for the audio fix and the quick web update.
It will be much easy to follow the explanation now.

Marco, your autorig script looks amazing! Great work specially on the detailed and nice GUI. 😉

I would also like to say ” MANY THANKS!!! ” for your incredible eye rig tutorial. It’s also a good insipration for other parts of the face.

Following your tutorial I discovered the tf_smoothSkinWeight script. That script save my day yesterday! From now on will be difficult to skin again without using it.


Hi Marco,

This is a really great and handy eye rig Tutorial!
I love the way you set it up.

I have two concerns.

1) Can you check the second video as it appears to be out of audio/video sync from minute 23 to the end. It’s quite complicated to follow the last minutes of that video.

2) I still need to see the third video to check if you mention something, but does you figure how we can adapt your methodology to characters with non-spherical eyes?

Thanks a lot!


Hi Ryan! Thanks!
The problem you are getting is due to the fact that the locator is not close enough to the curve, the script should take care of that but I found a typo in the script ! I sent the fixed script to riggingdojo to upload it but meanwhile you can go to the line :

if isOnCurve == False:

and change it to

if isOnCurve == True:

What does it do is simple it says , if your point (your locator position) is not on the curve first get the closest point to the curve then use this point to get the U param.
Let me know if you have more trouble I tested it on maya 2012 and 2013 and was working I dont have 2011 but the api method should be the same.

Great tutorial! I do run into an issue while following video 2. It may be that I am doing this in Maya 2011.
The error happens when I hit this line.
else :
point = curveFn.closestPoint(point,paramPtr,0.001,OpenMaya.MSpace.kObject)
curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject )

The Error:
Error: RuntimeError: file D:\buildforge\Maya_2011_Win64_Build\build\wrk\optim\runTime\Python\Lib\site-packages\maya\ line 4807: (kInvalidParameter): value not in valid range #

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.