Aide pour After Effect, techniques, expressions.

samedi 31 janvier 2009

diaporama alpha turbo prime 2

Ouais je sais, ça devait arriver plus tôt, mais comme pas eu le temps, bah me revoilà.
Alors alors, on prend les mêmes, et on recommence. Ce coup ci, on veut que tous nos calques aient la même échelle. Mais plutôt que de choisir la largeur ou la longueur et donc avoir des problèmes avec les calques verticaux et horizontaux, on va faire en sorte que tous les calques soient visuellement de la même taille.
Nous allons donc accorder leur diapason non pas sur leur dimension sur x ou y, mais sur leur aire.
Allons y:

La base est la même que pour le post précédent.
Créez un Null "controle", avec un paramètre glissière "aire"
Pour cette valeur de "aire", mettons pour le moment 80.

Créez un solide de 350x100 (par exemple), ouvrez lui son échelle.

La fin sera la même que l'autre post, puisque la finalité est la même, à savoir imposer une taille en pixel à un calque sans se préoccuper de sa taille initiale.

On commence facile :

A=Math.abs ( thisComp.layer("controle").effect("aire")("Curseur") ) *1000;

A vaudra donc la valeur positive de "aire". Petit rappel du post regroupant la plupart des "Math.", Math.abs renvoie la valeur absolue (donc positive).
Et multiplié par 1000. Pourquoi par 1000 ? Et bien imaginons un calque "normal" d'une taille de 600*500. Son aire vaut donc 300 000. Donc on se rend compte que l'aire, c'est vite grand (tout est relatif), et qu'on aura souvent des multiples de 1000. Donc plutôt que d'écrire 300 000 dans "aire", autant écrire 300, c'est plus claire.
Ça, ç'est fait.
Ensuite, il faut que l'on définisse le rapport hauteur/largeur de notre calque:

R=width/height; (le rapport largeur/hauteur ici donc)
Donc si notre calque est large, R vaudra un chiffre supérieur à 1, s'il est carré, R=1, et s'il est étroit, 0 < R < 1

Comme l'échelle est uniforme, il suffit de trouver x par exemple.
Trouvons donc la formule qui donne x en fonction de R, avec l'aire A donnée.

x * y = A
x / y = R donc y = x / R
donc
x * ( x / R ) = A
x² / R = A
x² = A * R
x = racine carrée de A * R

et voilà, ça donne ça dans AE:

W=Math.pow ( A*R , 0.5 );

Même chose, petit rapel, Math.pow(a,b) donne a à la puissance b.
Et quand la puissance vaut 0.5, il s'agit de la racine carrée.
J'aurais également pu écrire ça:

W=Math.SQRT1_2(A*R);

Ceux qui se rappelle quelques trucs en maths comprennent donc pourquoi on a rajouté "Math.abs" à la valeur de aire. Sinon, on aurait pu avoir une valeur négative à l'intérieur de la racine carrée; et j'ai vu des after effect se desinstaller tout seul pour moins que ça...
Un moyen mémotechnique :
racine carrée de -1 = caca.


Et maintenant qu'on a la valeur en x, hop :

s=(100/width)*W;

Exactement la même chose que pour l'autre post.

la dernière ligne :

[s,s]

Et voilà. Avec cette expression ( je faix exprès de pas tout mettre à la fin, comme ça, hop, pas de copier coller des fénéants, du moins pas d'un coup, c'est déjà ça de gagner), tous vos calques auront la même aire, qu'importe leur taille ou leur forme.

Mais, mais, mais.... Comme vous devez le savoir, visuellement, moins un calque est carré, moins il parait grand à surface équivalente. Donc on a tendance à agrandir les calques étroits, pour qu'ils paraissent aussi important que les plus carrés.
Il faut donc ajouter une correction à tout ça.
Et là, c'est un peu moins drole, je dois l'avouer.

Alors alors...
Nous devons créer une valeur qui va nous dire à quel point un calque n'est pas carré.
Je propose ça :
calque carré = 1
moins un calque est carré, plus la valeur tend vers 0.
Comment on fait ça ? mmh?

Tout d'abord, rajoutez un paramètre glissière à votre Null controle, et appelez le "correction"
Après la 1ere ligne "A=
..."
rajoutez ça :

C=thisComp.layer("controle").effect("correction")("Curseur");

Ensuite, après votre ligne "R=machin" :

rect=R;
if (R>1) {rect=1/R}

Alors kénécé...
rect=R, ça c'est facile, on demande que rect soit égale à R, j'ai le droit.

if (R>1) {rect=1/R} Je crois pas que l'on ait dejà vu le "if"
C'est assez simple :
if (condition) {fais ça}
Notez bien les parenthèses pour la condition, et les accolades pour l'opération à effectuer.
Donc là, si R est plus grand que 1 (donc si notre calque est large) rect vaut 1/R.

Pourquoi je fais ça ?
Et bien parce que l'on veut avoir une valeur qui dit à quel point notre calque n'est pas rectangulaire. Et nous voulons la meme valeur pour les calques larges ET étroits.
Or pour un calque de 400x40, R vaut donc 10.
Et rappelez vous, nous voulons une valeur entre 0 et 1.
Donc si on a un calque étroit, R vaut entre 0 et 1, logique. Et si R=5 à cause d'un calque large, et bien on change la valeur pour 1/R, qui sera forcément entre 0 et 1.
Ainsi, un calque de 400x40 aura un valeur de 0.1, de même qu'un calque de 40x400.
C'est bien ce que l'on voulait faire, trouver une valeur de rectanglitude (et pourquoi pas d'abord), sans se préoccuper de savoir s'il est horizontal ou vertical.

ensuite, on n'a plus qu'à créer la valeur de correction à appliquer à la formule finale :
Nous allons donc utiliser la valeur C, celle de "correction" du Null de controle. En effet, vous pourrez ainsi modifier le taux de correction, puisque ce dernier est visuel, et donc subjectif/circonstantiel:

correction=linear ( rect , 0 , 1 , 1+C/100 , 1 );

vous connaissez dejà linéaire, je ne réexplique pas.
Donc, ici, quand rect=0, correction vaut 1+C/100
quand rect vaut=1, correction vaut 1.

la dernière ligne :

s=(100/width)*W*correction;

[s,s]

La seule différence est le rajout de *correction. Et là, vous comprenez parfaitement la ligne "linear" : Quand rect vaut 1, donc que le calque est carré, correction vaut 1, donc il ne modifie pas la formule.
Quand rect est différent de 1, donc entre 0 et 1, il tend vers 1+C/100.
J'ai divisé par 100 la valeur du paramètre glissère, car étant donné que correction va multiplier l'ensemble, il faut rester dans des petits chiffres.
Sinon, si on met 120 dans le paramètre glissère, on va avoir une échelle corrigée par un joli *121, et c'est pas joli.

Et voilà. Vous pouvez tester, vous verrez qu'en faisant varier la valeur de correction dans le Null de controle, les calques les plus étroits/larges grandissent plus que les plus carrés.

et voilà.

bon aller...l'expression en entier :

A=Math.abs ( thisComp.layer("controle").effect("aire")("Curseur") ) *1000;
C=thisComp.layer("controle").effect("correction")("Curseur");
R=width/height;

rect=R;
if (R>1) {rect=1/R}

correction=linear(rect,0,1,1+C/100,1);

W=Math.pow ( A*R, .5 );
s=(100/width)*W
*correction;

[s,s]

3 commentaires:

  1. j'aurais pas imaginé qu'on pouvait faire tant de chose, merci pour l'astuce, j'adore.

    RépondreSupprimer
  2. Bon voila, avant les expressions sous After c'étaient pour les autres...maintenant grâce à ce blog...et bien je comprends...un peu. Merci donc pour ces explications.

    Claude

    RépondreSupprimer
  3. ! ! ! j'ai vu des after effect se desinstaller tout seul pour moins que ça... ! ! ! OMG :) Hilarious

    RépondreSupprimer