Archive for Animation

Rig: Procedural Sine

Rig: Procedural Sine

When animating sea-creatures I found that a sine deformation was invaluable to get the dynamic flow that most of those creatures naturally had. Normally I’ve done this by using expressions, but I hate dealing with expressions when animating as you have to play the animation to evaluate and see the actual result of the expression.

So I’ve been experimenting a little on my own to see if it’s possible to achieve this with the standard nodes within Maya, and as Maya actually do have a sine deformer, I’ve been looking at ways to extract that behaviour so that it can be applied to joints.

Here’s the result:

It’s amazing what you can do with rivets, that’s what I used to extract the sine behaviour :)

Rig: Mecha Cat

Nico Strobbe posted a rigging-challenge over at CGCociety in 2010, he has provided a stunning model of a mechanical cat consisting of 437 different parts which can be downloaded here:
http://forums.cgsociety.org/showthread.php?f=216&t=907295 

I started to rig this creature about a year ago, being my first attempt at mechanical rigging I quickly ran out of ideas on how to rig the legs properly, so I gave it up.

However I picked up the rig again about two months ago, starting from scratch on the entire thing, after a hard struggle I finally managed to figure out how to solve the legs (which is the key to the entire rig) and complete the rest of the rig.

Here’s the rig-presentation:

 

I intend to make a breakdown-video eventually, just gotta find some time for it :)

Script: Delete Flat Keys

Script: Delete Flat Keys

When you’re working with animation you eventually end up with a lot of extra keys, by that I mean flat keys, keys we don’t need.

See the image below, I’ve marked the flat keys with red dots:

 

With the script you just select all of the objects that you want to clean the keyframes on, then you define the angle threshold, and the script will go through and delete all of the keys with a lower angle threshold than defined.

When run on the example above, we end up with this:

 

jh_delFlatKeys (Delete Flat Keys)

//*************************************************************************************************************
// Title: jh_delFlatKeys.mel
// Author: Jørn-Harald Paulsen
// Created: September 08, 2010
// Last Update: May 28, 2011
// Description: Utility to remove key’s with a lower value-difference than specified.
//*************************************************************************************************************
// MAIN WINDOW
//*************************************************************************************************************
global proc jh_delFlatKeys()
{
//Close window if it already exists
if (`window -q -ex jh_delFlatKeys`) deleteUI jh_delFlatKeys;

//Main Window
window -topEdge 30 -title “Keyframe cleanup”
-mxb false -s true -rtf false -mb false -mbv false -w 412 -h 268 jh_delFlatKeys;

//Window content
columnLayout -adjustableColumn true;
text -label “\nUtility to remove key’s with a lower value-difference than specified.\n” -fn boldLabelFont;
separator -w 240 -h 40;
text -label “- Select the object(s) that you want to clean keyframes on”;
text -label “- Define the angle/value tolerance (keys with values lower than these will be deleted)\n”;
floatSliderGrp -label “Angle tolerance” -f true -min 0.001 -max 5.000 -fmn 0.001 -fmx 100.000 -v 0.001 -s 0.001 sliderAngleTol;
floatSliderGrp -label “Value tolerance” -f true -min 0.001 -max 5.000 -fmn 0.001 -fmx 100.000 -v 0.001 -s 0.001 sliderValueTol;
separator -w 240 -h 40;
button -label “Clean keyframes” -c jh_deleteKeys;
separator -w 240 -h 40;
window -e -w 412 -h 268 jh_delFlatKeys;
showWindow jh_delFlatKeys;
}

global proc jh_deleteKeys()
{
//Get the selected object(s)
string $selObj[] = `ls -sl`;
//Create a variable to store the number of keys deleted
int $keysDeleted = 0;
//For each selected object
for($object in $selObj)
{
//Get the animation curves
string $animCurve[] = `keyframe -query -name $object`;
//If the object have animation curves
if (size($animCurve) > 0)
{
//Tangents with angles below this value will be considered flat
float $angleTol = `floatSliderGrp -q -v sliderAngleTol`;
//Neighboring values that fall within this tolerance will be considered matching
float $valueTol = `floatSliderGrp -q -v sliderValueTol`;

//Define the variables
string $keyedAttrs[], $outTanType[], $evalStr, $plural;
float $keyedValues[], $inAngle[], $outAngle[], $keyedFrames[], $prevValDif, $nextValDif;
int $deleteIndex[], $stepped, $i;
int $counter = 0;

//For each animation curve
for ($curve in $animCurve)
{
clear($inAngle);
clear($outAngle);
clear($deleteIndex);
clear($keyedValues);

//Get all of the keyed attributes
$keyedAttrs = `listConnections -plugs yes -source no $curve`;

//Go through the keyframes on the current animation-curve and get inAngle and outAngle
float $inAngle[] = `keyTangent -query -inAngle $curve`;
float $outAngle[] = `keyTangent -query -outAngle $curve`;
string $outTanType[] = `keyTangent -query -outTangentType $curve`;

//Make $inAngle and $outAngle absolute values, for less work on the comparison
for ($i=0;$ifor ($i=0;$i

//Get each keyed frame, and get the value of each keyed frame
$keyedFrames = `keyframe -query -timeChange $curve`;
$keyedValues = `keyframe -query -valueChange $curve`;

//For each keyeframe on the current animation-curve, find deleteable keys
for ($i=0;$i {
//As long as the current keyeframe is between 0, and less than the number of keyframes, continue
if ($i == 0 || $i == (`size $keyedFrames`-1)) continue;

//Get the outTangentType of the previus frame, the current frame, and the next frame.
//The result of this command will go to $stepped. If true, $stepped = 1, if false, $stepped = 0
$stepped = ($outTanType[$i] == “step” && $outTanType[$i-1] == “step” && $outTanType[$i+1] == “step”);

//If one of the following conditions (1 or 2) is true, rund the script inside of the if-brackets:
// 1) $stepped is true (1)
// 2) outAngle of the previous frame is less than angleTol
// & inAngle of the current frame is less than angleTol
// & outAngle of the current frame is less than angleTol
// & inAngle of the next frame is less than angleTol
if ($stepped || ($outAngle[$i-1] < $angleTol && $inAngle[$i] < $angleTol && $outAngle[$i] < $angleTol && $inAngle[$i+1] < $angleTol))
{
//Get the difference of the value of the current attribute between the previous frame and the current frame
$prevValDif = abs($keyedValues[$i-1] – $keyedValues[$i]);
//Get the difference of the value of the current attribute between the current frame and the next frame
$nextValDif = abs($keyedValues[$i+1] – $keyedValues[$i]);

//If one of the following (1 or 2) conditions is true, set $deleteIndex:
// 1) $stepped is true (1)
// & $prevValDif is less than valueTol
// 2) $stepped is false (0)
// & $prevValDif is larger than valueTol
// & $nextValDif is larger than $valueTol
if ($stepped && $prevValDif < $valueTol || !$stepped && $prevValDif < $valueTol && $nextValDif < $valueTol) $deleteIndex = $i; } } //Make the string to delete the keys if (size($deleteIndex) > 0)
{
//The first command of the delete -string
$evalStr = “cutKey -clear”;
//Add the indexes to the string
for ($i in $deleteIndex) $evalStr += ” -index ” + $i;
//Add the animation-curve to the string
$evalStr += ” ” + $curve;
//Execute the generated cutKey -string
eval($evalStr);
//Get the number of keys deleted
$counter += size($deleteIndex);
}
}

//If more than one key has been deleted, set the $plural to true
$plural = ($counter > 1 || $counter == 0) ? “s” : “”;
//Put the number of deleted keys on the current attribute to the total deleted keys -variable
$keysDeleted = $keysDeleted + $counter;
//Print information
print ($counter + ” keyframe” + $plural + ” removed from ” + $object + “.\n”);
}
}
//Print number of keys deleted in total
print (“Deleted keyframes in total: ” + $keysDeleted + “.\n”);
}

jh_delFlatKeys;

Download Script

 

All Posts

1,233 total views, 1 views today