Usar Expresiones para crear animaciones complejas Las expresiones son líneas de código que le permiten establecer animaciones más o menos sofisticadas, reduciendo al mínimo las tareas repetitivas de producción de fotogramas clave que requerirían en un proceso normal. Producen un enlace entre propiedades y efectos dentro de una misma capa o entre diferentes capas. Le resultará fácil copiar valores de animación de una propiedad o efecto, para reproducirlos en otras capas o propiedades, o tomar los valores de otra propiedad para sincronizarlo con otra u otras propiedades o efectos. Supongamos que buscamos una animación de un objeto que proyecta una sombra y que se desplaza por la composición al tiempo que gira. Si quiere animar todo el conjunto, necesitará un montón de fotogramas clave. A través de las expresiones, conseguiremos que todo se mueva de la forma apropiada con un mínimo esfuerzo en la producción de fotogramas clave. El lenguaje de expresiones de After Effects está basado en JavaScript 1.2, aunque utiliza solo el núcleo de este lenguaje y lo adapta a sus necesidades, sustituyendo las extensiones relacionadas con la Web por otras propias de la aplicación. Si tiene conocimientos de JavaScript le resultará muy sencillo dominar esta potente herramienta. Si no conoce nada de este lenguaje, no se apure, aún podrá crear expresiones más o menos sofisticadas sin escribir una línea de código, o alterando mínimamente expresiones existentes para adaptarlas a sus necesidades. Es decir, dispone de dos maneras de crear expresiones: bien escribiendo el código de forma manual; o bien, utilizando un proceso semiautomático con ayuda del icono espiral (Pick Whip). En este capítulo abordaremos las expresiones en sus aspectos más sencillos, pues profundizar más saldría del alcance de esta guía. 14.1. Añadir expresiones a una propiedad Independientemente de cómo se disponga a crear la expresión, si de forma manual o automática, los primeros pasos que debe dar son los siguientes: 1. Seleccione una propiedad en la ventana Línea de Tiempo. 2. Diríjase al menú principal Animation>Add Expresión. Automáticamente se crea una expresión que aparece en el campo de expresiones de la ventana Línea de Tiempo. Se trata de la expresión por defecto que adopta los valores de la propiedad o del fotograma clave si lo hubiera. 3. Si conoce el lenguaje de expresiones puede escribir directamente el texto sobre el campo de extensiones. Si no, puede usar el icono espiral (Pick Whip), para relacionarla con otra propiedad. 4. Para que la expresión se haga efectiva debe realizar un clic fuera del campo de la expresión o pulsar la tecla Intro del teclado numérico. Todo el trabajo con expresiones se llevará a cabo desde la ventana Línea de Tiempo. Al añadir una expresión aparecerán en la propiedad los controles mostrados en la figura 14.1. Figura 14.1. Propiedad de rotación con una expresión añadida El botón Enable Expresión (Habilitar/Desabilitar Expresión) le permitirá desactivar momentáneamente la expresión al hacer un clic sobre él. Un nuevo clic volverá a activarla. El botón Graph (Gráfico) muestra, cuando se activa, un gráfico de valor y velocidad similar al de los fotogramas clave. Con la ayuda del botón Pick Whip (Icono Espiral) podrá crear expresiones sin escribir código. El botón Expression Language Menu (Menú Lenguaje de Expresiones) le ayudará a escribir los códigos de forma manual, insertando objetos de expresiones. Las expresiones se escriben y se editan en el campo de expresiones. Aunque puede escribirlas en cualquier procesador de texto, para luego cortarlas y pegarlas en el campo. Si escribe o edita de forma errónea una expresión, se mostrará un cuadro de diálogo de aviso señalando la falta, y una señal triangular amarilla aparecerá a la izquierda de los botones de la expresión, al tiempo que la expresión se desactiva automáticamente. Cada vez que haga un clic sobre dicho triángulo verá de nuevo el cuadro de diálogo que le indica el error de sintaxis. Cuando necesite eliminar de forma definitiva una expresión, utilice el comando Remove Expresión del menú principal Animation. O bien, borre el texto del campo de expresiones y haga un clic fuera o pulse tecla Intro del teclado numérico. Nota: Para abrir, en la ventana Línea de Tiempo, solo las propiedades de una capa con expresión 14.1.1. el icono espiral para aplicada pulseUsar dos veces seguidas la tecla E. crear expresiones Esta utilidad le permite poder hacer uso de las expresiones sin necesidad de saber acerca de códigos JavaScript. Relaciona propiedades entre capas copiando sus valores y creando automáticamente expresiones. Puede relacionar los valores de la misma propiedad o efecto en distintas capas para evitar la repetición de los fotogramas clave con un importante ahorro de tiempo, o relacionar valores de propiedades o efectos diferentes dentro de una misma capa o de otra distinta para sincronizar acciones. Por ejemplo, imagine que varios objetos o capas tienen que hacer un mismo recorrido en la composición. Únicamente necesitará establecer los fotogramas clave para una de ellas y después, por medio de este icono podrá copiar fácilmente los valores de la propiedad de posición. Si posteriormente modifica la expresión creada, aumenta las posibilidades de manipulación de la animación. Por ejemplo, podría introducir un retardo en el tiempo para que una capa comenzase unos segundos después que la otra, o podría reducir la velocidad para que la capa haga el recorrido a una velocidad diferente. Veamos el método a seguir para usar este elemento: 1. Seleccione, en la ventana Línea de Tiempo, la propiedad que llevará la expresión y ejecute el comando del menú principal Animation>Add Expression. 2. Haga un clic y arrastre desde el icono espiral (Pick Whip) hasta la propiedad de la cual quiere copiar los valores. En el campo de expresión de la ventana aparecerá la expresión. Véase la figura 13.2. Si apuntó con el icono espiral (Pick Whip) al nombre de la propiedad la expresión resultante mostrará los valores en conjunto de la propiedad. Si por el contrario apuntó a uno de los valores en la expresión se mostrará detallado cada uno de los valores. Tenga en cuenta que no todas las propiedades tienen un mismo número de variables. Por ejemplo, la propiedad de posición muestra los valores X e Y para capas 2D o X, Y, Z para capas 3D, mientras que la propiedad de opacidad tiene un único valor. Es posible establecer más de un enlace con el icono espiral (Pick Whip), aunque para separar las expresiones debe previamente fijar un punto y coma que separe las líneas. Las nuevas expresiones se situarán inmediatamente detrás del cursor en el campo de expresiones, cuando éste se encuentre allí. Si no estuviera activo el campo, entonces la nueva expresión reemplazará al texto previo. Si el campo está activo y con texto seleccionado, este se reemplaza con la nueva propiedad marcada por el icono espiral. Una vez generadas las expresiones automáticas con este elemento, puede modificarlas para adaptarlas a sus necesidades. La manera de hacerlo es escribir directamente sobre la expresión en el campo de expresiones de la ventana Línea de Tiempo. Uno de los cambios más comunes y sencillos es la introducción de operadores matemáticos para incrementar o disminuir la acción del código. Así, puede utilizar el signo (+) para sumar, el signo (-) para restar, el signo (/) para dividir y el signo (*) para multiplicar. No son las únicas posibilidades, puede utilizar funciones matemáticas más complejas y disfrutar de mayor libertad de acción. Por ejemplo, la función (*-1) consigue que la acción se aplique a la inversa. Probablemente entienda esto mejor con un ejemplo sencillo: imitaremos los movimientos de las manecillas de un reloj. Tenemos cuatro capas: la esfera del reloj, la aguja de las horas, la de los minutos y la de los segundos que corre en una esfera más pequeña. En realidad lo que hay que modificar es la propiedad de rotación. Pero previamente tendremos que cambiar el eje de anclaje para que el giro se produzca desde la base de la aguja, que coincidirá, obviamente, con el centro del reloj, y con el centro del círculo pequeño en el caso del segundero. Podríamos lograr este efecto animando la rotación de las tres agujas de forma independiente, de manera que las velocidades fueran distintas en cada una de ellas. Sin embargo, comprobará que usando una expresión muy simple logrará el mismo objetivo de una manera mucho más rápida y sencilla, sin necesidad siquiera de escribir una línea de código. 1. Establecemos para la capa que contiene la aguja de los minutos los fotogramas clave para hacerla rotar 360º. Por ejemplo, en tiempo 0 segundos fijamos un valor de rotación 0º y en el tiempo 6 segundos, valor de rotación 360º para el 2º fotograma clave (o 1 en el número de revoluciones). 2. Animamos ahora la capa de la aguja de las horas, pero en lugar de crear fotogramas clave aplicaremos una expresión: abra la propiedad de rotación y ejecute el comando del menú principal Animation>Add Expresión. 3. Hecho esto, hay que relacionar la propiedad de rotación de la capa anterior con esta última. Emplearemos el icono espiral (Pick Whip) de las propiedades de la expresión haciendo un clic y arrastrando hasta la propiedad de rotación de la capa con la aguja de los minutos, la que tenía los fotogramas clave. Observe que, tras efectuar esta acción, aparece en el campo de expresión una línea de código como la siguiente: thisComp.layer("minutos.jpg").rotation. Véase la figura 14.2. 4. Si no alteramos este código ambas capas rotarán al unísono, pero nosotros queremos retrasar la velocidad de la aguja de las horas. Con este objetivo añadiremos, escribiendo directamente en la expresión, los caracteres /12. Así lograremos que la velocidad de la aguja se reduzca, de manera que, cada vez que el minutero dé una vuelta completa, la aguja de las horas avanzará una hora. La expresión debe quedar: thisComp.layer("minutos.jpg").rotation/12. 5. Repitamos el mismo proceso para la aguja de los segundos. Abra su propiedad de rotación y aplique una expresión (Animation>Add Expression). Arrastre el icono espiral (Pick Whip) hacia la propiedad de rotación del minutero. En esta ocasión la aguja de los segundos debería moverse más rápido que la de los minutos, 60 veces más deprisa. Entonces modificaremos la expresión añadiendo *60 y lo habremos conseguido. ¡Así de fácil! Figura 14.2. El icono de espiral crea expresiones de forma automática 14.1.2. Escribir las expresiones manualmente Si tiene conocimientos de JavaScript, quizás le resulte fácil escribir directamente las expresiones, obteniendo el mayor grado de control de esta forma. También los conocimientos en matemáticas le pueden resultar de utilidad, si quiere añadir funciones complejas. No obstante, si estudia algunos ejemplos y prueba con las distintas opciones, es posible que llegue a entender la lógica de este código y pueda realizar animaciones sofisticadas con esta técnica. Es posible crear una expresión desde cero para animar una capa, sin establecer ni un solo fotograma clave. Pero quizás, lo más común sea crear expresiones para relacionarlas con los fotogramas clave de otras capas. Algunas nociones básicas sobre el lenguaje de las expresiones Al escribir expresiones manualmente, no olvide que está trabajando con el lenguaje JavaScript y se rige por sus reglas, así por ejemplo, tenga presente que este lenguaje discrimina entre mayúsculas y minúsculas. Puede emplear tantas líneas de código como sean necesarias, para separarlas debe utilizar un punto y coma. Nota: Si precisa más espacio en el campo de expresiones para ver la totalidad de las líneas de código, puede ampliar la altura del campo situando el cursor en el lado inferior y arrastrando hacia abajo. El lenguaje de expresiones se utiliza para relacionar objetos o propiedades con unos valores numéricos. Para acceder a estos se usa una cadena de objetos u operadores separados por un punto. Una vez que se llega a un valor numérico, a una matriz de números o a un booleano (como verdadero o falso) se concluye la cadena y no se pueden añadir más atributos, aunque sí se pueden añadir operadores matemáticos como /,*,-,+, etc. Objetos globales Todas las expresiones comienzan con un objeto global y el objeto global por defecto, es siempre la capa en la que se escribió la expresión. De modo que en las expresiones se puede obviar su presencia. Por ejemplo, si queremos "llamar" a los valores de la propiedad rotación de una capa denominada "capa1", podríamos utilizar cualquiera de las siguientes expresiones, todas equivalentes: thisComp.layer("capa1").rotation thisLayer.rotation rotation También podríamos escribir directamente un valor para la propiedad suprimiendo incluso la palabra Rotation, pues también está implícita. En este caso si escribimos por ejemplo únicamente 90 en el campo de expresiones, hace referencia al valor de la propiedad de rotación para esa capa, y este será su valor fijo. Unas líneas adelante veremos cómo podemos introducir variables. Si los valores a los que queremos "llamar" están en otra capa, deberemos sustituir el nombre "capa1" en la primera línea por el de la nueva capa. En esta ocasión esta línea sería la única válida. Echemos un vistazo a la expresión creada en el apartado anterior con el icono espiral (Pick Whip), para tratar de entender cuales eran sus instrucciones: thisComp.layer("minutos.jpg").rotation. Esta expresión relaciona la capa y la propiedad actual con la capa de nombre "minutos.jpg" dentro de la composición activa (thisComp), y copia los valores (fotogramas clave) de la propiedad de rotación en la capa con la expresión. Si recuerda el ejemplo anterior, con esta expresión conseguíamos que las dos agujas rotaran al unísono. Recuerde también, que vimos cómo podíamos introducir un operador para cambiar la velocidad, en el ejemplo anterior añadimos /12 para reducir la velocidad con respecto a la otra aguja. Matrices y dimensiones Los valores de las propiedades se representan por números, matrices de ellos o por vectores, cuando indican una dirección, aunque en realidad a estos últimos After Effects los trata igual que cualquier otra matriz. Las matrices aparecen como números separados por una coma y metidos entre corchetes. La cantidad de elementos de la matriz indica la dimensión de la propiedad. Así, tendremos hasta un total de cuatro: una dimensión para aquellas propiedades que muestran un valor único, como por ejemplo las propiedades de rotación y opacidad; dos dimensiones para las propiedades con dos valores, como pueden ser la posición de una capa 2D (ejes X e Y), la escala (altura y anchura) y el punto de anclaje (X,Y); tres dimensiones para las propiedades anteriores en capas 3D (X,Y,Z); y cuatro dimensiones para el color que presenta cuatro canales o variables (rojo, verde, azul y alfa). Por ejemplo, una matriz de dos dimensiones podía ser: [30,100] matriz que podría representar los valores de posición (x,y) de una capa. También podemos utilizar los valores independientes, para ello añadimos al nombre de la composición [0] para el valor de la X, [1] para el valor de la Y y [2] para el valor de la Z. Position[0] corresponde pues al valor X, en el ejemplo anterior sería igual a 30. Position[1] corresponde al valor Y, en nuestro ejemplo sería 100. Es posible establecer variables: X=position[0]; [X, 45] Una expresión equivalente sería: [position[0],45] Estas serían las coordenadas de posición para la capa con la expresión. Podríamos relacionarla con el valor del eje X de otra capa, para ello deberíamos escribir una expresión como la siguiente: [thisComp.layer("capa1").position[0],45] Con estas instrucciones logramos que el valor en el eje X de la capa sea el valor X de otra capa de nombre "capa1", mientras que el eje Y permanece fijo. Si quisiéramos que ambos parámetros fueran variables y que cada uno dependiera de una capa distinta podríamos escribir la siguiente línea: X= thisComp.layer("capa1").position[0]; Y= thisComp.layer("capa2").position[1]; [X,Y] O expresado de otra forma: [thisComp.layer("capa1").position[0], thisComp.layer("capa2").position[1]] Hemos utilizado el nombre de la capa para hacer referencia a ella, pero también es posible usar un número en el orden de apilamiento en la ventana Línea de Tiempo. El número 1 corresponde con la capa superior, el 2 con la segunda y así sucesivamente. Tiene el inconveniente de que si cambiamos el orden de apilamiento la acción de la expresión se puede ver modificada. Así pues, es posible utilizar la expresión thisComp.layer(1).position para relacionar los valores de posición de la primera capa en el orden de apilamiento con la capa que contiene la expresión. El tiempo en las expresiones También se puede introducir el tiempo en las expresiones. En ellas siempre se mide en segundos y se refiere a la duración de la composición en la que aparece la expresión. Si no se indica lo contrario, el tiempo por defecto será el tiempo actual. Es decir, los valores relacionados se corresponderán a los valores de la propiedad en el tiempo actual. Pero esto también se puede modificar. Siguiendo con el ejemplo anterior, si le añadimos el atributo valueAtTime(time) podremos intervenir en el tiempo. thisComp.layer("capa1").position.valueAtTime(10) Esta expresión hace que la capa con el código, presente los valores de posición (ambos X e Y) de la "capa1" en el tiempo 10 segundos. En este caso el valor será fijo en toda la duración. Es posible asignar valores relativos de tiempo introduciendo algún operador a la palabra time. Por ejemplo: thisComp.layer("capa1").position.valueAtTime(time+3) Esta expresión hace que el valor de posición de la capa con el código, sea el mismo que el de la "capa1" a lo largo de toda la duración de la composición, pero tres segundos más tarde. Es decir, en un momento dado del tiempo, digamos a los 10 segundos, la "capa1" tendrá un valor de posición determinado, la capa con la expresión, en ese mismo momento, tendrá el valor de posición que le corresponda a la "capa1" a los 13 segundos. Expresiones para el texto fuente Decíamos que todas las expresiones conducen a un valor numérico o a una matriz de ellos. Pero hay una excepción, cuando trabajamos con la propiedad Source Text (Texto Fuente) de una capa de texto, la expresión interpreta el valor final como un string de JavaScript. Cuando relacione esta propiedad en dos capas de texto, la capa con la expresión adquirirá los caracteres de la capa relacionada, y la fuente de texto será la que presente el primer carácter del texto original de esa capa. Usar el listado desplegable del menú Lenguaje de expresiones Este listado contiene todos los elementos específicos de After Effects que se pueden usar en una expresión. Lo puede utilizar como una referencia de los elementos disponibles y para asegurarse de que la sintaxis es correcta, además le ahorra tiempo evitando tener que escribir cada uno de los elementos. Para añadir objetos y atributos solo tiene que ir seleccionando las distintas opciones del menú, intercalando puntos allí donde haga falta. Por ejemplo, para crear una relación entre la propiedad activa de una capa con el valor de rotación de otra capa dentro de la misma composición, debe seguir estos pasos: 1. 2. Seleccione la propiedad y ejecute el comando Animation>Add Expression Primero establecemos el objeto principal en el menú Global, escogemos la opción thisComp (esta composición). 3. Añadimos un punto al final de la palabra. 4. Para escoger el elemento siguiente nos vamos al menú Comp, puesto que el primer objeto es una composición. De entre todas las alternativas escogemos la opción Layer (name) (capa(nombre)) y sustituimos la palabra name por el nombre de la capa con la que queremos relacionarla. Si en lugar de especificar un nombre escribe un número estará designando el orden de apilamiento de la capa. Supongamos que escribimos un 1 en lugar del nombre. En este caso es la capa superior la que se utilizará. Si cambia el orden de las capas, cambiará también la capa seleccionada. 5. Escribimos otro punto detrás del paréntesis. 6. Lo siguiente es seleccionar del menú un atributo o método de todo lo relacionado con la capa, en cualquiera de los menús Layer, Light o Camera. En nuestro caso será la primera opción: Layer Properties (Capa), allí se recogen todas las propiedades de una capa, nosotros elegiremos la opción Rotation. 7. La expresión debe quedar como sigue: thisComp.layer(1).rotation. De esta manera, la información de los fotogramas clave que tenga la capa superior se utilizará en la capa con la expresión. Veamos otro sencillo ejemplo que nos ayude a entender la dinámica de este proceso. En esta ocasión, tenemos una esfera en una capa con el nombre de "bola1.jpg" que se desplaza por la composición siguiendo una línea de movimiento, y queremos crear más esferas que hagan el mismo recorrido pero con un retardo en el tiempo. 1. Hacemos un duplicado de la esfera (selección de la capa y teclas Control-D) y establecemos una línea de movimiento en ella. La renombramos como "bola2.jpg" 2. En la esfera original (bola1.jpg) asignamos una expresión ejecutando el comando Animation>Add Expresión. 3. Bien escribiendo directamente, bien usando el menú de lenguaje introducimos en el campo de expresiones la siguiente línea: thisComp.layer("bola2.jpg").position.valueAtTime(time - .6). Con lo cual estamos forzando a que la capa bola1 siga el mismo recorrido que la segunda capa, pero el atributo valueAtTime le insta a hacerlo 0.6 segundos después de que haya empezado (time-.6). 4. Queremos ahora añadir más esferas que se unan al desfile; podríamos repetir los pasos 2 y 3 en cada una de las nuevas capas, pero modificando la variación de tiempo, o cambiando la capa de referencia (bola2.jpg). Pero existe una manera más inmediata. En lugar de asignar un nombre a la capa le asignaremos un orden. Así, sustituiremos el objeto layer("bola.jpg") por layer(thisLayer, 1) para indicarle que la posición y el retardo sea relativo a la capa inmediatamente inferior en el orden de apilamiento (si utilizáramos el -1 en lugar de 1 sería la capa superior). 5. Ahora solo resta crear tantas copias de esta capa como haga falta, y cuando previsualice la composición, comprobará que todas las esferas hacen el recorrido con el retardo indicado en la expresión, pero con relación a la capa posterior en el orden de apilamiento. 14.2. Convertir expresiones a fotogramas clave En algunas circunstancias puede resultar interesante transformar una expresión en sus fotogramas clave correspondientes. Por ejemplo, si necesita mayor velocidad en el proceso de interpretación, los fotogramas clave se interpretan más deprisa. O si necesita hacer manipulaciones posteriores, como congelar la imagen, también sería útil disponer de los fotogramas clave para poder efectuar un remapeado de tiempo y congelar la parte de la imagen que nos interese. En cualquier caso, esta conversión resulta muy sencilla, basta con ejecutar el comando del menú principal Animation>Keyframe Assistant>Convert Expression to Keyframes para que desaparezca la expresión y en su lugar se creen fotogramas clave que la sustituyan. 14.3. Efectos Control de Expresiones En el menú principal Effects, existen unos efectos o filtros que tienen como función manipular los valores de las propiedades en las expresiones. Lo ideal es aplicar estos efectos sobre una capa nula que servirá a modo de control. En las otras capas se establece una expresión ligada a las propiedades de estos efectos. Es en la capa nula donde se fijan los fotogramas clave que regirán la animación de las capas relacionadas por medio de la expresión. Primero cree una capa nula mediante el comando Layer>New>Null Object, y luego aplique los efectos con el comando Effect>Expression Controls. En su menú elija cualquiera de estas opciones: 1. Angle Control (Ángulo). Este parámetro contiene valores de rotación, aparece el dial que muestran los efectos para controlar el ángulo. 2. Checkbox Control (Casilla de confirmación). Contiene una casilla con dos posiciones: apagado o encendido. Si establece fotogramas clave para esta propiedad puede usar este control para comenzar o parar la animación a intervalos determinados. 3. Color Control (Color). Este efecto contiene un recuadro de color que abre un selector y el cuentagotas. Lo utilizará para controlar la velocidad de cambio de color de una capa. 4. Layer Control (Capa). Contiene un menú desplegable donde se agrupan todas las capas de la composición. Este es el único efecto en el que no se pueden agregar fotogramas clave. 5. Point Control (Punto). Este parámetro establece un punto de efecto. Contiene pues un valor en coordenadas (x,y) y un botón para fijar el punto directamente haciendo un clic sobre la pantalla. Puede aplicar este punto de efecto para que todas las capas compartan unas mismas coordenadas de aplicación de los efectos. 6. Slider Control (Deslizador). Este control contiene un valor basado en un rango del 1 al 100. Puede fijar valores por encima de este rango. Si quiere usar otro rango distinto haga un clic en el botón derecho del valor para abrir un cuadro de diálogo donde podrá modificar este rango.