Aide pour After Effect, techniques, expressions.

jeudi 13 mars 2008

EXPRESSIONS : gestion d'une couleur

Parfois, on peut avoir une composition avec plusieurs calques texte ayant la même couleur.
Si on veut changer la couleur des textes, à priori, il faut modifier la couleur dans chaque calque texte, surtout si les calques sont éparpillés sur la pile des calques de la timeline (empêchant l'utilisation d'un calque de réglage pour modifier l'ensemble des calques textes).

Il existe plusieurs solutions, en voici une très simple utilisant les expressions.
Créez un calque null, avec un effet "paramètre couleur", dans le même menu que le paramètre glissière.
Ouvrez le menu du texte dans la timeline, cliquez sur "animer", et créer un mini menu en cliquant sur "fond du tracé", "RVB". Ainsi, vous pouvez changer la couleur de votre texte de la timeline, et non plus uniquement du panneau "caractère".

Ensuite, il ne vous reste plus qu'à créer une expression pour la couleur en l'accrochant à la couleur de l'effet "paramètre couleur" du Null, et de faire ça avec chaque calque.














Voilà, vous pouvez contrôler la couleur de plusieurs calques avec un seul.

dimanche 9 mars 2008

EXPRESSIONS: selection de calque

Un petit post qui vous donnera un outil puissant dans AE. Une nouvelle façon de selectionner un calque dans une expression.
Pour le moment, nous n'avons vu qu'une seule façon:

thisComp.layer("target").blablabla

On demandait à AE d'aller voir dans cette même composition un calque nommé "target".
Il y a une autre façon de cibler un calque:
"Va cherche la position du calque qui est juste au dessus de moi s'il te plait."

Oui oui, c'est possible, voilà comment:

thisComp.layer(thisLayer, -1)

On demande donc à AE de cibler le calque qui a un index inférieur d'un point à celui dans laquelle est écrite l'expression.

thisComp.layer(thisLayer, +2), et là c'est le calque qui est en dessous de 2 niveaux.

Le chiffre peut également être une variable comme nous le verrons plus tard.
Quel intérêt à tout ça?
L'intérêt est énorme en terme d'automatisation, nous l'utiliserons très souvent, et voilà pourquoi:


Prenons l'exemple tout frais du reflet. Imaginez que vous avez (et ce sera surement le cas) plusieurs calques dont vous voulez le reflet dans le sol. Vous allez donc créer un clone de chaque calque.
Logiquement, vous copiez l'expression de position du votre premier reflet dans la position d'un autre futur reflet. Et pouf, ça ne marche pas comme vous voudriez. Pourquoi ? Car l'expression originale cible le calque "premier mot" alors que ce deuxième reflet devrait faire appel au calque "deuxième mot".
Et là, vous vous rendez compte que vous allez devoir changer plus ou moins à la main toutes les variables "calque machin" pour chaque expression et chaque reflet... Insupportable si tout cela concerne 50 calques.

C'est là que notre nouveau joujou intervient.
Plutôt que d'écrire:
P=thisComp.layer("calque 1").position;

on va donc écrire:
P=thisComp.layer(thisLayer,-1);

Et pareil pour toutes les variables faisant appel au calque reflété. La condition est évidemment de mettre le reflet juste en dessous de son modèle. il ira toujours chercher les variables dans le calque au dessus de lui.

Ainsi, si chacun de vos reflets est en dessous de son modèle, vous pourrez copier/coller toutes les expressions que vous voulez, chaque reflet se comportera parfaitement.

Encore un pas vers l'automatisation!

mercredi 5 mars 2008

EXPRESSIONS: les reflets

Un peu de concret ce coup-ci, la gestion des reflets dans AE. Il s'agit évidemment d'une suite d'astuces, étant donné que les réflections dans AE ne sont pas gérées.

Le sujet est déjà traité ici et là sur internet, mais nous allons intégrer les expressions pour automatiser le tout.

Commençons avec une scène simple, un sol bien grand, et un mot, les deux en 3d.
Evidemment, le sol est horizontal, le mot est vertical.











Déjà, voyons comment créer un reflet. L'astuce est simple, on duplique le calque. Pour qu'il soit un reflet, il faut qu'on le mette en "miroir". Pour cela, plusieurs possibilités. Nous allons en choisir une et s'y tenir, car la suite sera en fonction de ce choix.

On peut par exemple inverser l'échelle sur Y (en décochant l'échelle uniforme), ou bien mettre 180 dans l orientation sur x (et non la rotation). Optons pour l'échelle sur Y à -100. Ensuite, on recoche "échelle uniforme"

Faites descendre votre reflet plus bas, et là, hop, il disparait sous le sol. Logique, puisque sa position sur Y devient plus basse que le sol. Pour régler ce premier problème, une astuce existe.
Créez une calque d'effet juste au dessus du sol. Ainsi, meme si un calque passe sous le sol, il restera entierement visible du moment qu'il reste au dessus du sol dans la pile des calques.

Ca, c'est fait.
Maintenant, automatisons le tout. Nous voulons deja que le reflet s'éloigne du sol vers le bas d'autant que la distance entre le sol et le mot.
On doit donc creer une variable qui définit la distance L entre le sol et le mot, et demander à ce que le reflet ait une position en Y telle que sol+L (et non sol-L, car Y augmente vers le bas):

sol=comp("Composition 1").layer("sol").transform.position[1]; // hauteur du sol
P=thisComp.layer("mot").transform.position; // position du texte
distance=Math.abs(sol-P[1])
// distance entre le sol et le texte

x=P[0]; // meme position sur x que le texte

y=sol+distance;

z=P[2]; // meme position sur la profondeur que le texte
[x , y , z ]


Je ne m'étends pas 4h sur ces quelques lignes simplissimes:
sol est la position du sol sur Y, P la position du mot.
Le reflet doit avoir la meme position que le mot sur X.
Pour la distance, on soustrait la position du sol au mot, ou l'inverse, qu'importe puisqu'on utilise Math.abs qui en ressort la valeur absolue, c'est à dire positive.
Et oui, souvenez vous,
Math.abs(5)=5
Math.abs(-5)=5

Donc Math.abs(10-3) = Math.abs(3-10)=7

Donc, Y=sol+distance

Et pour Z, c'est la meme chose que pour X, mais dans l'autre dimension (la profondeur)

voilà pour la position.
Au final, le reflet devrait suivre le modèle sur x et z, y devant etre inversé puisqu'il correspond à la distance objet-sol

Faites bouger votre mot dans sur les 3 axes, le reflet se comporte parfaitement.

Passons aux rotations.
C'est ici que le choix de la solution miroir influence la suite. On a ici opté pour l'échelle de -100 sur Y.

on a donc ceci:

pour la rotation sur X:
thisComp.layer("mot").transform.xRotation*-1

pour la rotation sur Y:
thisComp.layer("mot").transform.yRotation

pour la rotation sur Z:
thisComp.layer("mot").transform.zRotation*-1

En fait, il n'y a que 2 possibilités. Ou l'angle est le meme, ou bien c'est l'angle inverse ( *-1). Donc si vous optez pour un miroir avec l'orientation sur x de -180, ça sera l'inverse de tout ça.
De toute façon, il suffit de tester, et on se rend vite compte si c'est bon ou pas.

Si on veut aussi automatiser l'échelle, c'est tres simple, surtout avec le miroir fait avec -180 dans l'orientation sur x, il suffit de copier l'échelle du modèle.

Pour le cas où le miroir fait avec l'échelle de -100 sur Y, on écrira ceci:

s=thisComp.layer("mot").transform.scale;
[s[0] , s[1]*-1, s[2] ]

On inverse donc juste Y.

Voilà, toutes les transformations sont faites. Occupons nous de la transparence.











Le reflet doit évidemment etre moins dense que le modèle.
On veut faire en sorte que plus le modèle est loin du sol, plus le reflet est transparent. Nous allons donc utiliser la fonction linear. Bravo à ceux qui ont deviné.

imaginons qu'on veuille que l'opacité aille de 0 à 50:

sol=comp("Composition 1").layer("sol").transform.position[1]; // hauteur du sol
P=thisComp.layer("mot").transform.position; // position du texte
t=transform.opacity; //valeur de l'opacité
distance=Math.abs(sol-P[1]); // distance entre le sol et le texte
linear(distance, 10 , 60 ,t, 0 )

Voilà, c'est pas bien compliqué. Juste une petite précision pour l'utilisation de l'opacité du calque.
Certains pourraient se dire ceci: comment est il possible de creer la variable
t=transform.opacity alors que c'est cette meme variable que toute l'expression modifie ?

C'est tres simple, souvenez vous, AE lit d'abord la valeur, puis l'expression, et utilise la valeur créée par l'expression. De la meme maniere, on peut creer dans la position une expression du type position + [3,5] . Vous pourrez bouger votre calque; une fois votre calque placé, AE rajouter 3 et 5 à la position.

Pour en revenir à nos moutons, il ne vous reste donc plus qu'à entrer 50 dans l'opacité du reflet. Ainsi, 50 sera l'opacité maximum utilisée, jusqu'à ce que le mot soit à plus de 10 pixels du sol. Les valeurs de 10,60,50 et 0 sont ici arbitraire, vous mettez ce que vous voulez selon votre scène.

Affinons le tout avec un flou dans le reflet. Plus le mot est loin du sol, plus le reflet est flou, à la façon d'un sol légèrement dépoli. C'est exactement le meme principe que pour l'opacité. On rajoute un flou gaussien, ou directionnel au reflet et dans le rayon:
sol=comp("Composition 1").layer("sol").transform.position[1]; // hauteur du sol
P=thisComp.layer("mot").transform.position; // position du texte
distance=Math.abs(sol-P[1]); // distance entre le sol et le texte
ease(distance, 10 , 60 , 2 , 20 )














Sans commentaire.

Voilà un exemple simple. Ca a été un peu long, mais quand on regarde le tout, c'est en fait très rapide à mettre en oeuvre.
Si vous avez plusieurs objet à refléter dans votre scène, n'oubliez pas de creer une variable générale pour l'opacité et le flou des réflections, avec par exemple un Null et 4 paramètres glissière du type:

Opmin
Opmax
Floumin
Floumax

et de les intégrer dans vos expressions, ainsi, vous pourrez tout gérer en meme temps, sans avoir à revenir dans chaque calque en cas de modification. On peut aussi rajouter des paramètres de distance du modèle au sol, etc.

voilà voilà, bonne réflection.