Thursday, April 22, 2010

Mentoring and more!

Couple updates for everyone... i know it's been awhile.

First, we are currently rockin out on the 2nd session of Rigging Mentor (, after a successful first session! The students are great, and everyone is super excited to be learning from each other - including the mentors! Spots are already filling up for the next session, but fear not - we're working on ways to bring on more students.

On the work side of things, we're more than halfway through with Open Season 3, and it's looking awesome. We're also doing some Looney Tunes stereo 3D shorts, one of which will be in theaters very soon.

On the Maya side of things, 2011 has been released to subscription customers, and having played with it for a little bit, I must say that it is awesome. Best update they've had in years. Of course, as with any update, I'm starting to find some oddities that ...troublesome.

One thing that i've found out today is that if you're saving out a custom file type from a script/gui, Maya's new fileBrowserDialog is putting some restrictions on filetypes and the ability to select files that aren't in the standard list of types. Kinda hard to explain, but in short - when i'm saving out an XML file from a script, maya is forcing a standard file type to be in the name. so blah.xml is actually getting saved out as Not cool.

More fun to come...

Also, if you are on facebook, be sure to look up and become a fan! We have links from

Labels: , ,

Monday, November 16, 2009

Rigging Mentor

Just wanted to announce on this blog that some friends and I have started up, an online school for "teaching the art and science of character rigging". We are approaching it with the idea of giving each student a personalized education based on their skill level, their interests, and their needs based on what they want to do. We are currently beta testing, but are taking names down for those that are interested. Hopefully we will be gearing up to start a winter session in the beginning of 2010!

Stay tuned for more info...

Labels: , , ,

Tuesday, August 18, 2009

It's HOT.

Texas. August. It's damn hot.

Of course, that isn't stopping us from cycling anywhere from 15 to 35 miles every morning. It does help that we're doing this at 6am, when it's only 80 degrees...

On the work side of things, we are rockin' and rollin' on Open Season 3. We are basically updated all the rigs from Open Season 2, fixing a bunch of issues, and making sure they have all the latest and greatest since the modular rigging system has been updated over the past year. We also are doing a bunch of new characters, and are lucky enough to have the help of Jason Osipa again! He is always a pleasure to work with.

Anyway, just felt the need to do a quick update on a late night. More news should be flowing soon...

Thursday, May 28, 2009

cPoc fyi...

Just to note, and clarify, the closest point on curve script and node i mentioned is different from the one you'll find under create deformers - point on curve.

That particular point on curve deformer uses the curvePointConstraint command, which is basically constraining cvs (or partial cvs) to a locator.

My script/node will do the opposite - a locator/transform can be constrained to the curve, so if you have the curve skinned/deforming/moving, you can have something stick to the curve. again, its the same as the closestPointOnSurface node, but it works on curves.

anyway, just wanted to clarify since a couple people asked :)

Labels: , , ,

Tuesday, May 19, 2009

Closest Point on Curve (script)

Here's a python script i wrote recently... closestPointOnCurve. as i previously posted, maya doesn't have a built in node for getting this info, so i wrote my own. this code below is just the *script* version; i'll post the plugin node version another time.

you would call this with a location (world space point) and a curve object. for example:

import jc_closestPointOnCurve as cpoc
cpoc.jc_closestPointOnCurve([0, 0, 0], "curve1")

what you would get returned is the parameterU along the curve, and then the worldspace position of that point along the curve.

import maya.OpenMaya as om
import maya.cmds as mc

# input curve
# input point
# output param
# output point

def jc_closestPointOnCurve(location, curveObject):

curve = curveObject

# put curve into the MObject
tempList = om.MSelectionList()
curveObj = om.MObject()
tempList.getDependNode(0, curveObj) # puts the 0 index of tempList's depend node into curveObj

# get the dagpath of the object
dagpath = om.MDagPath()
tempList.getDagPath(0, dagpath)

# define the curve object as type MFnNurbsCurve
curveMF = om.MFnNurbsCurve(dagpath)

# what's the input point (in world)
point = om.MPoint( location[0], location[1], location[2])

# define the parameter as a double * (pointer)
prm = om.MScriptUtil()
pointer = prm.asDoublePtr()
om.MScriptUtil.setDouble (pointer, 0.0)

# set tolerance
tolerance = .00000001

# set the object space
space = om.MSpace.kObject

# result will be the worldspace point
result = om.MPoint()
result = curveMF.closestPoint (point, pointer, 0.0, space)

position = [(result.x), (result.y), (result.z)]
curvePoint = om.MPoint ((result.x), (result.y), (result.z))

# creates a locator at the position
mc.spaceLocator (p=(position[0], position[1], position[2]))

parameter = om.MScriptUtil.getDouble (pointer)

# just return - parameter, then world space coord.
return [parameter, (result.x), (result.y), (result.z)]

feel free to email me any questions :)

Labels: , ,

Monday, May 11, 2009

Python - cPoC

So what is *up* with maya not including a proc or node that gives you the closest point on a curve (from a given point)? You get a node that will give you the closestPointOnSurface... and a node that will give you the closestPointOnMesh... so why leave curves out?

It makes no sense... they even give you an example .cpp plugin source to create that node yourself! crazy, huh?

well, i needed to get the info of a closestPointOnCurve in one of my rig scripts, so tossing out the idea of requiring plugins (i try to do as much as i can without them... mostly), i opted to just write something quickly for this. i'll mess with making it into a node/python plug later, but for now i just wanted to get that info and use it.

if anyone is interested in the script, gimme a shout. i'll toss it on highend3d sooner or later, when i have a moment.

OR, maybe i can train myself to blog more and actually post it with a description later... :)

Labels: , ,

Wednesday, January 21, 2009

Rigging, Python, and the 2009 update!

I’m a little late, but Happy New Year anyway!


There’s so much to update since it’s been awhile, that I can’t remember any of it.  The past month or so I’ve been mostly working on improving our rigging tools and workflows, while doing some rigging on small projects here and there.  It’s crazy how fast your workflow can get once you have a chance to sit down and really think about what would make your job easier.  I’ll have to make some screen captures of some of the goodies I’ve made lately to give everyone an idea of what I’m talking about. 


So just this week I started to dive into Python a bit, starting with converting one of the tools I’ve written recently over from mel to python.  Justin at work has been helping me out with getting the mel to python translations straight in my head, and that has helped a ton.  I gotta say, already I’m impressed with python.  It is really easy to get into, easy to understand, and already I see a speed improvement between the mel version of the script vs the python version. 


Hopefully I’ll keep getting the free moments here and there to continue improving our rigging tools, because the more our tools improve, the faster we can work, which means the more free time we’ll have to make even cooler stuff.  Already I’m noticing the effects of this, since I can now whip tasks out even faster and get back to my tool dev.


So, 2009.  I think this will be the year that I can spend some time reorganizing my website (a lot of links have been broken for awhile), and definitely the year to start/finish/unveil some projects that have been cooking.  And definitely the year to stick to updating my blog on a regular basis :)