Archive for the ‘Code’ Category

Check for Existence of a Variable in MEL

Thursday, June 16th, 2011

Error-catching in MEL with the catch command won’t catch a “variable does not exist” error, so use whatIs instead:

if (`whatIs "$test"` == "Unknown") {
print "yes";
} else {
print "no";

There ya go.

Importing Expressions in Maya

Sunday, April 24th, 2011

Writing expressions in Maya is a huge pain. The error messages are vague, there’s no stack trace, and the editor is a text entry field with no line numbers, syntax highlighting, or line wraps. And Maya forbid you try to write a script with a dynamically-generated expression in it — then everything has to be a giant encoded string. And when you try to run it, it squirts venom at you from its eyeballs.

However, it’s possible to write and edit your expression in the text editor of your choice, save it to a file, and import that file into your script at runtime. This is much, much nicer, and comes with less venom.

There’s a way using fread to put the entire contents of a file into a string at once, but I had trouble with it — this way, reading a line at a time, seems to work better. [Based on this tutorial from Jay Grenier's Script Swell.]

Code follows:

selectTrigger v01

Thursday, December 23rd, 2010

Here’s a Maya script I wrote to trigger the selection of one object with the selection of another, inspired by Hamish McKenzie‘s Trigger UI, as seen in Andrew Silke‘s venerable Generi rig.

The script makes a scriptNode, which creates and tracks a scriptJob. The scriptJob checks selected objects each time something is selected, and if the control object is first in the selection list, the target objects will be selected as well. Since scriptJobs only last until the scene is closed, the scriptNode also re-creates the scriptJob when the scene is reopened.

I’d like to draw your particular attention to line 34, wherein I escape a backslash six times.

Download script here: selectTrigger_v01.mel

Code follows:

Ramp rig

Tuesday, December 7th, 2010

Occasionally in my Maya rigging work I want to use and animate a ramp (or many ramps) as part of a node network, but going through the ramp-editing interface is tedious, and the graph editor doesn’t give me the visual feedback I’d like. So I wrote a script that creates a simple interface for manipulating a monochrome ramp in the viewport.

Note that real-time feedback is only available in the viewport’s “High Quality” mode.

Download the file here:


Coral Towers

Monday, August 30th, 2010

New attachment support in my favela-generating code, plus a Romanesque model set, and I’ve got a collaboration by de Chirico and Dr. Seuss.

Translucent City

Wednesday, August 4th, 2010

Made with my foetal citybuilder script, rendered in with mental ray using the misss_physical shader.

Voxelizer 1.0

Saturday, July 3rd, 2010

Voxelizer 1.0 is a script written in Python for Maya. It builds an array of animated cubes in the shape of selected target objects. It takes the color of the cubes from the texture and lighting of the object, and respects visibility and transparency. It also allows keyable voxel and gap sizes, by checking the sizes of optional control objects.

Download files here: (Maya 2010)

Instructions and code follow:

Banana 02

Thursday, June 24th, 2010

Separate controls for the size of the voxel grid and the size of the cubes.


Tuesday, June 22nd, 2010

The code now respects alpha, and can vary the cube size.

Colored Voxels

Tuesday, May 25th, 2010

Returning to the scene of the cubical crime…

I’ve found a way to apply colors to my mesh-voxelizing script, by sampling the color of the source model with Maya’s polyGeoSampler command. Incredibly, polyGeoSampler isn’t queryable. It’s used to bake the color of a mesh’s textures to the vertices of the mesh. So once you’ve done that, you can query *that* color with the polyNormalPerVertex command.

This technique only gives the expected result as long as your voxels are larger than your polys. Isn’t there any way to return the color of a texture at a given point on a poly?


Monday, May 24th, 2010

A variety of shapes growing upward, ever upward, and occasionally outward, supported from below, except for the ground floor, which is supported by pure force of will.

Wii Nunchuk to Maya

Sunday, April 11th, 2010

Simple proof of concept: A Wii Nunchuk controller connected to Maya via an Arduino, which sends the Nunchuk’s accelerometer data through the serial port. Maya uses PySerial to open the serial port, reads the data, and converts it to an attribute value.

You can see that the accelerometer has quite a lot of “ring” from sharp shocks.

I based this test on Tod Kurt’s BlinkMChuck code. The Nunchuk is connected to the Arduino with this connector from Todbot. Here’s an archive containing the test files:

And here’s a link to the setup required to configure pySerial:

Code follows.

Voxelize Meshes Script v.2

Thursday, February 25th, 2010

With the help of the patient people in the python_inside_maya forum, I’ve improved the Voxelize Meshes Script, mostly by more efficient use of the allIntersections method.

Instead of checking each point on the grid to see whether it’s inside one of the target meshes, this version shoots rays through the meshes along each axis and puts blocks at the intersections. This makes it approximately a zillion times faster, though I’m sure it could still be improved.

Update: Richard Kazuo from the p_i_m forum has excised lingering traces of pymel from my script, I’ve updated the code below with his improved version. It should now run with Maya’s default Python installation. Thanks Richard!

Update 2: Here’s the even-more-efficient … I’m putting this to bed now.

Maya Python code:

Voxelize Meshes Script

Wednesday, February 10th, 2010

This script will voxelize selected meshes over the frame range of the timeline.

It is currently rather slow.

Pymel code:

Voxelize Mesh Script

Monday, February 8th, 2010

This script will voxelize an animated mesh. It creates an array of cubes which fills the bounding box of the mesh’s motion through its animated range, and animates the visibility of each cube over the frame range based on its proximity to the mesh.

It’s quite slow, and would be faster if it used my octree, but it’s a start.

Written in Python with PyMEL for Maya.

Code follows: