Anneaux ValueAtTime from Chatbada on Vimeo.
Résultat à Atteindre du tutoriel d'expressions After Effects sur l' index et et le valueAtTime. Cette animation est réalisée sans keyframes et avec le logiciel natif (sans aucun plugin).
ValueAtTime est une fonction qui permet de récupérer une valeur et de la décaler dans le temps.
(cf le tutoriel Le Serpent ).
Index est une fonction qui permet de récupérer la position du calque dans la timeline. On peut ainsi incrémenter une transformation automatiquement via cette fonction (Comme un placement automatique par ex).
On va créer une série d'anneaux ouverts à base de solides.
Créez une composition en SD 16/9 (1024x576 px) pixels carrés que l'on nommera "Anneaux ValueAtTime".
Sélectionnez la composition "Cercle" et créez-lui 3 masques. Le premier en double-cliquant sur l'outil Ellipse, cela lui créera un masque rond.
Appuyez sur "m" tout en ayant le solide sélectionné (cela affiche les masques du calque), et sélectionnez le masque, puis appuyez sur "entrée" (cela permet de renommer le masque) et nommez le masque "cercle ext".
Le premier masque étant créé et nommé on peut le dupliquer, le renommer "cercle int" et le passer en soustraction.
Enfin, créez un masque rectangulaire à votre convenance afin d'ouvrir l'anneau et renommez-le "Rectangle". Passez-le aussi en soustraction.
Voilà, la base du projet est faite.
On va maintenant créer les contrôles des anneaux.
Créez un null (menu calque -> créer -> objet null (ctrl + alt + maj + Y)) et nommez-le "controle cercles".
Ajoutez-lui un paramètre couleur que vous renommerez "couleur" (menu effet -> option pour expressions -> paramètre couleur),
et cinq paramètres glissières que vous nommerez respectivement :"Expansion rect", "Position Z" , "Transparence", "Echelle", "Rotation Y".
Ensuite, nous allons lier les curseurs aux propriétés.
Passez la Composition "Cercle" en mode 3D puis appuyez sur "r", entrez "90°" sur l'axe des X afin de coucher l'anneau.
Sélectionnez le null "Controle Cercles" et verrouillez la palette d'effets.
Sélectionnez la composition "Cercles", appuyez sur"m" pour afficher les masques, déroulez les propriétés de masque de "Rectangle" et "Alt+Clic" sur le chrono du paramètre "Expansion de masque". Prenez le lasso et tirez-le sur le curseur de la glissière "Expansion rect" et validez par "entrée".
L'expression ci-dessous s'inscrit:
effect("Expansion rect")("Curseur") // C'est à dire que l'expansion du masque sera égale à la valeur du curseur "Expansion rect"
Maintenant, quand on bouge le curseur, cela modifie l'ouverture transversale de l'anneau.
Entrons dans le vif du sujet: l'animation à base d' "index" et de "valueAtTime".
Animons l'échelle de l'anneau de sorte que lorsque nous le dupliquerons, il s'agrandira automatiquement:
On va donc créer 3 variables pour les 3 axes:
"Alt+Clic" sur le chrono de l'échelle de "Cercle" et tapez:
ScaleX= transform.scale[0]; // On récupère l'échelle du cercle en X dans la variable ScaleX
ScaleY= transform.scale[1]; // On récupère l'échelle du cercle en Y dans la variable ScaleY
ScaleZ= transform.scale[2]; // On récupère l'échelle du cercle en Z dans la variable ScaleZ
[ScaleX,ScaleY,ScaleZ] // Et on attribue la valeur de chacune des variables à chacun des axes, donc pour l'instant, il ne se passe rien.
Cliquez après "ScaleX= transform.scale[0]" entrez "+" et avec le lasso, sélectionnez le curseur d'échelle de la palette d'effets de "Controle Cercle" puis validez par entrée.
Vous obtiendrez:
ScaleX=transform.scale[0]+thisComp.layer("control Cercles").effect("Echelle")("Curseur"); // On ajoute la valeur du curseur d'échelle à l'échelle de l'anneau en X
Enfin tapez à la suite de cette ligne "*index" ce qui donne:
ScaleX=transform.scale[0]+thisComp.layer("control Cercles").effect("Echelle")("Curseur")*index; // L'échelle de l'anneau va varier selon le curseur et selon le nombre de cercles
On répète ça avec le Scale Y et le ScaleZ ce qui donne :
ScaleX=transform.scale[0]+thisComp.layer("control Cercles").effect("Echelle")("Curseur")*index;
ScaleY=transform.scale[0]+thisComp.layer("control Cercles").effect("Echelle")("Curseur")*index;
ScaleZ=transform.scale[0]+thisComp.layer("control Cercles").effect("Echelle")("Curseur")*index;
[ScaleX,ScaleY,ScaleZ]
Passons à la rotation:
"Alt+Clic" sur le chrono de la rotation et tapez:
" time*index* " // time part de 0 et augmente continuellement, index s'incrémente avec le temps
Avec le lasso, sélectionnez le curseur de "Rotation Y" et ajoutez "+ random(5)" // On multiplie par la valeur du curseur "Rotation Y" et on ajoute de l'aléatoire variant de 5°
Ce qui donne :
time*index*thisComp.layer("control Cercles").effect("Rotation Y")("Curseur")+random(5)
Passons à la transparence:
"Alt+Clic" sur le chrono de la transparence et tapez:
(thisComp.numLayers/index)*thisComp.layer("control Cercles").effect("Transparence")("Curseur")
// On compte le nombre de calques que l'on divise par le n° du calque et on multiplie par la valeur du curseur de transparence
Reste la position :
Pour le premier cercle :
Renommez-le "tete" puis "Alt+Clic" sur le chrono de la position
x=transform.position[0]; // On récupère la position X
y=wiggle(2,90); // On bouge aléatoirement verticalement 2x/sec sur 90 px
z=transform.position[2]; // On récupère la position Z
[x,y[1],z]
Ensuite dupliquez le cercle, renommez-le "Cercle" et remplacez par:
p=thisComp.layer("tete").transform.position; // On récupère la position de "tete"
r= 1; // On crée une variable de retard de 1
ret= thisComp.frameDuration; // On définit le temps d'une image soit 1/25 de seconde
p.valueAtTime(time-ret*index*r) // On définit la position du cercle par rapport à son index et au retard voulu
Il ne reste plus qu'à dupliquer un certain nombre de fois "Cercle" et prévisualiser pour voir le résultat.