Liste der wichtigsten After Effects Expressions
Entfessle die wahre Kraft von Adobe After Effects mit unserer Liste der wichtigsten Expressions und Spickzettel. Egal, ob du ein Anfänger bist, der AE-Expressions verstehen möchte, oder ein Profi, der seinen Workflow für After Effects optimieren möchte, dieser Leitfaden ist für dich!
Was sind After Effects Expressions?
After Effects Expressions sind kleine Code-Stücke, basierend auf JavaScript, die es dir ermöglichen, Animationen zu automatisieren, Eigenschaften zu verknüpfen und komplexe Beziehungen zwischen Ebenen und Effekten zu erstellen, ohne manuell Hunderte von Keyframes zu erstellen. Stell sie dir vor als Mini-Programme, die After Effects sagen, was mit einer Eigenschaft über die Zeit oder basierend auf anderen Eigenschaften geschehen soll. Das Erlernen von After Effects Expressions kann deinen Workflow drastisch beschleunigen und eine neue Welt kreativer Möglichkeiten eröffnen, von einfachen Wacklern bis hin zu komplexen Textanimations-Expressions.
Wenn du dich jemals dabei ertappt hast, eine sich wiederholende Bewegung mühsam mit Keyframes zu versehen oder dir gewünscht hast, dass eine Ebene intelligent auf eine andere reagieren könnte, dann sind Expressions in AE deine Antwort. Von einfachen Wacklern bis hin zu komplexen prozeduralen Animationen sind sie ein Eckpfeiler professioneller Motion Graphics und visueller Effekte in After Effects.
Die Grundlagen der Verwendung von Expressions
Die Verwendung von Expressions ist unkompliziert:
1. Eine Expression hinzufügen: Alt-Klick (Option-Klick auf Mac) auf das Stoppuhr-Symbol neben einer beliebigen Ebeneneigenschaft in der Zeitleiste (z. B. Position, Skalierung, Deckkraft). Dies öffnet das Expression-Editor-Feld.
2. Den Pick Whip verwenden: Dieses spiralförmige Symbol (@) ermöglicht es dir, Eigenschaften visuell zu verknüpfen. Ziehe es auf eine andere Eigenschaft, und After Effects schreibt den grundlegenden Verknüpfungscode für dich – ein großartiger Start!
3. Aktivieren/Deaktivieren: Klicke auf das Gleichheitszeichen (=) neben einem Expression-Feld, um es ein- oder auszuschalten.
Schnelle Navigation: Expressions-Liste
Wichtige After Effects Expressions
Lass uns einige der nützlichsten Expressions aufschlüsseln, von grundlegenden Bausteinen bis hin zu spezialisierten, fortgeschrittenen Expressions. Diese After Effects Expressions-Liste soll eine zentrale Ressource sein. Einige dieser Expressions oder ihre Konzepte wurden von der exzellenten Bibliothek unter PlainlyVideos.com inspiriert – schau dort vorbei für noch mehr Ideen!
Die legendäre wiggle() erzeugt zufällige, organisch aussehende Bewegungen. Sie wird gesteuert durch Frequenz (wie viele Wackler pro Sekunde) und Amplitude (wie stark die Eigenschaft abweicht). Optionale Parameter sind Oktaven (fügt Details hinzu), amp_mult (Oktaven-Amplituden-Multiplikator) und t (Basiszeit).
Um eine einzelne Achse zu wackeln (z. B. die Y-Achse der Position): [value[0], wiggle(2,50)[1]];
// --- Wiggle Controls ---
var frequency = 2; // Wiggles per second (e.g., 1 for slow, 5 for fast)
var amplitude = 50; // Max amount of change (e.g., 50 pixels for position)
var octaves = 1; // Optional: Layers of detail in the wiggle (usually 1-3)
var amp_mult = 0.5; // Optional: How much an octave affects amplitude (0 to 1)
var timeToWiggleAt = time; // Optional: Base time for wiggle (default is current time)
wiggle(frequency, amplitude, octaves, amp_mult, timeToWiggleAt);
Häufig angewendet auf: Position, Skalierung, Rotation, Deckkraft, Effekteigenschaften
Unerlässlich für das Wiederholen von Keyframe-Animationen. loopOut() wirkt sich auf die Animation *nach* dem letzten Keyframe aus; loopIn() wirkt sich *vor* dem ersten aus. Der type Parameter (z. B. „cycle“, „pingpong“, „offset“, „continue“) definiert das Schleifenverhalten. numKeyframes (Standard 0 für alle) gibt an, wie viele Keyframes vom Ende/Anfang das Schleifensegment definieren.
// --- LoopOut Example (applied after last keyframe) ---
var loopType = "cycle"; // "cycle", "pingpong", "offset", or "continue"
var numKeyframesToLoop = 0; // 0 means all keyframes, 1 means segment between last two, etc.
loopOut(loopType, numKeyframesToLoop);
// --- LoopIn Example (applied before first keyframe) ---
// loopIn(loopType, numKeyframesToLoop);
Häufig angewendet auf: Jede keyframebare Eigenschaft (Position, Skalierung, Rotation, Deckkraft, Time Remap)
Gibt einfach die aktuelle Kompositionszeit in Sekunden zurück. Grundlegend für die Erstellung von Animationen, die konsistent oder mit konstanter Geschwindigkeit fortschreiten.
// Basic time usage (returns current time in seconds)
time;
// Example: Continuous Rotation (apply to Rotation property)
var rotationSpeed = 90; // Degrees per second
time * rotationSpeed;
// Example: Constant Horizontal Movement (apply to Position property)
var initialX = value[0]; // Or a specific starting X value like 100
var speedX = 200; // Pixels per second
[initialX + time * speedX, value[1]]; // Keeps original Y
Häufig angewendet auf: Rotation, Position, Deckkraft (für zeitgesteuerte Überblendungen), Steuerung anderer Expressions
Repräsentiert den ursprünglichen, vor-Expression-Wert der Eigenschaft (aus Keyframes oder dem in der Benutzeroberfläche festgelegten Wert). Entscheidend, um bestehende Animationen nicht-destruktiv zu ergänzen oder zu modifizieren.
// Example: Add a small wiggle to existing keyframed position
value + wiggle(0.5, 15);
Häufig angewendet auf: Jede Eigenschaft, um ihre bestehende Keyframe-Animation zu modifizieren.
Gibt den Wert der Eigenschaft zurück, auf die sie angewendet wird, jedoch zu einer bestimmten Zeit `t` (in Sekunden), die du angibst, anstatt der aktuellen Kompositionszeit. Hervorragend geeignet, um Verzögerungen oder Echo-Effekte zu erzeugen.
// --- Delayed Follow Example (apply to Position property of follower layer) ---
var leaderLayer = thisComp.layer("LeaderLayerName"); // Change "LeaderLayerName" to the name of your leader layer
var delayInSeconds = 0.5; // How much time delay
leaderLayer.transform.position.valueAtTime(time - delayInSeconds);
Häufig angewendet auf: Position, Skalierung, Rotation, Deckkraft (um einer anderen Ebene mit Verzögerung zu folgen)
Gibt die eigene Nummer der Ebene im Ebenenstapel zurück (die oberste Ebene ist 1, die zweite ist 2 usw.). Sehr nützlich, um automatische Offsets oder Variationen über mehrere duplizierte Ebenen hinweg zu erstellen.
// Example: Staggered Opacity for duplicated layers
var baseOpacity = 100;
var opacityDecrementPerLayer = 10; // Each layer below will be 10% less opaque
baseOpacity - (index - 1) * opacityDecrementPerLayer; // (index-1) so first layer is full opacity
Häufig angewendet auf: Jede Eigenschaft, um Variationen über duplizierte Ebenen hinweg zu erstellen (z. B. Positions-Offset, Rotations-Offset, Farbvariationen, Deckkraft)
Verknüpfe Teile deiner Expression mit Effekt-Steuerelementen (wie „Schieberegler-Steuerung“, „Kontrollkästchen-Steuerung“, „Farb-Steuerung“ unter Effekt > Expression Controls) für einfache Anpassungen, ohne den Code bearbeiten zu müssen. Füge die Steuerung einer Ebene hinzu (oft ein Null-Objekt namens „Controller“) und verknüpfe sie mit dem Pick-Whip.
// Example: Control Wiggle Frequency with a slider named "FreqControl" on this layer
var freq = effect("FreqControl")("Slider");
var amp = 50; // Amplitude can still be fixed or linked to another slider
wiggle(freq, amp);
Häufig angewendet auf: Jede Expression, bei der du benutzerfreundliche Steuerelemente für Variablen möchtest (z. B. Wiggle-Frequenz/Amplitude, Farbwerte, Kontrollkästchen-Umschalter).
Standard-Trigonometriefunktionen zum Erstellen von sanften, wellenartigen oder oszillierenden Bewegungen. Winkel müssen in Radiant angegeben werden (verwende degreesToRadians(degrees) zum Umrechnen).
// Example: Y Position sine wave movement
var initialY = value[1]; // Initial Y position of the layer
var amplitude = 50; // How high/low the wave goes (pixels)
var frequency = 2; // How many full cycles per second
var yPositionOffset = Math.sin(time * frequency * 2 * Math.PI) * amplitude;
[value[0], initialY + yPositionOffset]; // Keep original X, animate Y
Häufig angewendet auf: Position (für Wellenbewegung), Rotation (für Oszillation), Skalierung (für Pulsieren), Deckkraft (für Flackern).
random(min, max) erzeugt eine Pseudozufallszahl zwischen min und max (oder 0 und min, wenn nur ein Argument vorhanden ist). Um einen konsistenten Zufallswert pro Ebene zu erhalten, der sich nicht mit der Zeit ändert, verwende seedRandom(seedValue, timeless = true) vor random(), oft unter Verwendung von index als seedValue.
// Example: Random opacity per layer that stays consistent
var minOpacity = 20;
var maxOpacity = 80;
seedRandom(index, true); // Seed with layer index, timeless makes it fixed per layer
random(minOpacity, maxOpacity);
// Example: Random opacity that changes every frame (no seedRandom or timeless=false)
random(20, 80);
Häufig angewendet auf: Deckkraft, Position, Skalierung, Rotation, Farbe (für zufällige Variationen), Textanimator-Selektor-Betrag.
Leistungsstarke Interpolationsfunktionen. Wenn ein Input t (oft time) von tMin zu tMax, linear() überführt den Output von value1 zu value2. ease() wendet eine S-Kurve an (Ease-in und -out), während easeIn() und easeOut() einseitiges Easing bieten.
// Example: Scale from 50% to 100% between time 0 and 2 seconds, with S-curve easing
var startScale = 50;
var endScale = 100;
var startTime = 0;
var endTime = 2;
var s = ease(time, startTime, endTime, startScale, endScale);
[s,s];
// Example: Opacity fades from 0 to 100 between seconds 1 and 3 using linear
linear(time, 1, 3, 0, 100);
Häufig angewendet auf: Jede numerische Eigenschaft für sanfte Übergänge über die Zeit oder basierend auf einem Controller (z. B. Deckkraft, Skalierung, Position, Rotation, Effekteinstellungen).
Standard-Bedingungslogik. Wenn die condition als wahr ausgewertet wird, gibt der Ausdruck Anweisung A zurück; andernfalls gibt er Anweisung zurück. B.
// Example: Layer Opacity is 100% after 2 seconds, otherwise 0%
var timeThreshold = 2; // Seconds
if (time > timeThreshold) {
100; // Opacity if condition is true
} else {
0; // Opacity if condition is false
}
Häufig angewendet auf: Jede Eigenschaft, um Werte oder Verhaltensweisen basierend auf Bedingungen zu wechseln (z. B. Deckkraft, Textquelle, Effekt aktivieren/deaktivieren über Kontrollkästchen).
Ein beliebter Skript aus der Community, um natürliche Sprung- oder Federeffekte zu erzeugen, wenn eine Keyframe-Animation zum Stillstand kommt. Passe Amplitude (Sprungbetrag), Frequenz (Sprünge pro Sekunde) und Abklingzeit (wie schnell es verblasst) an.
// --- Inertial Bounce Controls ---
var amp = .055; // Amplitude: How much bounce (e.g., 0.01 for subtle, 0.2 for more)
var freq = 1.8; // Frequency: Bounces per second (e.g., 1 to 5)
var decayRate = 5.2;// Decay: How quickly bounce fades (e.g., 3 for slower, 10 for faster)
// --- Inertial Bounce Script (do not edit below unless you know what you're doing) ---
var n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time) n--;
}
var t = (n > 0) ? time - key(n).time : 0;
if (n > 0 && t >= 0){
var v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
value + v * amp * Math.sin(freq * t * 2 * Math.PI) / Math.exp(decayRate * t);
} else {
value;
}
Häufig angewendet auf: Position, Skalierung, Rotation (nach Keyframe-Bewegung).
Lässt diese Ebene in einem Kreis um eine angegebene „CenterLayerName“ kreisen. Passe Radius und Geschwindigkeit an.
// --- Orbit Controls ---
var centerLayerName = "CenterLayer"; // Name of the layer to orbit around
var orbitRadius = 500; // Radius of the orbit in pixels
var orbitSpeed = 2; // Speed of orbit (higher is faster, negative reverses)
// --- Orbit Script ---
var centerPt = thisComp.layer(centerLayerName).transform.position;
var currentAngle = time * orbitSpeed;
var x = centerPt[0] + Math.cos(currentAngle) * orbitRadius;
var y = centerPt[1] + Math.sin(currentAngle) * orbitRadius;
if (centerPt.length > 2 && transform.position.length > 2) { // If both are 3D
var z = value[2]; // Maintain this layer's Z, or use centerPt[2] to orbit in center's Z plane
[x, y, z];
} else { // For 2D layers
[x, y];
}
Häufig angewendet auf: Position.
Simuliert den klassischen DVD-Logo-Bildschirmschoner, wodurch die Ebene diagonal bewegt wird und von den Kompositionsrändern abprallt. Geschwindigkeiten sind einstellbar.
// --- Bounce Controls ---
var horizontalSpeed = 300; // Speed in X direction (pixels per second)
var verticalSpeed = 200; // Speed in Y direction (pixels per second)
// --- Bounce Script ---
var layerRect = sourceRectAtTime(time, false);
var effectiveLayerWidth = layerRect.width * transform.scale[0]/100;
var effectiveLayerHeight = layerRect.height * transform.scale[1]/100;
var compW = thisComp.width;
var compH = thisComp.height;
var minX = effectiveLayerWidth / 2;
var maxX = compW - (effectiveLayerWidth / 2);
var minY = effectiveLayerHeight / 2;
var maxY = compH - (effectiveLayerHeight / 2);
var t = time - inPoint;
var rawX = minX + (t * horizontalSpeed);
var rawY = minY + (t * verticalSpeed);
var bounceCountX = Math.floor(rawX / (maxX - minX));
var bounceCountY = Math.floor(rawY / (maxY - minY));
var finalX, finalY;
if (bounceCountX % 2 == 1){ finalX = maxX - (rawX % (maxX - minX)); }
else { finalX = minX + (rawX % (maxX - minX)); }
if (bounceCountY % 2 == 1){ finalY = maxY - (rawY % (maxY - minY)); }
else { finalY = minY + (rawY % (maxY - minY)); }
[finalX, finalY];
Häufig angewendet auf: Position.
Erzeugt eine federartige Verbindung, bei der diese Ebene einer „leaderLayerName“ mit einer federnden, überschießenden Bewegung folgt. Passe Ruhelänge, Steifigkeit und Dämpfung an. Kann aufgrund der iterativen Berechnung Frame für Frame rechenintensiv sein.
// --- Spring Controls ---
var leaderLayerName = "leader"; // Name of the layer to follow
var restLength = 20; // Desired resting distance between leader and follower anchor points
var springStiffness = 0.1; // Stiffness of the spring (e.g., 0.05 for softer, 0.2 for stiffer)
var dampingFactor = 0.95; // Damping (0 to 1). Lower is more springy, higher is less oscillation.
// --- Spring Script ---
var leader = thisComp.layer(leaderLayerName);
var fDur = thisComp.frameDuration;
var currTime = time;
var pFollower = position.valueAtTime(0); // Follower's initial position (at its inPoint)
var vFollower = [0,0,0]; // Follower's initial velocity
if (position.length === 2) vFollower = [0,0]; // Match 2D/3D for velocity array
for (var t = 0; t <= currTime - thisLayer.inPoint; t += fDur){ // Iterate for duration layer has been active
var leaderTime = thisLayer.inPoint + t; // Time to sample leader
if (leaderTime > leader.outPoint) leaderTime = leader.outPoint; // Clamp if leader ends
if (leaderTime < leader.inPoint) leaderTime = leader.inPoint; // Clamp if leader starts later
var pLeader = leader.transform.position.valueAtTime(leaderTime);
var delta = pFollower - pLeader;
var currentDist = length(delta);
var springForceMagnitude = (currentDist - restLength) * springStiffness; // Hooke's Law
var springForceVector = [0,0,0];
if (currentDist > 0.001) { // Avoid division by zero if coincident
springForceVector = normalize(delta) * springForceMagnitude;
}
if (position.length === 2 && springForceVector.length === 3) { // Ensure vector matches dimension
springForceVector = [springForceVector[0], springForceVector[1]];
}
vFollower = (vFollower - springForceVector) * dampingFactor; // Apply force to velocity, then damp
pFollower += vFollower * fDur; // Update follower's position (integrate velocity)
}
pFollower;
Häufig angewendet auf: Position.
Erzeugt ein Positions-Wackeln, das nahtlos über eine definierte loopDurationSeconds schleift. Nützlich für kontinuierliche, zufällig aussehende Hintergrundbewegungen.
// --- Loopable Wiggle Controls ---
var wiggleFrequency = 1; // Wiggles per second
var wiggleAmplitude = 110; // Wiggle amount in pixels
var loopDurationSeconds = 3;// Duration of the loop in seconds
// --- Loopable Wiggle Script ---
var t = time % loopDurationSeconds;
var wiggle1 = wiggle(wiggleFrequency, wiggleAmplitude, 1, 0.5, t);
var wiggle2 = wiggle(wiggleFrequency, wiggleAmplitude, 1, 0.5, t - loopDurationSeconds);
linear(t, 0, loopDurationSeconds, wiggle1, wiggle2);
Häufig angewendet auf: Position.
Positioniert die aktuelle Ebene dynamisch genau auf halbem Weg zwischen zwei anderen angegebenen Ebenen, referenziert durch ihren Stapelindex (z. B. Ebene 1 und 2) oder durch ihren Namen.
// --- Referencing Layers ---
// Option 1: By Layer Index (1 is top layer, 2 is second, etc.)
var layerA = thisComp.layer(1);
var layerB = thisComp.layer(2);
// Option 2: By Layer Name (uncomment and use instead if preferred)
// var layerA = thisComp.layer("NameOfFirstLayer");
// var layerB = thisComp.layer("NameOfSecondLayer");
// --- Calculation ---
(layerA.transform.position + layerB.transform.position) / 2;
Häufig angewendet auf: Position.
Eine vereinfachte 2D-Physiksimulation. Ebenen reagieren auf die Schwerkraft und prallen von den Kompositionsrändern (Wänden) ab, die unabhängig mit Schiebereglern eingestellt werden können. Es wird eine iterative Berechnung vom In-Point der Ebene verwendet, die bei vielen Objekten oder langen Dauern langsam werden kann.
Einrichtung: Erstelle eine Null-Ebene namens „PhysicsSettings2D“. Füge ihr Schieberegler-Steuerelemente mit den Namen „Gravity Y“, „Wall Bounce Factor“, „Global Damping“, „Min X Wall“, „Max X Wall“, „Min Y Wall“, „Max Y Wall“ hinzu. Füge auf jeder Physikobjekt-Ebene Schieberegler für „Initial Velocity X“, „Initial Velocity Y“ und „Radius“ hinzu.
// --- Global Physics Settings (Reads from Null Layer "PhysicsSettings2D") ---
var settingsNullName = "PhysicsSettings2D";
var gravY = 980, wallBounce = 0.7, damping = 0.995; // Defaults
var minXWall = 0, maxXWall = thisComp.width, minYWall = 0, maxYWall = thisComp.height; // Defaults
try {
var settingsLayer = thisComp.layer(settingsNullName);
gravY = settingsLayer.effect("Gravity Y")("Slider");
wallBounce = settingsLayer.effect("Wall Bounce Factor")("Slider");
damping = settingsLayer.effect("Global Damping")("Slider");
minXWall = settingsLayer.effect("Min X Wall")("Slider");
maxXWall = settingsLayer.effect("Max X Wall")("Slider");
minYWall = settingsLayer.effect("Min Y Wall")("Slider");
maxYWall = settingsLayer.effect("Max Y Wall")("Slider");
} catch(err) { /* Use defaults if settings layer or sliders are missing */ }
// --- Individual Object Properties (Reads from sliders on THIS layer) ---
var iVelX = 0, iVelY = 0, radiusThis = 25; // Default radius
try { iVelX = effect("Initial Velocity X")("Slider"); } catch(e){ iVelX = (index % 7 - 3) * 20; } // Default variation
try { iVelY = effect("Initial Velocity Y")("Slider"); } catch(e){ iVelY = -(index % 5) * 50 -50; } // Default variation
try { radiusThis = Math.max(1, effect("Radius")("Slider")); } catch(e){} // Ensure radius is at least 1
// --- Simulation ---
var dt = thisComp.frameDuration;
var p = transform.position.valueAtTime(inPoint); // Start at initial keyframed position or value
var v = [iVelX, iVelY]; // Initial velocity
// Effective boundaries considering object radius
var effectiveMinX = minXWall + radiusThis;
var effectiveMaxX = maxXWall - radiusThis;
var effectiveMinY = minYWall + radiusThis;
var effectiveMaxY = maxYWall - radiusThis;
// Iterate from layer's inPoint up to the current time to simulate physics progression
for (var t = inPoint; t < time; t += dt){
// Apply Gravity (only to Y velocity)
v[1] = v[1] + gravY * dt;
// Apply Global Damping (Air Resistance)
v = v * damping;
// Update Position based on velocity
p = p + v * dt;
// Boundary Collisions & Bounce
// X-axis
if (p[0] < effectiveMinX) {
p[0] = effectiveMinX;
v[0] *= -wallBounce;
} else if (p[0] > effectiveMaxX) {
p[0] = effectiveMaxX;
v[0] *= -wallBounce;
}
// Y-axis
if (p[1] < effectiveMinY) {
p[1] = effectiveMinY;
v[1] *= -wallBounce;
} else if (p[1] > effectiveMaxY) {
p[1] = effectiveMaxY;
v[1] *= -wallBounce;
}
}
p; // Resulting position for the current frame
Häufig angewendet auf: Position (von 2D-Ebenen).
Rotiert eine 2D-Ebene so, dass sie immer auf eine andere angegebene „targetLayerName“ zeigt. Eine artworkPointingOffsetDegrees könnte erforderlich sein, wenn die Grafik der Ebene standardmäßig nicht nach rechts (0 Grad) zeigt.
// --- LookAt Controls ---
var targetLayerName = "targetLayer"; // Name of the layer to point towards
var artworkPointingOffsetDegrees = 0; // Adjust if your artwork points up (e.g., 90 or -90), left (e.g., 180) by default
// --- LookAt Script ---
function calculateLookAtAngle(fromPoint, toPoint) {
var deltaX = toPoint[0] - fromPoint[0];
var deltaY = toPoint[1] - fromPoint[1];
var angleRad = Math.atan2(deltaY, deltaX);
return radiansToDegrees(angleRad);
}
var thisLayerPosition = transform.position;
var targetPosition = thisComp.layer(targetLayerName).transform.position;
calculateLookAtAngle(thisLayerPosition, targetPosition) + artworkPointingOffsetDegrees;
Häufig angewendet auf: Rotation (einer 2D-Ebene).
Richtet eine 3D-Ebene (oder Kamera) so aus, dass ihre Z-Achse von einer „viewPointLayerName“ (oder ihrer eigenen Position) auf eine „targetLayerName“ im 3D-Raum zeigt, unter Verwendung von After Effects' integriertem lookAt().
// --- 3D LookAt Controls ---
var targetLayerName = "Target"; // Name of the layer to look AT
var viewPointLayerName = "Point"; // Name of layer defining the viewpoint.
// If this layer IS the viewpoint, use thisLayer.name or an empty string.
// --- 3D LookAt Script ---
var targetObj = thisComp.layer(targetLayerName);
var fromPosition;
if (viewPointLayerName == "" || thisComp.layer(viewPointLayerName) == thisLayer) {
fromPosition = toWorld(transform.anchorPoint); // This layer is the viewpoint
} else {
var viewPointObj = thisComp.layer(viewPointLayerName);
fromPosition = viewPointObj.toWorld(viewPointObj.transform.anchorPoint);
}
var targetPosition = targetObj.toWorld(targetObj.transform.anchorPoint);
lookAt(fromPosition, targetPosition);
Häufig angewendet auf: Ausrichtung (einer 3D-Ebene oder Kamera).
Auf die Rotation einer Kindebene angewendet, behält diese ihre eigene Rotation im Weltraum bei und wirkt so der von ihrem Elternteil geerbten Rotation entgegen.
// --- Ignore Parent Rotation Script ---
if (hasParent) {
value - parent.transform.rotation;
} else {
value; // No parent, so just use its own rotation
}
Häufig angewendet auf: Rotation.
Erzeugt eine realistische abklingende Pendelschwingung auf der Rotation. Passe Frequenz (Schwingungen pro Sekunde), anfängliche Amplitude (Grad) und Abklingrate an.
// --- Pendulum Controls ---
var swingFrequency = 1.0; // Swings per second (e.g., 1 full back-and-forth per second)
var initialAmplitude = 45; // Initial swing angle in degrees (e.g., 45 degrees to each side)
var decayRate = 0.5; // How quickly swing dampens (0 = no decay, higher = faster stop)
// --- Pendulum Script ---
initialAmplitude * Math.sin(time * swingFrequency * Math.PI * 2) * Math.exp(-decayRate * time);
Häufig angewendet auf: Rotation.
Wirkt den Skalierungstransformationen einer Elternebene entgegen, um die visuelle Größe dieser Kindebene konsistent zu halten, als ob sie nicht verknüpft wäre oder ihr Elternteil auf 100 % Skalierung stünde.
// --- Maintain Scale Script ---
var newScale = [];
if (hasParent) {
var parentScale = parent.transform.scale.value;
for (var i = 0; i < parentScale.length; i++){ // Works for 2D or 3D scale
if (parentScale[i] === 0) { // Avoid division by zero
newScale[i] = value[i]; // Or some large number if you want it to "disappear"
} else {
newScale[i] = value[i] * 100 / parentScale[i];
}
}
} else {
newScale = value; // No parent, so use its own scale value
}
newScale;
Häufig angewendet auf: Skalierung.
Erzeugt einen rhythmischen Skalierungspuls. Die Steuerelemente umfassen Geschwindigkeit, Betrag, Basisskalierung, Phase und Modus (symmetrisches Wachsen/Schrumpfen, nur Wachsen oder nur Schrumpfen).
// --- Pulse Controls ---
var pulseSpeed = 1.0; // Cycles per second (e.g., 1.0 for one full pulse per second)
var pulseAmount = 20; // Percentage of scale change (e.g., 20 means ±20% if mode is 0)
var baseScaleValue = [100, 100]; // Resting scale [X,Y] or [X,Y,Z] for 3D layers
var phaseOffsetCycles = 0.0;// Shifts start point of pulse (0 to 1, e.g., 0.25 starts at peak)
var pulseMode = 1; // 0 = grow & shrink; 1 = only grow from base; 2 = only shrink from base
// --- Pulse Script ---
var angle = (time * pulseSpeed + phaseOffsetCycles) * 2 * Math.PI;
var rawOffset;
if (pulseMode == 0) { rawOffset = Math.sin(angle) * pulseAmount; }
else if (pulseMode == 1) { rawOffset = ((1 - Math.cos(angle)) / 2) * pulseAmount; }
else if (pulseMode == 2) { rawOffset = -((1 - Math.cos(angle)) / 2) * pulseAmount; }
else { rawOffset = Math.sin(angle) * pulseAmount; } // Fallback
var finalScale = [];
for (var i = 0; i < baseScaleValue.length; i++) {
finalScale[i] = baseScaleValue[i] + rawOffset;
}
finalScale;
Häufig angewendet auf: Skalierung.
Blendet die Deckkraft einer 3D-Ebene dynamisch basierend auf ihrer Entfernung von der aktiven Kamera aus, zwischen einem definierten startFadeDistance und endFadeDistance.
// --- Fade Controls ---
var startFadeDistance = 500; // Distance (pixels) from camera where fade begins (100% opacity closer than this)
var endFadeDistance = 1500; // Distance (pixels) from camera where layer is fully faded (0% opacity further than this)
// --- Fade Script ---
var camPosition;
try {
camPosition = thisComp.activeCamera.toWorld([0,0,0]);
} catch (err) {
var compWidthForDefaultCam = thisComp.width * thisComp.pixelAspect;
var defaultCamZ = (compWidthForDefaultCam/2) / Math.tan(degreesToRadians(19.799)); // Approx 50mm lens
camPosition = [thisComp.width/2, thisComp.height/2, -defaultCamZ];
}
var layerPosition = toWorld(anchorPoint);
var distanceToCam = length(camPosition, layerPosition);
linear(distanceToCam, startFadeDistance, endFadeDistance, 100, 0);
Häufig angewendet auf: Deckkraft (einer 3D-Ebene).
Passt die Breite einer Kontur an, um den 2D-Skalierungstransformationen der Ebene entgegenzuwirken, wodurch die Kontur visuell konsistent erscheint, auch wenn die Ebene skaliert wird.
// --- Maintain Apparent Stroke Width Script ---
// No user-editable variables needed for this typical implementation.
// It divides the original stroke 'value' by a measure of the layer's current scale.
var scaleFactor = length(toComp([0,0]), toComp([0.7071,0.7071]));
if (scaleFactor === 0) scaleFactor = 0.001; // Avoid division by zero
value / scaleFactor;
Häufig angewendet auf: Formebenen-Konturstärke, Textebenen-Konturstärke (bei Verwendung von Ebenenstilen).
Steuere Texteigenschaften wie Schriftart, Größe, Farbe und Zeichenabstand dynamisch mit text.sourceText.style Methoden (AE 17.0+). Verkette Methoden für komplexe Gestaltung. Die Zeichen-für-Zeichen-Gestaltung (AE 25.0+) verwendet optionale startIndex und numOfCharacters Argumente in vielen Gestaltungsmethoden.
// Example: Changing Font, Size, and Fill Color
text.sourceText.style
.setFont("Impact")
.setFontSize(120)
.setFillColor([1, 0.5, 0]); // Orange: [Red, Green, Blue] values 0-1
// Example: Adding a Stroke and Changing Text Content
var styleObj = text.sourceText.style;
styleObj = styleObj.setStrokeColor([0.2, 0.8, 0.2]); // Green stroke
styleObj = styleObj.setStrokeWidth(5);
styleObj = styleObj.setApplyStroke(true); // Important to make stroke visible
styleObj = styleObj.setTracking(20);
styleObj.setText("Styled with Expressions!"); // This must be the last style modification if changing text content
Häufig angewendet auf: Quelltext (um seine Gestaltungsattribute zu steuern).
Verwende bedingte Logik innerhalb eines Ausdrucksselektors, um den Effekt eines Animators nur auf bestimmte Zeichen anzuwenden, basierend auf deren textIndex (0 für das erste Zeichen, 1 für das zweite usw.).
// --- Targeting Controls ---
// Example: Affect only the first 3 characters (indices 0, 1, 2)
var charactersToTarget = 3;
if (textIndex < charactersToTarget) {
100; // Full effect
} else {
0; // No effect
}
// Example: Affect characters from index 2 up to (but not including) index 5
var startIndex = 2; // Third character
var endIndex = 5; // Affects up to character before this index (i.e., characters at index 2, 3, 4)
if (textIndex >= startIndex && textIndex < endIndex) {
100; // Apply full animator effect
} else {
0; // No effect for other characters
}
Häufig angewendet auf: Textanimator > Ausdrucksselektor > Betrag.
Zielt auf jedes N-te Zeichen mit einem Ausdrucksselektor ab. Du kannst das Intervall (N) und einen Offset steuern, um den Startpunkt zu ändern (z. B. um gerade oder ungerade Zeichen auszuwählen).
// --- Nth Character Selector Controls ---
// Apply this to a Text Animator's Expression Selector > Amount property.
var nthValue = 2; // Select every 2nd character (for every other character)
// Change to 3 for every 3rd character, etc.
var startOffset = 0; // 0 to start with the Nth character (e.g. if Nth=2, characters 1,3,5... using 0-based textIndex)
// 1 to start with the (Nth + offset) character (e.g. if Nth=2 & offset=1, characters 0,2,4...)
// --- Nth Character Script ---
if (nthValue <= 0) nthValue = 1; // Prevent division by zero or negative values
if ((textIndex + startOffset) % nthValue == 0) {
100; // Apply full animator effect to this character
} else {
0; // No effect for other characters
}
Häufig angewendet auf: Textanimator > Ausdrucksselektor > Betrag.
Skaliert eine Textebene automatisch proportional, um sicherzustellen, dass sie innerhalb vordefinierter Breiten- und Höhenbegrenzungen passt. Nützlich für MOGRTs, bei denen die Textlänge variieren kann.
// --- Dynamic Text Scaling Controls ---
var maxWidthBoundary = 500; // Desired maximum width for the text
var maxHeightBoundary = 100; // Desired maximum height for the text
var overallScalePercentage = 100; // Additional overall scale (100 = no change from fit)
var measureAtCurrentTime = true; // true: measure text at current time; false: measure at time 0
// --- Scaling Script ---
var timeToMeasureAt = measureAtCurrentTime ? time : 0;
var textRect = sourceRectAtTime(timeToMeasureAt);
var currentTextWidth = textRect.width;
var currentTextHeight = textRect.height;
var widthScaleFactor = 1;
var heightScaleFactor = 1;
if (currentTextWidth > 0) widthScaleFactor = maxWidthBoundary / currentTextWidth;
if (currentTextHeight > 0) heightScaleFactor = maxHeightBoundary / currentTextHeight;
var finalFitScaleFactor = Math.min(widthScaleFactor, heightScaleFactor);
var s = finalFitScaleFactor * overallScalePercentage;
if (currentTextWidth === 0 || currentTextHeight === 0) { s = overallScalePercentage; }
else if (finalFitScaleFactor >= 1 && overallScalePercentage < 100) { s = overallScalePercentage; }
else if (finalFitScaleFactor < 1) { s = finalFitScaleFactor * 100 * (overallScalePercentage / 100); }
else { s = overallScalePercentage; }
[s, s];
Häufig angewendet auf: Skalierung (einer Textebene).
Passt den Ankerpunkt einer Ebene an eine von neun logischen Positionen an (z. B. Mitte, oben links), basierend auf der Bounding Box ihres Inhalts (sourceRectAtTime). Obwohl äußerst nützlich für Textebenen, kann es auch auf Formebenen oder andere Ebenen angewendet werden, bei denen sourceRectAtTime aussagekräftige Dimensionen liefert. Gewährleistet konsistente Transformationen wie Skalierung oder Rotation, unabhängig von Inhaltsänderungen.
// --- Anchor Point Control ---
// Choose a number from 1 to 9 for anchorPosition:
// 1=Top Left, 2=Top Center, 3=Top Right
// 4=Middle Left, 5=Middle Center, 6=Middle Right
// 7=Bottom Left, 8=Bottom Center, 9=Bottom Right
var anchorPosition = 5;
var measureAtCurrentTime = true;
// --- Anchor Point Script ---
var timeToMeasureAt = measureAtCurrentTime ? time : 0;
var layerRect = thisLayer.sourceRectAtTime(timeToMeasureAt);
var L = layerRect.left;
var T = layerRect.top;
var W = layerRect.width;
var H = layerRect.height;
var xAnchor, yAnchor;
switch(anchorPosition){
case 1: xAnchor=L; yAnchor=T; break;
case 2: xAnchor=L+W/2; yAnchor=T; break;
case 3: xAnchor=L+W; yAnchor=T; break;
case 4: xAnchor=L; yAnchor=T+H/2; break;
case 5: xAnchor=L+W/2; yAnchor=T+H/2; break;
case 6: xAnchor=L+W; yAnchor=T+H/2; break;
case 7: xAnchor=L; yAnchor=T+H; break;
case 8: xAnchor=L+W/2; yAnchor=T+H; break;
case 9: xAnchor=L+W; yAnchor=T+H; break;
default: xAnchor=L+W/2; yAnchor=T+H/2;
}
[xAnchor, yAnchor];
Häufig angewendet auf: Ankerpunkt (hauptsächlich für Text- oder Formebenen).
Konvertiert einen numerischen Wert von einem „Slider Control“ (der die Gesamtsekunden darstellt) auf derselben Ebene in ein HH:MM:SS-Zeitcodeformat auf einer Textebene.
// --- Timer Control ---
// Add a "Slider Control" effect to this text layer.
// The slider's value will be interpreted as total seconds.
var totalSecondsInput = Math.round(effect("Slider Control")("Slider").value);
// --- Timer Script ---
var hrs = Math.floor(totalSecondsInput / 3600);
var mins = Math.floor((totalSecondsInput % 3600) / 60);
var secs = totalSecondsInput % 60;
function addLeadingZero(n) {
return n < 10 ? "0" + n : "" + n;
}
addLeadingZero(hrs) + ":" + addLeadingZero(mins) + ":" + addLeadingZero(secs);
Häufig angewendet auf: Quelltext (einer Textebene, erfordert einen Slider Control).
Lässt diese Textebene sowohl den Textinhalt als auch alle Stile (Schriftart, Größe, Farbe usw.) einer anderen angegebenen Quelltextebene vollständig spiegeln.
// --- Source Layer ---
// Change "SourceTextLayerName" to the actual name of your source text layer.
var sourceLayer = thisComp.layer("SourceTextLayerName");
// --- Copy Script ---
var sourceStyle = sourceLayer.text.sourceText.getStyleAt(0, time); // Gets style from 1st char of source at current time
sourceStyle.setText(sourceLayer.text.sourceText.value); // Applies source style and text content
Häufig angewendet auf: Quelltext (einer Textebene).
Lernressourcen
Der Einstieg in After Effects Expressions kann entmutigend wirken, aber es gibt eine Fülle von Wissen, das dir beim Lernen und bei der Fehlerbehebung hilft:
Offizielle Adobe After Effects Expressions Sprachreferenz
Dies ist der definitive Leitfaden von Adobe. Er bietet umfassende Details zu allen verfügbaren Funktionen, Objekten und der Syntax. Es ist eine hervorragende Ressource, um die Kernmechanismen zu verstehen und neue Möglichkeiten zu entdecken.
Dan Ebberts' MotionScript.com
Eine legendäre und grundlegende Ressource in der After Effects Community. Dan bietet unglaublich detaillierte Erklärungen, praktische Beispiele und Lösungen für häufige (und ungewöhnliche) Animationsprobleme mithilfe von Expressions. Viele weit verbreitete Expressions stammen von hier oder wurden hier populär gemacht.
Plainly's After Effects Expressions Library
Eine großartige Sammlung nützlicher Expressions für verschiedene Aufgaben, oft mit klaren Erklärungen und Anwendungsfällen. Ein guter Ort, um gebrauchsfertige Snippets zu finden und neue Techniken zu lernen.
Adobe After Effects Community Forum
Ein großartiger Ort, um Fragen zu stellen, deine Arbeit zu teilen und Hilfe von anderen Benutzern und Adobe-Mitarbeitern zu erhalten. Wenn du bei einer Expression nicht weiterkommst, ist die Wahrscheinlichkeit groß, dass jemand in der Community dir Ratschläge geben oder dich zu einer Lösung führen kann.
YouTube-Tutorials
Viele Motion Designer und After Effects-Dozenten teilen Tutorials auf YouTube. Kanäle wie School of Motion, Ukramedia, Workbench, Ben Marriott und Jake Bartlett (neben vielen anderen) behandeln Expressions, von Anfängereinführungen bis hin zu fortgeschrittenen Techniken.
Fazit
After Effects Expressions sind eine tiefgreifende und leistungsstarke Funktion, die deine Animationsfähigkeiten und Effizienz erheblich verbessern kann. Beginne mit den Grundlagen wie wiggle(), loopOut() und time, und erkunde schrittweise komplexere Möglichkeiten, einschließlich Textanimations-Expressions und dynamischem Styling. Viel Spaß beim Animieren!