Téléchargez les Fichiers Sources
Pour cette animation nous allons utiliser trois expressions:
Expression 1:
time*100
Expression 2 :
x= value[0];
y= wiggle(5,20);
[x,y[1]]
Expression 3 :
x=value[0]+time*100;
y=value[1];
[x,y]
La première sera pour donner un mouvement perpétuel de rotation pour la roue sans ajouter de points clefs.
La seconde sera pour animer le corps de la roue sur un seul axe seulement et pouvoir toujours placer et replacer son objet sur la scène.
Dans un premier temps nous allons importer la voiture, (créée auparavant sur illustrator) en "composition - conserver les tailles de calques", afin d'avoir seulement des calques à la taille de chaque objet.
Ce qui est va nous faciliter la vie pour l'animation de la roue par exemple, vu que le point d'ancrage de la roue sera automatiquement au centre du calque roue.
Bien sûr, on a au préalable, préparé ses documents dans illustrator, en séparant chaque objet à animer sur un calque, nommé de façon intelligente.
-Animation de la roue:
On crée une composition à la taille de la roue en glissant le calque roue sur l'icône composition en bas de la fenêtre projet d'after, et on la renomme "roue animée", par exemple, en la sélectionnant et en appuyant sur entrée.
Dans la composition on sélectionne le calque roue et on appuie sur "r" pour n'afficher que les propriétés de rotation.
On clique sur le petit chronomètre à côté de "rotation" en restant appuyé sur "alt" : cela va activer le champ "expression" pour la propriété de rotation, avec écrit par défaut "transform.rotation".
Nous allons entrer à la place de cela, dans ce champ :
time*100 //Cela va faire tourner le calque Roue dans le temps de facon perpétuelle, on peut bien sûr faire varier la vitesse en changeant la valeur qui multiplie "time"
Petit edit:
On peut aussi lier la rotation de la roue au déplacement du véhicule, afin que la roue soit parfaitement animée.
Pour faire cela il faut calculer le périmètre de la roue:
2Pi *r est la formule mathématique avec r comme rayon de la roue.
Puis diviser la distance parcourue par la voiture par le périmètre pour connaître le nombre de tours à effectuer.
Transposons cela:
r= width /4; // on calcule le rayon de la roue
c=2 * Math.PI * r; // on calcule le périmètre de la roue
360/c*thisComp.layer("controlevoiture").transform.position[0] // on divise le nombre de tours par le périmètre
Maintenant quand la voiture se déplace, accélère ou décélère les roues sont parfaitement animées.
-Animation du corps de la voiture:
On va créer une composition en HD 720 que l'on va renommer "animation voiture", par exemple, et on va glisser le calque voiture_corps dedans.
Afin d'animer un objet sur un axe il faut isoler l'axe sur lequel on veut qu'il bouge:
On veut que le corps de la voiture tressaute verticalement donc:
on appuie sur "p" pour n'afficher que les propriétés de position, puis on va cliquer sur le chrono de la propritété de position du calque en appuyant sur "alt".
Dans le champ de l'expression on entre:
x= value[0]; // Dans ce cas [0] étant la propriété de position x, on lui dit d'utiliser sa valeur dans la composition.
y= wiggle(5,20); // wiggle(a,b) crée un mouvement aléatoire avec une fréquence/seconde =a et une amplitude en pixel =b
[x,y] // on a créé sur les lignes précédentes deux variables, que l'on utilise sur cette ligne en remplaçant le [[0],[1]] par [x,y], [0] étant la propriété de position x et [1] la propriété de position y.
On aura ainsi limité le wiggle sur un seul axe, le vertical.
Nous n'avons plus qu'à importer la composition "roue animée", la placer sur la voiture et la dupliquer pour créer la 2ème roue.
Nous allons créer aussi un objet "Null" que l'on va renommer "ControleVoiture", et nous allons lier les roues ainsi que le corps de la voiture à ce null en sélectionnant "ControleVoiture" dans le menu parent pour chacun des calques.
Ce null pourra être animé lui aussi avec une expression du type "time*a" sur la propriété x de position:
On sélectionne le null et on appuie sur "p" pour faire apparaître les propriétés de position, "alt" clique sur le chrono et on entre l'expression:
x=value[0]+time*100; // x utilise la position x de la composition et on lui ajoute time*100, ce qui le fait grandir et du coup déplace l'objet en x
y=value[1]; // y utilise la position y de la composition
[x,y] // les variables étant créées on les applique à la composition.
Par souci de clarté, dans la création d'expression, je préfère toujours décomposer les expressions et créer une variable pour chaque axe. J'aurais pu écrire à la place:
x=value[0]+time*100;
[x,value[1]]
ou pire
[value[0]+time*100,value[1]]
mais je trouve plus simple de tout décomposer afin de pouvoir revenir sur son projet sans trop attraper un mal de tête en essayant de comprendre ce que l'on avait écrit il y a de cela un mois.
On peut par ailleurs, si on veut aller plus loin, remplacer l'expression de la rotation de la roue par:
thisComp.layer("controlevoiture").transform.position[0] //cela va adapter la vitesse de rotation aux déplacements de la voiture.
ce qui va permettre si on anime le déplacement du véhicule à la main (freinage et accélération) d'avoir les roues qui tournent toujours à la bonne vitesse.
Pour la vidéo d'exemple j'ai placé les calques en 3D dans l'espace en réglant leur échelle en fonction de leur distance, et je les ai attachés à un null qui bouge à l'inverse du null "controlevoiture":
x=value[0]+(thisComp.layer("controlevoiture").transform.position[0]*-1); // value[0] permet de pouvoir replacer l'ensemble du décor au besoin, et (thisComp.layer("controlevoiture").transform.position[0]*-1 attribue la valeur de controlevoiture mais multipliée par -1, donc à l'inverse
y=value[1]; //on utilise la valeur y du calque
[x,y]
Animation d'un véhicule dans un décor à l'aide d'expressions from Chatbada on Vimeo.