Lista de expresiones esenciales de After Effects
Desbloquea el verdadero poder de Adobe After Effects con nuestra lista de expresiones esenciales y hoja de trucos. Ya seas un principiante que busca entender las expresiones de AE o un profesional que busca optimizar su flujo de trabajo para After Effects, ¡esta guía es para ti!
¿Qué son las expresiones de After Effects?
Las expresiones de After Effects son pequeños fragmentos de código, basados en JavaScript, que te permiten automatizar animaciones, vincular propiedades y crear relaciones complejas entre capas y efectos sin crear manualmente cientos de fotogramas clave. Piensa en ellas como mini-programas que le dicen a After Effects qué hacer con una propiedad a lo largo del tiempo o basándose en otras propiedades. Aprender las expresiones de After Effects puede acelerar drásticamente tu flujo de trabajo y abrir un nuevo mundo de posibilidades creativas, desde simples movimientos de "wiggle" hasta complejas expresiones de animación de texto.
Si alguna vez te has encontrado animando laboriosamente un movimiento repetitivo o deseando que una capa pudiera reaccionar inteligentemente a otra, entonces las expresiones en AE son tu respuesta. Desde simples movimientos de "wiggle" hasta complejas animaciones procedimentales, son un pilar de los gráficos en movimiento y los efectos visuales profesionales en After Effects.
Los fundamentos del uso de expresiones
Usar expresiones es sencillo:
1. Añadir una expresión: Haz Alt-clic (Opción-clic en Mac) en el icono del cronómetro junto a cualquier propiedad de capa en la línea de tiempo (como Posición, Escala, Opacidad). Esto abre el campo del editor de expresiones.
2. Usar el Pick Whip: Este icono en espiral (@) te permite vincular propiedades visualmente. Arrástralo a otra propiedad, y After Effects escribirá el código de vinculación básico por ti, ¡una excelente manera de empezar!
3. Habilitar/Deshabilitar: Haz clic en el signo igual (=) junto a un campo de expresión para activarlo o desactivarlo.
Navegación rápida: Lista de expresiones
Expresiones esenciales de After Effects
Analicemos algunas de las expresiones más útiles, desde los bloques de construcción fundamentales hasta las expresiones avanzadas especializadas. Esta lista de expresiones de After Effects está diseñada para ser un recurso de referencia. Algunas de estas expresiones o sus conceptos se inspiraron en la excelente biblioteca de PlainlyVideos.com —¡échales un vistazo para más ideas!
El legendario wiggle() crea un movimiento aleatorio y de aspecto orgánico. Se controla por la frecuencia (cuántos movimientos por segundo) y la amplitud (cuánto se desvía la propiedad). Los parámetros opcionales incluyen octavas (añade detalle), amp_mult (multiplicador de amplitud de octava) y t (tiempo base).
Para mover un solo eje (por ejemplo, el eje Y de la posición): [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);
Comúnmente aplicado a: Posición, escala, rotación, opacidad, propiedades de efectos
Esencial para repetir animaciones con fotogramas clave. loopOut() afecta la animación *después* del último fotograma clave; loopIn() la afecta *antes* del primero. El parámetro type (por ejemplo, numKeyframes (por defecto 0 para todos) especifica cuántos fotogramas clave desde el final/inicio definen el segmento del bucle.
// --- 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);
Comúnmente aplicado a: Cualquier propiedad con fotogramas clave (posición, escala, rotación, opacidad, reasignación de tiempo)
Simplemente devuelve el tiempo de composición actual en segundos. Fundamental para crear animaciones que progresan de forma consistente o a una velocidad constante.
// 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
Comúnmente aplicado a: Rotación, posición, opacidad (para desvanecimientos temporizados), control de otras expresiones
Representa el valor original de la propiedad, antes de la expresión (de los fotogramas clave o del valor establecido en la interfaz de usuario). Crucial para añadir o modificar animaciones existentes de forma no destructiva.
// Example: Add a small wiggle to existing keyframed position
value + wiggle(0.5, 15);
Comúnmente aplicado a: Cualquier propiedad para modificar su animación existente con fotogramas clave.
Devuelve el valor de la propiedad a la que se aplica, pero en un tiempo `t` específico (en segundos) que tú proporcionas, en lugar del tiempo de composición actual. Excelente para crear retrasos o efectos de eco.
// --- 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);
Comúnmente aplicado a: Posición, escala, rotación, opacidad (para seguir otra capa con un retraso)
Devuelve el número de la propia capa en la pila de capas (la capa superior es 1, la segunda es 2, etc.). Muy útil para crear desplazamientos o variaciones automáticas en varias capas duplicadas.
// 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
Comúnmente aplicado a: Cualquier propiedad para crear variaciones en capas duplicadas (por ejemplo, desplazamiento de posición, desplazamiento de rotación, variaciones de color, opacidad)
Vincula partes de tu expresión a los Controles de Efecto (como "Control Deslizante", "Control de Casilla de Verificación", "Control de Color" que se encuentran en Efecto > Controles de Expresión) para realizar ajustes fácilmente sin editar el código. Añade el control a una capa (a menudo un Nulo llamado "Controlador") y enlaza con él.
// 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);
Comúnmente aplicado a: Cualquier expresión en la que desees controles fáciles de usar para variables (por ejemplo, frecuencia/amplitud de wiggle, valores de color, alternadores de casilla de verificación).
Funciones trigonométricas estándar para crear movimientos suaves, ondulatorios u oscilantes. Los ángulos deben estar en radianes (usa degreesToRadians(degrees) para convertir).
// 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
Comúnmente aplicado a: Posición (para movimiento ondulatorio), rotación (para oscilación), escala (para pulsación), opacidad (para parpadeo).
random(min, max) genera un número pseudoaleatorio entre min y max (o 0 y min si solo hay un argumento). Para obtener un valor aleatorio consistente por capa que no cambie con el tiempo, usa seedRandom(seedValue, timeless = true) antes de random(), a menudo usando index como el 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);
Comúnmente aplicado a: Opacidad, posición, escala, rotación, color (para variaciones aleatorias), cantidad del selector del animador de texto.
Potentes funciones de interpolación. A medida que una entrada t (a menudo time) va de tMin a tMax, linear() transiciona la salida de value1 a value2. ease() aplica una curva en S (ease-in y -out), mientras que easeIn() y easeOut() proporcionan un easing unilateral.
// 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);
Comúnmente aplicado a: Cualquier propiedad numérica para transiciones suaves a lo largo del tiempo o basadas en un controlador (por ejemplo, opacidad, escala, posición, rotación, parámetros de efectos).
Lógica condicional estándar. Si la condition evalúa como verdadera, la expresión devuelve la declaración A; de lo contrario, devuelve la declaración 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
}
Comúnmente aplicado a: Cualquier propiedad para cambiar entre valores o comportamientos según las condiciones (por ejemplo, opacidad, fuente de texto, habilitar/deshabilitar efectos mediante casilla de verificación).
Un script favorito de la comunidad para crear efectos de rebote o resorte naturales a medida que la animación con fotogramas clave se asienta. Ajusta la amplitud (cantidad de rebote), la frecuencia (rebotes por segundo) y la atenuación (qué tan rápido se desvanece).
// --- 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;
}
Comúnmente aplicado a: Posición, escala, rotación (después del movimiento con fotogramas clave).
Hace que esta capa orbite en círculo alrededor de un
// --- 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];
}
Comúnmente aplicado a: Posición.
Simula el clásico salvapantallas del logotipo de DVD, haciendo que la capa se mueva en diagonal y rebote en los bordes de la composición. Las velocidades son ajustables.
// --- 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];
Comúnmente aplicado a: Posición.
Crea una conexión tipo resorte donde esta capa sigue a una
// --- 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;
Comúnmente aplicado a: Posición.
Crea un wiggle de posición que se repite sin problemas durante un período de tiempo definido. Útil para movimientos de fondo continuos y de aspecto aleatorio. loopDurationSecondsÚtil para movimientos de fondo continuos y de aspecto aleatorio.
// --- 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);
Comúnmente aplicado a: Posición.
Posiciona dinámicamente la capa actual exactamente a la mitad entre otras dos capas especificadas, referenciadas por su índice de pila (por ejemplo, capa 1 y 2) o por su nombre.
// --- 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;
Comúnmente aplicado a: Posición.
Una simulación de física 2D simplificada. Las capas responden a la gravedad y rebotan en los bordes de la composición (paredes), que se pueden configurar de forma independiente mediante deslizadores. Utiliza un cálculo iterativo desde el punto de entrada de la capa, lo que puede volverse lento para muchos objetos o duraciones largas.
Configuración: Crea una capa nula llamada
// --- 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
Comúnmente aplicado a: Posición (de capas 2D).
Gira una capa 2D para que siempre apunte hacia un artworkPointingOffsetDegrees podría ser necesario si el arte de la capa no apunta a la derecha (0 grados) por defecto.
// --- 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;
Comúnmente aplicado a: Rotación (de una capa 2D).
Orienta una capa 3D (o cámara) para que su eje Z apunte desde un "viewPointLayerName" (o su propia posición) hacia un "targetLayerName" en el espacio 3D, utilizando el 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);
Comúnmente aplicado a: Orientación (de una capa 3D o cámara).
Aplicado a la rotación de una capa hija, mantiene su propia rotación en el espacio global, contrarrestando eficazmente la rotación heredada de su padre.
// --- Ignore Parent Rotation Script ---
if (hasParent) {
value - parent.transform.rotation;
} else {
value; // No parent, so just use its own rotation
}
Comúnmente aplicado a: Rotación.
Crea un balanceo de péndulo realista y decreciente en la rotación. Personaliza la frecuencia (balanceos por segundo), la amplitud inicial (grados) y la tasa de decaimiento.
// --- 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);
Comúnmente aplicado a: Rotación.
Contrarresta las transformaciones de escala de una capa padre para mantener el tamaño visual de esta capa hija consistente como si no fuera hija o su padre estuviera al 100% de escala.
// --- 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;
Comúnmente aplicado a: Escala.
Crea un pulso de escala rítmico. Los controles incluyen velocidad, cantidad, escala base, fase y modo (crecimiento/reducción simétrico, solo crecimiento o solo reducción).
// --- 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;
Comúnmente aplicado a: Escala.
Desvanece dinámicamente la opacidad de una capa 3D en función de su distancia a la cámara activa, entre un startFadeDistance y un 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);
Comúnmente aplicado a: Opacidad (de una capa 3D).
Ajusta el ancho de un trazo para contrarrestar las transformaciones de escala 2D de la capa, haciendo que el trazo parezca visualmente consistente incluso si la capa se escala.
// --- 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;
Comúnmente aplicado a: Ancho de trazo de capa de forma, ancho de trazo de capa de texto (si se usan estilos de capa).
Controla dinámicamente las propiedades del texto como la fuente, el tamaño, el color y el tracking usando text.sourceText.style métodos (AE 17.0+). Encadena métodos para un estilo complejo. El estilo por carácter (AE 25.0+) usa argumentos opcionales startIndex y numOfCharacters en muchos métodos de estilo.
// 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
Comúnmente aplicado a: Texto de origen (para controlar sus atributos de estilo).
Usa lógica condicional dentro de un selector de expresión para aplicar el efecto de un animador solo a caracteres específicos basándose en su textIndex (0 para el primer carácter, 1 para el segundo, etc.).
// --- 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
}
Comúnmente aplicado a: Animador de texto > Selector de expresión > Cantidad.
Dirige cada N-ésimo carácter usando un selector de expresión. Puedes controlar el intervalo (N) y un desplazamiento para cambiar el punto de inicio (por ejemplo, para seleccionar caracteres pares o impares).
// --- 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
}
Comúnmente aplicado a: Animador de texto > Selector de expresión > Cantidad.
Escala automáticamente una capa de texto proporcionalmente para asegurar que encaje dentro de los límites predefinidos de ancho y alto. Útil para MOGRTs donde la longitud del texto puede variar.
// --- 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];
Comúnmente aplicado a: Escala (de una capa de texto).
Ajusta el punto de anclaje de una capa a una de nueve posiciones lógicas (por ejemplo, centro, superior izquierda) basándose en el cuadro delimitador de su contenido (sourceRectAtTime). Aunque es extremadamente útil para capas de texto, también puede aplicarse a capas de forma u otras capas donde sourceRectAtTime proporciona dimensiones significativas. Asegura transformaciones consistentes como escala o rotación, independientemente de los cambios de contenido.
// --- 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];
Comúnmente aplicado a: Punto de anclaje (principalmente para capas de texto o forma).
Convierte un valor numérico de un "Control deslizante" (que representa el total de segundos) en la misma capa a un formato de código de tiempo HH:MM:SS en una capa de texto.
// --- 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);
Comúnmente aplicado a: Texto de origen (de una capa de texto, requiere un control deslizante).
Hace que esta capa de texto refleje completamente tanto el contenido del texto como todo el estilo (fuente, tamaño, color, etc.) de otra capa de texto de origen especificada.
// --- 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
Comúnmente aplicado a: Texto de origen (de una capa de texto).
Recursos de aprendizaje
Adentrarse en las expresiones de After Effects puede parecer desalentador, pero hay una gran cantidad de conocimientos disponibles para ayudarte a aprender y solucionar problemas:
Referencia oficial del lenguaje de expresiones de Adobe After Effects
Esta es la guía definitiva de Adobe. Proporciona detalles completos sobre todas las funciones, objetos y sintaxis disponibles. Es un recurso excelente para comprender la mecánica central y descubrir nuevas posibilidades.
MotionScript.com de Dan Ebberts
Un recurso legendario y fundamental en la comunidad de After Effects. Dan proporciona explicaciones increíblemente detalladas, ejemplos prácticos y soluciones a problemas de animación comunes (y poco comunes) utilizando expresiones. Muchas expresiones ampliamente utilizadas se originaron o se popularizaron aquí.
Biblioteca de expresiones de After Effects de Plainly
Una gran colección de expresiones útiles para diversas tareas, a menudo con explicaciones claras y casos de uso. Un buen lugar para encontrar fragmentos listos para usar y aprender nuevas técnicas.
Foro de la comunidad de Adobe After Effects
Un excelente lugar para hacer preguntas, compartir tu trabajo y obtener ayuda de otros usuarios y del personal de Adobe. Si te quedas atascado con una expresión, es probable que alguien de la comunidad pueda ofrecerte orientación o indicarte una solución.
Tutoriales de YouTube
Muchos diseñadores de movimiento y educadores de After Effects comparten tutoriales en YouTube. Canales como School of Motion, Ukramedia, Workbench, Ben Marriott y Jake Bartlett (entre muchos otros) cubren expresiones, desde introducciones para principiantes hasta técnicas avanzadas.
Conclusión
Las expresiones de After Effects son una característica profunda y potente que puede mejorar significativamente tus capacidades de animación y eficiencia. Comienza con lo básico como wiggle(), loopOut(), y time, y explora gradualmente posibilidades más complejas, incluyendo expresiones de animación de texto y estilo dinámico. ¡Feliz animación!