After Effects: expresión lineal: pasar del valor 1 a otro valor y luego volver al valor 1

Esencialmente, estoy tratando de obtener una expresión de posición en una capa de video (bidimensional) para pasar de 640, 360 (centro de la pantalla) a otro valor definido por un control de expresión y luego de regreso a 640, 360. Para definir la duración de este efecto, he usado casillas de verificación de marcador de posición (inicio, medio y final) para crear fotogramas clave que se pueden arrastrar y que marcan los puntos de inicio y final. Sé que es una forma extraña de definir los puntos de inicio y final del efecto, pero funciona bien para lo que estoy haciendo.

Código actual:

start = effect("Start (use keyframe)")("Checkbox");
end = effect("End (use keyframe)")("Checkbox");
mid = effect("Middle (use keyframe)")("Checkbox");

if (start.numKeys > 0){
start1 = start.key(start.numKeys).time
}
else{
start1 = 0;
}

if (end.numKeys > 0){
end1 = end.key(end.numKeys).time;
}
else{
end1 = 0;
}

if (mid.numKeys > 0){
mid1 = mid.key(mid.numKeys).time;
}
else{
mid1 = 0;
}

[linear(time, start1, mid1, 640, effect("End Position")("Point")[0]), linear(time, start1, mid1, 360, effect("End Position")("Point")[1])];

[linear(time, mid1, end1, effect("End Position")("Point")[0], 640), linear(time, mid1, end1, effect("End Position")("Point")[1], 360)];

Nota: el código ha funcionado bien sin la variable mid y la segunda expresión lineal, sin embargo, no pasará de 640, 360 a x, y y luego volverá a 640, 360. Solo pasará de 640, 360 a x, y luego detener.

También intenté usar la función loopOut ("pingpong") pero rompe toda la expresión.

Respuestas (1)

¿Hay alguna razón por la que está utilizando este enfoque? Hay maneras mucho más fáciles de hacerlo (ver más abajo).

Pero de todos modos, el problema es que la penúltima y la última línea devuelven valores, pero una expresión solo puede devolver un conjunto de valores, por lo que solo devuelve el último. Creo que esto apunta a un malentendido de cómo funcionan las expresiones. Se calcula una expresión cada fotograma*; no tiene memoria de lo que sucedió antes o de lo que sucederá después. Por lo tanto, su expresión debe devolver un resultado para cualquier momento en particular, y el resultado se calcula a partir del valor que devuelve en ese momento.

Necesitas algo de control de flujo allí. Use una if/elsedeclaración para reemplazar las dos últimas líneas:

if (time < mid1){
    [linear(time, start1, mid1, 640, effect("End Position")("Point")[0]), linear(time, start1, mid1, 360, effect("End Position")("Point")[1])];
}else{
    [linear(time, mid1, end1, effect("End Position")("Point")[0], 640), linear(time, mid1, end1, effect("End Position")("Point")[1], 360)];
}

Pero usted puede hacer su vida mucho más fácil. ¿Por qué no tener un efecto deslizante que tenga un rango de 0 a 100 que defina en qué porcentaje de la distancia a lo largo de la ruta debe estar el objeto? Luego, simplemente lo encuadra para pasar de 0 a 100 y viceversa. La expresión completa sería simplemente:

rampCtrl=effect("the Effect That Controls How Far Along It is")("slider");
linear(rampCtrl, 0, 100, [640,360], effect("End Position")("Point"))

Tenga en cuenta que no tiene que dividirlo en dos partes, la linear()función puede tratar con vectores como entradas de valor1 y valor2.


*(Puedes pensar que las expresiones se calculan en cada cuadro, pero en realidad se calculan cada vez que se procesa la composición. Si tienes activado el desenfoque de movimiento, el cuadro se compone de numerosos intervalos de tiempo en puntos de sub-cuadro en el tiempo, combinados , y la expresión se calcula para cada uno de esos intervalos de tiempo. En general, puede ignorar esto, pero afecta la velocidad de procesamiento si su cálculo consume mucho tiempo, y puede causar extrañeza si su expresión arroja resultados inesperados entre fotogramas, por ejemplo, cuando se realiza un bucle volver a un valor original entre dos fotogramas)

Muchísimas gracias por la ayuda. Solo he estado jugando con expresiones durante una semana más o menos, pero ahora tengo una mejor comprensión de cómo funciona la lógica de expresión. También intentaré usar su versión y ver si me lo hace más fácil.