//------------------------------------------------------------------------
//
// Create a cylinder, rotate and position it on the floor.
// Delete the History and Freeze Transforms
// Group the cylinder.
//
// The Group can be animated using Translation Z and
// the wheel will Rotate automatically
//
//------------------------------------------------------------------------
if(frame==1)
{
// reset the wheel and global group back at the origin
globalTransforms.translateZ=0;
wheel.rotateX=0;
}
else
{
// translate the global group
globalTransforms.translateZ+=0.1;
// rotate the wheel according to global group
translateZ value
wheel.rotateX=360*(globalTransforms.translateZ/
(2*$PI*$wheelRadius));
}
Wheel Roll back and forth
Type :
Expression
Description :
A wheel rotates according the
distance translated along a single axis.
//------------------------------------------------------------------------
//
// Create a cylinder, rotate and position it on the floor.
// Delete the History and Freeze Transforms
// Group the cylinder.
//
// The Group can be animated using Translation Z and
// the wheel will Rotate automatically
//
//------------------------------------------------------------------------
if(frame==1)
{
// reset the wheel and global group back at the origin
globalTransforms.translateZ=0;
wheel.rotateX=0;
}
else
{
// translate the global group
globalTransforms.translateZ=
(sin(deg_to_rad((frame)*$frequency)))*$magnitude;
// rotate the wheel according to global
// group translateZ value
wheel.rotateX=360*(globalTransforms.translateZ/
(2 * $PI * $wheelRadius));
}
Turbulence (Random Vibrations)
Type :
Expression
Description :
Add some random turbulence to an
Object. The main object is Grouped and a local
turbulence Expression is applied. This Group is
then Grouped again to allow GlobalTransforms or
even a Motion Path.
This
Expression has interesting possibilities when
considered for other Attributes than Translation
and Rotation.
eg. Light Intensity, Colour, Bump Depth
//----------------------------------------------------------------------------
//
// Create a model. Group it twice and name it as indicated
// in the Outliner above. Apply the Expression below to the
// localTurbulenceExpression Group.
//
//----------------------------------------------------------------------------
// noise(time*frequency)*magnitude
// frequency = speed
// magnitude = value
// rotate the
model between -3 and 3 degrees
local_turbulence.rotateZ = noise(time*0.8)*3;
//
translate the model between -1.2 and 1.2 in X
axis
local_turbulence.translateX = noise(time*0.8)*1.2;
//
translate the model between -0.6 and 0.6 in Y
axis
local_turbulence.translateY =
noise((time-10)*2)*0.6;
//////////////////////////////////////////////////////////////////
//
// MIDDLE LEG : LEFT
//
//////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//
// MIDDLE LEG : RIGHT
//
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//
// BACK LEG : LEFT
//
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//
// BACK LEG : RIGHT
//
///////////////////////////////////////////////////////////////////
This is a simple
introductory Expression for flapping wings. It's
used to illustrate the use and syntax of the
sin()and
cos()
functions.
sin()
cos()
The
sin()and
cos()
functions require an input value in radians,
therefore values are converted from degrees to
radians using the
deg_to_rad()
function.
sin(deg_to_rad())
The input value
for the
sin()and
cos()
functions are generated using the
frame
function.
At this stage it would take 360 frames for the
bird to flap it's wings once - very slow. To
increase the wing speed a multiplier value of
10 is applied.
sin(deg_to_rad(frame*10))
This will now
return a value of 0 to 1 to 0
to -1 to 0 over 36 frames. The
last stage is to multiply these values by the
angle you want to animate the wings. Add
Attribute with float values from 0
- 60 to the body, and name it
wingAngle.
//---------------------------------------------------------------------------------------
//
// Note : Remember Add Attribute wingAngle
to the body
// type float, min 0, max 60, default 0
//
//----------------------------------------------------------------------------------------
//
body.wingAngle = custom attribute (keyable) of
body
// body.wingAngle is the multiplier to make the
wings flap
// reset all 4 wing objects and body at frame 1
if(frame==1)
{
lwing1.rotateZ=0;
rwing1.rotateZ=0;
lwing2.rotateZ=0;
rwing2.rotateZ=0;
body.translateY=0;
}
// animation
if(frame>1)
{
// rotate left and right wing joints nearest the
body
lwing1.rotateZ=sin(deg_to_rad(frame*10))*body.wingAngle;
rwing1.rotateZ=sin(deg_to_rad(frame*10))*(body.wingAngle*-1);
// rotate left and right middle joint, with offset to create
overlap
lwing2.rotateZ=sin(deg_to_rad((frame-8)*10))*body.wingAngle;
rwing2.rotateZ=sin(deg_to_rad((frame-8)*10))*(body.wingAngle*-1);
// translate body in opposite direction to wings
body.translateY=cos(deg_to_rad((frame-8)*10))*(body.wingAngle/-100);
}
//---------------------------------------------------------------------------------------
//
// The example below demonstrates the Expression above.
//
// The body.wingAngle value is keyframed from 0 to 30
to 45 to 0
//
//---------------------------------------------------------------------------------------
Basic MELScript Expression
//----------------------------------------------------------------------------
//
// The example below demonstrates how you animate the
// model globally.
//
// Select body and Group it. Rename the Group "bird_path".
// You can now animate the translation and rotation of
// the bird_path Group.
//
// The example below simply translates the model in the Y..
//
// The body.wingAngle value is also keyframed to vary the
// wing speed.
//
//----------------------------------------------------------------------------
MELScript Expression +
Keyframed body.wingAngle
//---------------------------------------------------------------------------------------
//
// The example below demonstrates how to add wind turbulence
to
// the Expression.
//
// Select body and Group it again. Rename the Group "turbulenceGrp".
// This Group can now be used to Translate and Rotate the
model
// locally while still inside the bird_path group.
//
// The example below applies a noise function to the X & Y
translation
// and Z rotation.
//
// noise(time*a)*
b;
// a= speed
// b=value of translation or rotation
//
// Note : The
translateY value is offset by 10 frames to ensure the
// does constantly move diagonally.
//
//---------------------------------------------------------------------------------------
// rotate the model between -3 and 3 degrees
turbulenceGrp.rotateZ = noise(time*1.2)*3;
// translate the model between -0.2 and 0.2 in X
axis
turbulenceGrp.translateX = noise(time*0.6)*0.2;
// translate the model between -0.3 and 0.3 in Y
axis
turbulenceGrp.translateY =
noise((time-10)*0.9)*0.3;
}
Adding turbulence using the
Noise function
//----------------------------------------------------------------------------
//
// For those of you wondering how the body.wingAngle
// label and value is displayed in the Viewport above, here
// is the code, which creates a Heads Up Display toggle
// switch (ON/OFF).
//
// Take note this a regular MEL Script run in the Script
// Editor, not an Expression. The code can therefore be
// dragged to your custom shelf to create a HUD button.
//
//----------------------------------------------------------------------------
//
This MEL Script is executed through the Script
Editor (not an Expression)
// This script creates the Heads Up Display (HUD)
in the movie above.
//global procedure to return the float value of body.wingAngle
global proc float fmWingAngle()
{
float $WAngle;
$WAngle = `getAttr body.wingAngle`;
return $WAngle;
}