Alors bon, oui je sais, j'ai promis le graal, le sésame, la trigonométrie, promis, bientôt.
Mais je fais un rapide détour par les vecteurs.
Souvenez vous, on a vu comment placer une image devant un spot pour que cette dernière soit projetée comme une vulgaire diapositive dont personne n'a plus besoin. On avait utiliser les vecteurs pour ça.
Voyons aujourd'hui une autre utilisation des vecteurs :
Comme vous l'aurez compris, comment faire pour que des calques soient entre deux calques, qu'ils y restent, qu'ils soient tous équidistants, et qu'ils s'adaptent selon leur nombre.
Ouais, tout ça...
C'est parti :
Commençons simple, créez deux solides oranges, ils seront les cibles. Mettez les légèrement en transparence, pour que l'on puisse voir en dessous, comme des coquins.
Créez un Null que vous allez appeler "plafond", et placez le sous les deux calques.
Créez un autre Null, nommez le "sol", et placez le tout en bas.
Nous allons voir l'utilité de ces deux calques.
Créez un petit calque rouge par exemple. Placez le entre plafond et sol.
Créez une expression pour sa position :
a=thisComp.layer("A").transform.position;
b=thisComp.layer("B").transform.position;
plafond=thisComp.layer("plafond").index;
nombre=thisComp.layer("sol").index-plafond-1;
c'est ultra simple : a et b sont les positions respectives des deux calques principaux, plafond est l'index du plafond, et nombre sera le nombre de calques placés entre plafond et sol.
En effet, s'il y a 5 calque entre plafond et sol, plafond aura 3 comme index, et sol aura 3+5+lui=9 comme index. donc 9-3-1=5, on a bien le nombre de calques.
J'ai crée les calques plafond et sol pour pouvoir avoir autant de calques que je veux dans la composition. Tant que mes calques rouges resteront entre plafond et sol, tout ira bien.
Voilà comment on va procéder.
Tous les calques partiront de a.
On va crée un vecteur V qui va de a vers b.
Donc si un calque par de a, et qu'on rajoute le vecteur, le calque sera sur b.
Si on fait a+V/2, le calque sera donc entre a et b, pile au milieu.
Donc, on va diviser la taille de V en autant de fois qu'il faut, donc en autant de calques présents.
écrivez à la suite :
V=sub(b,a);
donc ça, pas de problème, vous vous souvenez, on crée un vecteur qui va de a vers b.
I=index-plafond;
On utilise I comme nouvel index de calque, pour que ce dernier soit relatif à la position de "plafond" dans la composition.
increment=linear(I,0,nombre+1,0,1)
C'est ici que tout se joue.
La position du calque dépend de sa position dans la composition. Selon sa position, on va lui appliquer a+V*x, ou x varie donc de 0 à 1 (de 0% à 100% du vecteur donc)
La variable est donc la position dans la timeline, I.
Disons que N est le nombre de calques à placer.
I va donc varier de 1 à N, mais nous allons la faire varier de 0 à N+1, et nous allons voir pourquoi.
Donc, quand I=0, increment vaut 0. Et quand I vaut le nombre total de calques (le dernier calque de la liste donc), incrément vaut 1.
la dernière ligne :
a+V*increment
On rajoute donc V*increment à "a".
Donc quand increment vaut 1, on rajoute la valeur entière de V à a, on tombe donc sur b.
C'est pour cela que j'ai écrit increment=linear(I,0,nombre+1,0,1) et non increment=linear(I,1,nombre,0,1), car sinon, le premier calque aurait été à la meme position que le calque a, puisque on aurait eu a+V*0, et pareil pour dernier calque avec a+V*1.
Donc en écrivant increment=linear(I,0,nombre+1,0,1), les valeurs 0 et 1 pour incrément ne sont pas utilisées, puisque I ne peut varier que de 1 à nombre.
l'expression en entier :
a=thisComp.layer("A").transform.position;
b=thisComp.layer("B").transform.position;
plafond=thisComp.layer("plafond").index;
nombre=thisComp.layer("sol").index-plafond-1;
V=sub(b,a);
I=index-plafond;
increment=linear(I,0,nombre+1,0,1)
a+V*increment
une question que certains peuvent se poser:
on avait vu comment simplement placer un calque entre deux autres, c'était simple :
(a+b)/2
Alors pourquoi ne pas utiliser la meme technique en faisant varier "2" ?
Diviser par 3, on se rapproche de a, diviser par 1.5, on se rapproche de b.
Et bien car ça ne marche pas pour la situation suivante : quand b est à gauche de a.
Vous pouvez tester. En effet, si un calque a pour expression (a+b)/3, quand b passe à gauche de a, le calque ne restera pas collé à a, il ira vers b. Tout va s'inverser au moment de la bascule.
Et c'est bien normal, puisque quand on dit (a+b), on ne fait aucune différence entre les deux, alors que pour ce coup là, on en a besoin.
voilà, c'était simple non ?
Inscription à :
Publier les commentaires (Atom)
Merci pour ces explications!.
RépondreSupprimerJ'ai pas mal fait le tour des differents articles!
On veut la suite :)
Bravo en tout cas.
Une petite question tout de même, pourquoi avoir soustrait 1 à "nombre" au bout de cette ligne :
RépondreSupprimernombre=thisComp.layer("sol").index-plafond-1;
puis ajouter 1 à "nombre" sur cette ligne :
increment=linear(I, 0, nombre+1, 0, 1)
Merci pour vos tutoriaux !
Vincent2
La raison est très simple.
RépondreSupprimerPlutôt que de créer exactement les variables qui nous semble nécessaires, il vaut mieux créer des variables normalisées, qui ont un sens de façon général.
"nombre" correspond au nombre de calques présents entre le sol et le plafond. Le -1 a donc tout son sens, sinon le nombre de calques compris entre sol et plafond serait faut.
Ensuite, pour l'incrément, on veut que chaque calque se voit attribuer une position entre 0 et 1, mais pas 0 et 1, car étant donné qu'on va multiplier cette valeur à un vecteur, 0 placerait le calque au niveau de la 1ère extrémité, et 1 placerait le calque au niveau de la 2ème extrémité. Donc pour sauter ces 2 valeurs spéciales, on fait varier le nombre de 0 à n+1, pour que "nombre" soit forcément à l'intérieur (puisque "nombre" vaut forcément au moins 1.
De façon plus générale, il faut bien voir que cette expression est très très simple, et ne fait appel à "nombre" qu'une seule fois. Cela aurait pu être différent, et il vaut donc mieux créer des valeurs qui correspondent à quelque chose, d'une part pour pouvoir les utiliser partout. Si j'avais laisser exprès la valeur nombre sans le -1, j'aurais du systématiquement corriger avec "nombre-1" pour toutes les fois où j'aurais réellement eu besoin d'avoir la valeur juste de "nombre". Une grande source d'erreur.
D'autre part, quand on revient sur une expression à laquelle on n'a pas touché de puis longtemps, on mettrait plus de temps à comprendre pourquoi la valeur "nombre" vaut +1 par rapport au nombre réel de calque.
J'espère avoir été clair.
Okey, c'est clair. Comme dit ma grand mère, à vouloir trop simplifier on finit par manquer de bon sens:)
RépondreSupprimerv2