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.
¿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/else
declaració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.
usuario16421