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.

vendredi 25 janvier 2008

PARTICULAR : anti-clone

Petite astuce avec Particular, le plugin de Trapcode largement utilisé comme simulateur de particules pour AE.

Particular propose en interne une petite liste de type de particules, comme smoke, sphere, star... Et vous permet également d'utiliser un de vos calques comme particule.

Voilà comment demander à particular d'utiliser plusieurs calques différents, en en choisissant un au hasard à la création de chaque nouvelle particule.

Créez une composition, pas trop grande sinon votre machine va gueuler (200x200 c'est deja pas mal), et placez à la chaine tous les calques que vous voulez utiliser dans particular. Chaque calque ne doit durer qu'une seule image, la composition doit donc durer le temps d'affichage de chaque image (si vous avez 10 calques, votre compo doit avoir une durée de 10 images, et donc finir par 00:09 car 00:00 existe oui oui)

Placez cette compo au début de la compo contenant le calque particular (et masquez la bien évidemment). Comme type de particule, mettez "custom", choisissez la compo créée, et dans "time sampling", utilisez "random - still frame".
Ainsi, particular choisira à chaque fois une image différente, et s'y tiendra pour chaque particule.
Pratique pour avoir des particules toutes différentes, ou bien une légère différence entre chacune pour éviter l'effet clone.

Allez, faites tomber de jolies feuilles mortes de toutes les formes de la vie, faites voler les bonbons...

mercredi 23 janvier 2008

EXPRESSSIONS : Math

j'y viens au fur et à mesure, pas trop vite non plus, mais je vais être obligé d'intégrer au fur et à mesure quelques notions de mathématiques, promis, des simples.

Ici, je vais détailler les différentes façon d'altérer un chiffre avec les fonctions Math.

Il y e en a presque 25, nous allons voir les principales ensemble. J'y consacre un post entier plutot que de faire de longues parenthèses lors des prochains posts où ces fonctions seront très souvent utilisées.

La synthaxe est toujours la meme, à savoir : Math.truc (x)
truc n'a pas de majuscule puisqu'un point le précède.
---------------------------------------------------------------------------
Math.abs (x): donne la valeur absolue du nombre, c'est à dire sa valeur positive.
exemple:
Math.abs (5) = 5
Math.abs (-6) = 6

Imaginons une variable X qui aille de 20 à -10. Math.abs(X) partira à 20, s'arretera à 0, et repartira vers 10.
---------------------------------------------------------------------------
Math.floor (x): donnc la valeur entière inférieure au nombre.
exemple:
Math.floor (5.35) = 5
Math.floor (0.95)= 0

Math.ceil (x): donne la valeur entière supérieure au nombre.
exemple:
Math.ceil (5.35) = 6
Math.ceil (0.95)= 1

Math.round (x): donne la valeur entière la plus proche du nombre
exemple:
Math.round (5.35) = 5
Math.round (0.95)= 1
Math.round (0.5)=1

Ces trois fonctions sont souvent utilisées pour avoir des nombres qui augmentent comme un escalier par exemple.
Math.flour (time) prendra succéssivement les valeurs 0 1 2 3 4 uniquement à chaque nouvelle seconde.

Dans la timeline, à coté du dieze des expressions, il y a un petit graphique. Activez le pour observer ce que crée l'expressions en terme de courbe (quand vous l'activez également dans la timeline en général)
---------------------------------------------------------------------------

Math.min (x,y): donne la plus petite valeur entre x et y. Evidemment, ça ne sert que lorsque x et/ou y varie(nt).

Math.max(x,y): donne la plus grande valeur entre x et y.

par exemple, Math.min(5,time) vaudra de 0 à 5 entre le début de la compo et la 5eme seconde, puis sera toujours égale à 5 ensuite, étant donné que time vaudra plus que 5.

Ces deux fonctions permettent donc de mettre un plancher ou un plafond à une valeur, c'est très utile.

Math.min ( 5 , time ) et Math.min ( time , 5 ) sont strictement identiques.

---------------------------------------------------------------------------

Math.PI : lui ne modifie pas une valeur, mais contient la valeur de PI ( 3.14machin )

---------------------------------------------------------------------------

Math.pow (x,y): crée la valeur x puissance y.
exemples:
Math.pow(5 , 2)=25
Math.pow(2 , time ) augmente à une vitesse considérable !

---------------------------------------------------------------------------

Math.exp (x): donne l'exponentiel du nombre. En gros, cela donne une valeur qui augmente très vite en démarrant lentement (un peu à la manière d'une valeur au carré).
exemples:
Math.exp (.5)=2
Math.exp (3)=20
Math.exp (40)=326901

Si si, on s'en sert très souvent, par exemple :
Math.min ( Math.exp ( time ) , 5 ) n'ira pas plus haut que 5.

A noter que pour un soucis de clareté, si on a pas créé de variable pour Math.exp(time) genre :
x=Math.exp(time);
Math.min ( x , 5)

On peut aussi écrire ceci:
Math.min (
Math.exp ( time )
,
5 )


Ainsi, chaque élément est sur ligne différente, beaucoup plus lisible.

---------------------------------------------------------------------------

Il en existe d'autre, nous les verrons plus tard.

Je ferai surtout un chapitre bien à part en ce qui concerne:

Math.cos
Math.sin
Math.tan
Math.acos
Math.asin
Math.atan
Math.atan2

Et oui, vous n'allez pas échapper à la trigonométrie, mais quand vous aurez vu ce que l'on peut en faire, vous vous demanderez comment vous avez pu animer quoi que ce soit sans ces outils.

EXPRESSIONS : spot + diapo

Une utilisation concrète des vecteurs.

AE permet la création d' éclairage 3d. Ici, nous allons utiliser le spot 3d, à la façon d'une lampe torche. Nous allons d'ailleurs simuler le dessin lumineux créé par une vraie lampe torche. En effet, le spot n'est pas uniforme, mais hétérogène, à cause des miroirs.














Voilà l'image que j'ai créé sous photoshop pour l'effet.

Et voilà ce que nous cherchons à faire:












Ici, le cône de lumière a été rajouté par le plugin Lux, et n'est ici que pour une meilleure lecture de l'image.

On voit clairement que la lumière projète l'image.
Installons la scène.

Créez 2 solides 3d que vous mettrez perpendiculaire, et un petit solide 3d, devant, en hauteur (ici en jaune).

Créez un spot (ctrl alt shift L), "concentré" en français, avec un cone d'environ 50 degrés.
Faites en sorte que le spot éclaire les 3 solides, activez les ombres en reception et emission, et activez aussi les ombres pour la lumière. Le petit solide jaune crée donc une ombre sur les deux autres.











Rajoutez votre image de lampe torche. Le but est le suivant, placer cette image devant la spot, puis qu'elle reste toujours devant le spot, et orientée sur l'axe du spot, pour éviter toute déformation.
Nous allons utiliser les outils que nous avons deja utilisé, rien de bien nouveau.

Mettez votre image de lampe torche (ILT) en mode 3d.

Créez une expression pour sa position :

a=thisComp.layer("Lumière 1").transform.position;
b=thisComp.layer("Lumière 1").transform.pointOfInterest;

On a donc crée deux variables, la position de la source du spot, et la position du point ciblé par le spot.

V=sub(b,a);

On crée le vecteur correspondant.
Voilà la dernière ligne:

a+normalize(V)*50

que je me dois d'expliquer :

On cherche à ce que ILT soit toujours entre la source du spot et le point ciblé.
Tout comme dans le post précédent, on aurait pu écrire ceci:

a+V*0.2

Ainsi, ILT aurait été à 20% de la distance totale entre la source et la cible. Mais ça fonctionnerait mal, car dès que l'on animerait la source ou la cible, la distance entre les deux changerait, la position d'ILT changerait donc aussi par rapport à la source.

Imaginons que la distance entre la source et la cible soit de 1000 pixels.
Avec
a+V*0.2, ILT serait à 200 pixels de la source. Si 1000 se transforme en 1500, l ILT serait plus éloigné de la source, et donc l'ombre créée serait plus grande.

Nous voulons donc que la distance entre la source du spot et l'ILT soit fixe, qu'importe les animations futures. D'où la ligne
a+normalize(V)*50.

Quel est ce normalize(V) ?
C'est une fonction qui transforme un vecteur lamba en un vecteur de distance 1. On garde ainsi l'angle du vecteur, mais ça distance devient donc l'unité. Il suffit donc de multiplier cette valeur par ce que l'on veut, ici 50, et l'ILT sera donc toujours à 50 pixels de la source.

Il faut à présent orienter le calque ILT.
Créez une expression pour son orientation:

a=thisComp.layer("Lumière 1").transform.position;
b=thisComp.layer("Lumière 1").transform.pointOfInterest;
lookAt(a,b);

C'est exactement la meme chose que ce que nous avons vu précédemment. Ajuster les rotations XYZ si besoin est.


Il ne reste plus qu' à modifier un parametre 3d de l ILT, dans les options de surface. Mettez la transmission de lumière à 100%, pour que le calque agisse comme une diapositive (il faut biensur que ILT émette une ombre) .

Ajustez l'échelle du calque pour que sa taille et la taille du cone du spot coïncide. Et voilà.

Cette technique à quelques limites:

Cela interdit l'utilisation des ombres douces, puisque cela rendrait flou la diapositive.
L'autre soucis est que le calque de diapositive est forcément visible s'il entre dans le champs de la composition.

On peut évidemment projeter ce que l'on veut ainsi.

mardi 22 janvier 2008

EXPRESSIONS : les vecteurs

Les vecteurs...

Bouh le vilain mot de mathématiques!
Oui, tout le monde s'en souvient, on a tous eu ça en cours. Nous allons ici en avoir une utilisation extremement simpliste.

Petit rappel, un vecteur, c'est comme une flèche: c'est une direction + une distance.
Exemple : 30 degrés, + 20 pixels. Voilà, c'est pas plus compliqué que ça.

Passons au concret. Crées 2 calques bleu de 50x50, et un troisième, rouge, plus petit. Placez les 2 bleus où voulez dans la compo, plutot en diagonal, et placez le rouge à coté de celui du bas.









Ouvrez la position des 3 solides, et créez une expression pour la position du petit.

a=thisComp.layer("Bleu roi uni 6").transform.position;
b=thisComp.layer("Bleu roi uni 7").transform.position,

Le grand classique, on crée une variable pour chaque position des deux autres solides.
Puis, on rajoute ceci:

V=sub(a,b);

Alors, qu'est ce que c'est... Cette fois ci, V ne sera pas égal à un chiffre, mais sera un vecteur. Il va donc stocker dans sa mémoire un angle, et une distance, en pixel.
Sans rentrer dans les détails, retenez ceci:

sub(A,B) crée un vecteur allant de B à A (et non de A à B).

Finissez l'expression en écrivant ceci:

b+V

On demande donc que le carré rouge ait la position de B, plus le vecteur V. Observez sa position, il est donc logiquement à la meme position que A. C'est logique, si on part de B et qu'on rajoute le chemin pour aller de B à A, on arrive sur A.

Remplacez b+V par position+V , et décalez le carré rouge sur le coté.

A présent, faites bouger le carré A ou B, le carré rouge bouge en meme temps, puisque le fait de bouger A ou B modifie le vecteur V, et donc modifie la position du carré rouge.

Rajoutez un paramètre glissiere au carré rouge, appelez le "coeff", et ecrivez cette expression :

a=thisComp.layer("a").transform.position;
b=thisComp.layer("b").transform.position,

C=effect("coeff")("Curseur");

V=sub(a,b);

b+V*C

Faites variez le paramètre glissière entre 0 et 1. Le carré rouge se déplace entre A et B. Et oui, on peut multiplier ou diviser le vecteur pour faire évoluer la distance, pratique. Une valeur négative fera partir le vecteur dans l'autre sens, une valeur supérieure à 1 fera aller le carré rouge au dela du segment AB.











Ici, j'ai animé la coeff avec un wiggle qui fait vibrer la valeur entre 0 et 1, et j'ai animé les deux carrés bleu.

Une fonction très utile, qui permet beaucoup de chose, nous en verrons un exemple dans le prochain post.