A Minor Collection of
Useful Expressions
by Michael Natkin, Fred Lewis, and Brian Maffitt
Circle Fun
This generates perfect circular motion centered around the original position of the layer. I recommend that you map the radius and
cycle inputs to Expresso sliders, and the phase input to an Expresso angle.
Apply this expression to the position of the layer
radius = 75; // the radius of the circle
cycle = 1; // number of seconds to complete a circle; higher value = slower
if(cycle ==0){cycle = 0.001;} //avoids a “divide by zero” error
phase = 27; // initial angle in degrees from bottom
reverse = 1; // 1 for ccw, -1 for cw
x = Math.sin( reverse * degrees_to_radians(time * 360 / cycle + phase));
y = Math.cos(degrees_to_radians(time * 360 / cycle + phase));
add(mul(radius, [x, y]), position)
------------------------------------------------
Track a Child
This expression is designed to track the position of a layer that has been parented to one or more layers.
Use the expression below on the position property that you wish to animate, changing the name “Child” to match the neame of the
layer you wish to track. For instance, if you wat to use write-on to track the position of a layer called “moon”,
apply this expression
to the “brush position” property of the write-on filter, and change “child” to “moon”.
c = this_comp.layer(“child”);
c.to_comp(c.anchor_point)
------------------------------------------------
Adjustable Position Wiggle
Use this expression as an interactive, keyframeable Wiggler.
Apply it to the position of the layer you wish to wiggle.
wigfreq = 3; //wiggle frequency
wigamt = 30; //wiggle amount
wigdetail = 3; //detail of noise
position.wiggle(wigfreq, wigamt, wigdetail)
------------------------------------------------
Adjustable Rotation Wiggle
Use this expression as an interactive, keyframeable Wiggler.
Apply it to the rotation of the layer you wish to wiggle.
wigfreq = 5; //wiggle frequency
wigangle = 45; //wiggle amplitude
wignoise = 3; //octaves of noise
rotation.wiggle(wigfreq, wigangle, wignoise)
------------------------------------------------
Oscillate Position
Creates an oscillating motion between two specified 2-dimensional positions over a specified period of time (in seconds).
Use an adjustment layer with Expresso position controls for “from”, “to”, and an Expresso slider assigned to “period”.
Change “linear” to “ease” for smoother interpolation.
from = [50, 90]; //one end of your oscillation
to = [190, 30]; //the other end of your oscillation
period = 1.5; //time between oscillation points (multiply by 2 for a round trip)
t = time % (period * 2);
if (t > period) t = 2 * period - t;
linear(t, 0, period, from, to)
------------------------------------------------
Oscillate Rotation (or any single value)
Creates an oscillating motion between two specified values over a specified period of time (in seconds).
Use Expresso angles or sliders for “from”, “to”, and an Expresso slider assigned to “period” for fine control. You can apply these to
any layer.
Change “linear” to “ease” for smoother interpolation.
from = -45; //one end of your oscillation
to = 45; //the other end of your oscillation
period = 1.5; //time between oscillation points (multiply by 2 for a round trip)
t = time % (period * 2);
if (t > period) t = 2 * period - t;
linear(t, 0, period, from, to)
------------------------------------------------
Bounce
Creates a bouncing (sine wave) motion between two specified 2-dimensional positions over a specified period of time (in seconds).
Useful for creating bouncing balls.
Use Expresso position controls for “from”, “to”, and an Expresso slider assigned to “period” for fine control.
You can apply these to any layer.
surface = [320, 480]; //the position of the “bounce” surface
apogee = [320, 50]; //the “apogee” of the bounce
period = 1.5; //the length of time from surface to apogee
t = time % (period * 2);
if (t > period) t = 2 * period - t;
linear(Math.sin(t * Math.PI / period), 0, 1, surface, apogee)
------------------------------------------------
Wiggle from Leader
These two expressions create a “follow the leader” effect. One works from the top down, the other from the bottom up. Only use one.
A follower will tag along after the leader, deviating from the path according to the wiggle properties that are specified in the
inputs.Once applied to a single follower, you can duplicate the layer as many times as you like and each subsequent copy will follow
along, offset in time from the last and wiggling uniquely. In this expression, the wiggle is based on the position of the leader.
Link Expresso sliders to lag (to interactively control how bunched togeher the layers are), winfreq (to control the frequency of the
wiggle) and wigamp (to control the amplitude of the wiggle). Apply Expresso effects to the leader only.
Change the word “Leader” to match the name of the leading layer.
//USE THIS ONE IF THE LAYERS STACK UP FROM BOTTOM LEADER
lagtime = .1;
wigfreq = 3; //wiggle frequency
wigamt = 30; //wiggle amount
adj = (this_comp.num_layers - index) * lagtime;
this_comp.layer("Leader").position.wiggle(wigfreq, wigamt, 2, .5,time - adj)
//OR...
//USE THIS ONE IF THE LAYERS STACK DOWN FROM TOP LEADER
lagtime = .1;
wigfreq = 3; //wiggle frequency
wigamt = 30; //wiggle amount
adj = (index - 1) * lagtime;
this_comp.layer("Leader").position.wiggle(wigfreq, wigamt, 2, .5,time - adj)
------------------------------------------------
Wiggle from Previous
This creates a “follow the leader” effect that works from the bottom up. A follower will tag along after the previous layer, deviating
from the previous path according to the wiggle properties that are specified in the inputs. Once applied to a single follower, you can
duplicate the layer as many times as you like and each subsequent copy will follow along, offset from the last in time and wiggling
uniquely. In this expression, the wiggle is based on the position of the previous layer.
Link Expresso sliders to lag (to interactively control how bunched togeher the layers are), winfreq (to control the frequency of the
wiggle) and wigamp (to control the amplitude of the wiggle). Apply Expresso effects to the leader only.
Change the word “Leader” to match the name of the leading layer.
//USE THIS ONE IF THE LAYERS STACK UP FROM BOTTOM LEADER
lagtime = .1;
wigfreq = 3; //wiggle frequency
wigamt = 30; //wiggle amount
adj = (this_comp.num_layers - index) * lagtime;
this_comp.layer(this_layer, 1).position.wiggle(wigfreq, wigamt, 2, .5,time - adj)
//OR...
//USE THIS ONE IF THE LAYERS STACK DOWN FROM TOP LEADER
lagtime = .1;
wigfreq = 3; //wiggle frequency
wigamt = 30; //wiggle amount
adj = (index - 1) * lagtime;
this_comp.layer(this_layer, -1).position.wiggle(wigfreq, wigamt, 2, .5,time - adj)
------------------------------------------------
2D Look At
Apply this Expression to the Rotation channel of any layer you wish to control,
Set LookAt, below, to the name of the layer you wish the layer to look at.
If the controlled layer is not initially pointing straight up, enter an offset amount in degrees, below, to adjust the direction it is
looking.
LookAt = "ball"
offset = 0
diffx = position[0] - this_comp.layer(LookAt).position[0];
diffy = position[1] - this_comp.layer(LookAt).position[1];
if (diffx == 0) {
diffx = 1 }
sign = 1 + (-1 * (diffx / Math.abs(diffx))) * 90;
radians_to_degrees(Math.atan(diffy/diffx)) + sign + offset
------------------------------------------------
3D Look At
Apply this expression to the orientation channel of the layer you wish to have look at another layer (the layer being controlled).
Enter the name of the layer to look at in LookAt below. If the layer being controlled does not correctly look at other layer, adjust the
layer offset by changing the X, Y and Z rotation values (not the orientation values) for the layer being controled.
LookAt = "ball"
look = look_at(position, this_comp.layer(LookAt).position);
[look[0], look[1], look[2]]
------------------------------------------------
Angle of View Zoomer
This allows you to control the angle of view of acamera interactively, by scaling a null object on screen.
To use: Create a null called "angle_zoomer".
Animate the null's scale to control viewing angle in degrees.
substitute = this_comp.layer("angle_zoomer").scale[1];
this_comp.width / (2 * Math.tan(degrees_to_radians(substitute/2)))
------------------------------------------------
Focal Length Zoomer
This expression will allow you to zoom a camera in After Effects using real-world focal length values.
To use this expression:
1. create a camera in after effects
2. create a null layer called "focal_zoomer" and turn off its visibility switch in the timeline
3. apply the expression below to the Zoom parameter of the camera
4. set the value of hFilmPlane in the expression to the size of your film, in milimeters
5. animate the null's scale to control the focal length of the camera, in milimeters
hFilmPlane = 35;
FocalLength = this_comp.layer("focal_zoomer").scale[1];
this_comp.width * (FocalLength/hFilmPlane)
------------------------------------------------
Camera Autofocus
Apply this expression to the Focus Distance of your camera, then change the name "Focus Layer" below, to the namer of the layer
you wish to keep in focus
focuser = "Focus Layer";
cam_to_layer = sub(this_comp.layer(focuser).position, position);
length(cam_to_layer)
------------------------------------------------
Useful Expressions
by Michael Natkin, Fred Lewis, and Brian Maffitt
Circle Fun
This generates perfect circular motion centered around the original position of the layer. I recommend that you map the radius and
cycle inputs to Expresso sliders, and the phase input to an Expresso angle.
Apply this expression to the position of the layer
radius = 75; // the radius of the circle
cycle = 1; // number of seconds to complete a circle; higher value = slower
if(cycle ==0){cycle = 0.001;} //avoids a “divide by zero” error
phase = 27; // initial angle in degrees from bottom
reverse = 1; // 1 for ccw, -1 for cw
x = Math.sin( reverse * degrees_to_radians(time * 360 / cycle + phase));
y = Math.cos(degrees_to_radians(time * 360 / cycle + phase));
add(mul(radius, [x, y]), position)
------------------------------------------------
Track a Child
This expression is designed to track the position of a layer that has been parented to one or more layers.
Use the expression below on the position property that you wish to animate, changing the name “Child” to match the neame of the
layer you wish to track. For instance, if you wat to use write-on to track the position of a layer called “moon”,
apply this expression
to the “brush position” property of the write-on filter, and change “child” to “moon”.
c = this_comp.layer(“child”);
c.to_comp(c.anchor_point)
------------------------------------------------
Adjustable Position Wiggle
Use this expression as an interactive, keyframeable Wiggler.
Apply it to the position of the layer you wish to wiggle.
wigfreq = 3; //wiggle frequency
wigamt = 30; //wiggle amount
wigdetail = 3; //detail of noise
position.wiggle(wigfreq, wigamt, wigdetail)
------------------------------------------------
Adjustable Rotation Wiggle
Use this expression as an interactive, keyframeable Wiggler.
Apply it to the rotation of the layer you wish to wiggle.
wigfreq = 5; //wiggle frequency
wigangle = 45; //wiggle amplitude
wignoise = 3; //octaves of noise
rotation.wiggle(wigfreq, wigangle, wignoise)
------------------------------------------------
Oscillate Position
Creates an oscillating motion between two specified 2-dimensional positions over a specified period of time (in seconds).
Use an adjustment layer with Expresso position controls for “from”, “to”, and an Expresso slider assigned to “period”.
Change “linear” to “ease” for smoother interpolation.
from = [50, 90]; //one end of your oscillation
to = [190, 30]; //the other end of your oscillation
period = 1.5; //time between oscillation points (multiply by 2 for a round trip)
t = time % (period * 2);
if (t > period) t = 2 * period - t;
linear(t, 0, period, from, to)
------------------------------------------------
Oscillate Rotation (or any single value)
Creates an oscillating motion between two specified values over a specified period of time (in seconds).
Use Expresso angles or sliders for “from”, “to”, and an Expresso slider assigned to “period” for fine control. You can apply these to
any layer.
Change “linear” to “ease” for smoother interpolation.
from = -45; //one end of your oscillation
to = 45; //the other end of your oscillation
period = 1.5; //time between oscillation points (multiply by 2 for a round trip)
t = time % (period * 2);
if (t > period) t = 2 * period - t;
linear(t, 0, period, from, to)
------------------------------------------------
Bounce
Creates a bouncing (sine wave) motion between two specified 2-dimensional positions over a specified period of time (in seconds).
Useful for creating bouncing balls.
Use Expresso position controls for “from”, “to”, and an Expresso slider assigned to “period” for fine control.
You can apply these to any layer.
surface = [320, 480]; //the position of the “bounce” surface
apogee = [320, 50]; //the “apogee” of the bounce
period = 1.5; //the length of time from surface to apogee
t = time % (period * 2);
if (t > period) t = 2 * period - t;
linear(Math.sin(t * Math.PI / period), 0, 1, surface, apogee)
------------------------------------------------
Wiggle from Leader
These two expressions create a “follow the leader” effect. One works from the top down, the other from the bottom up. Only use one.
A follower will tag along after the leader, deviating from the path according to the wiggle properties that are specified in the
inputs.Once applied to a single follower, you can duplicate the layer as many times as you like and each subsequent copy will follow
along, offset in time from the last and wiggling uniquely. In this expression, the wiggle is based on the position of the leader.
Link Expresso sliders to lag (to interactively control how bunched togeher the layers are), winfreq (to control the frequency of the
wiggle) and wigamp (to control the amplitude of the wiggle). Apply Expresso effects to the leader only.
Change the word “Leader” to match the name of the leading layer.
//USE THIS ONE IF THE LAYERS STACK UP FROM BOTTOM LEADER
lagtime = .1;
wigfreq = 3; //wiggle frequency
wigamt = 30; //wiggle amount
adj = (this_comp.num_layers - index) * lagtime;
this_comp.layer("Leader").position.wiggle(wigfreq, wigamt, 2, .5,time - adj)
//OR...
//USE THIS ONE IF THE LAYERS STACK DOWN FROM TOP LEADER
lagtime = .1;
wigfreq = 3; //wiggle frequency
wigamt = 30; //wiggle amount
adj = (index - 1) * lagtime;
this_comp.layer("Leader").position.wiggle(wigfreq, wigamt, 2, .5,time - adj)
------------------------------------------------
Wiggle from Previous
This creates a “follow the leader” effect that works from the bottom up. A follower will tag along after the previous layer, deviating
from the previous path according to the wiggle properties that are specified in the inputs. Once applied to a single follower, you can
duplicate the layer as many times as you like and each subsequent copy will follow along, offset from the last in time and wiggling
uniquely. In this expression, the wiggle is based on the position of the previous layer.
Link Expresso sliders to lag (to interactively control how bunched togeher the layers are), winfreq (to control the frequency of the
wiggle) and wigamp (to control the amplitude of the wiggle). Apply Expresso effects to the leader only.
Change the word “Leader” to match the name of the leading layer.
//USE THIS ONE IF THE LAYERS STACK UP FROM BOTTOM LEADER
lagtime = .1;
wigfreq = 3; //wiggle frequency
wigamt = 30; //wiggle amount
adj = (this_comp.num_layers - index) * lagtime;
this_comp.layer(this_layer, 1).position.wiggle(wigfreq, wigamt, 2, .5,time - adj)
//OR...
//USE THIS ONE IF THE LAYERS STACK DOWN FROM TOP LEADER
lagtime = .1;
wigfreq = 3; //wiggle frequency
wigamt = 30; //wiggle amount
adj = (index - 1) * lagtime;
this_comp.layer(this_layer, -1).position.wiggle(wigfreq, wigamt, 2, .5,time - adj)
------------------------------------------------
2D Look At
Apply this Expression to the Rotation channel of any layer you wish to control,
Set LookAt, below, to the name of the layer you wish the layer to look at.
If the controlled layer is not initially pointing straight up, enter an offset amount in degrees, below, to adjust the direction it is
looking.
LookAt = "ball"
offset = 0
diffx = position[0] - this_comp.layer(LookAt).position[0];
diffy = position[1] - this_comp.layer(LookAt).position[1];
if (diffx == 0) {
diffx = 1 }
sign = 1 + (-1 * (diffx / Math.abs(diffx))) * 90;
radians_to_degrees(Math.atan(diffy/diffx)) + sign + offset
------------------------------------------------
3D Look At
Apply this expression to the orientation channel of the layer you wish to have look at another layer (the layer being controlled).
Enter the name of the layer to look at in LookAt below. If the layer being controlled does not correctly look at other layer, adjust the
layer offset by changing the X, Y and Z rotation values (not the orientation values) for the layer being controled.
LookAt = "ball"
look = look_at(position, this_comp.layer(LookAt).position);
[look[0], look[1], look[2]]
------------------------------------------------
Angle of View Zoomer
This allows you to control the angle of view of acamera interactively, by scaling a null object on screen.
To use: Create a null called "angle_zoomer".
Animate the null's scale to control viewing angle in degrees.
substitute = this_comp.layer("angle_zoomer").scale[1];
this_comp.width / (2 * Math.tan(degrees_to_radians(substitute/2)))
------------------------------------------------
Focal Length Zoomer
This expression will allow you to zoom a camera in After Effects using real-world focal length values.
To use this expression:
1. create a camera in after effects
2. create a null layer called "focal_zoomer" and turn off its visibility switch in the timeline
3. apply the expression below to the Zoom parameter of the camera
4. set the value of hFilmPlane in the expression to the size of your film, in milimeters
5. animate the null's scale to control the focal length of the camera, in milimeters
hFilmPlane = 35;
FocalLength = this_comp.layer("focal_zoomer").scale[1];
this_comp.width * (FocalLength/hFilmPlane)
------------------------------------------------
Camera Autofocus
Apply this expression to the Focus Distance of your camera, then change the name "Focus Layer" below, to the namer of the layer
you wish to keep in focus
focuser = "Focus Layer";
cam_to_layer = sub(this_comp.layer(focuser).position, position);
length(cam_to_layer)
------------------------------------------------
تعليق