Aide pour After Effect, techniques, expressions.

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.

2 commentaires:

  1. Bonjour,
    ça peut sembler tout bête mais, comme le montre ton exemple : si on considère que l'objet est éloigné, il est donc flou. Mais si, par la rotation Z, un de ses cotés est proche du sol il est toujours flou alors que la logique veut que ce coté le soit moins (puisqu'il est proche du sol). Y-a-il une manière par les expressions de palier à ce problème?
    Cordialement,
    Matthieu.

    PS : Un grand merci pour ces tuto et exercices, le coté Obscur d'After Effect me semble tout de suite plus clair.

    RépondreSupprimer
  2. Tout à fait, il s'agit ici d'un système D qui ne prend en compte que la position d'un objet dans l'espace, et non pas la posiiton de chaque pixel.
    Les expressions n'ont pas acces à cela, cela n'a d'ailleurs rien à voir avec les expressions, c'est simplement qu'un effet de flou sera appliqué à l'ensemble d'un calque.
    Pour aller vite, si on veut appliquer un flou différent à différentes parties d'un calque, il faut soit utiliser la profondeur de champ intégré dans les caméras d'After, soit utilser un flou qui utiliser une couche de luminance pour faire varier le rayon, comme par exemple le flou composite ou le flou d'objectif.

    RépondreSupprimer