Aide pour After Effect, techniques, expressions.

vendredi 28 décembre 2007

EXPRESSIONS : length

LENGTH: un mot simplissime et très pratique. Il permet de créer une variable qui aura comme valeur la distance en pixel entre deux calques (plus précisement entre leur deux points d'ancrage)

voilà ce qu'on écrit:
length (A,B)

A est la position d'un objet, B la position d'un autre objet.

Créons une petite scenette: créez 3 petits carrés. et disposez les vaguements en triangle. Appelez en un "distance". ouvrez sa rotation. Ouvrez les positions des deux autres.
Dans la rotation de "distance", on cherche à avoir ceci :

pos=thisComp.layer("Blanc uni 3").transform.position;
pposs=thisComp.layer("Blanc uni 2").transform.position;

length ( pos , pposs )









Vous l'aurez compris, on a crée deux variables, chacune d'entre elle etant la position d'un des deux calques. Ensuite, on demande à ce que la rotation soit égale à la distance entre les deux calques. Très pratique donc; on peut en faire ce que l'on veut, nous le retrouverons d'ailleurs dans énormément d'exemple (oui oui, le premier exemple concret de tout ça arrive bientot!)

Exemple d'utilisation: plus tu es pres de moi, plus je suis rouge, plus je suis petit, plus je tremble, plus je suis flou. C'est ce qui s'appelle faire de l'effet.

4 commentaires:

  1. Bonsoir Freelance Saucisse !

    Tout d'abord un énorme merci pour le partage de tes compétences. Tu dois y passer un tps monstrueux... mes respects, chapeau bas, et re-merci.

    J'ai lutté toute la journée sur un script et je suis vexée de n'avoir pas trouvé la solution. Je me dis que peut être, dans un élan de générosité, freelance saucisse voudrait bien se pencher sur mon pb (et qu'il n'en ferait certainement qu'une bouchée de pain (à hotdog bien sûr, pour aller avec la saucisse...)).

    J'expose donc mon soucis, des fois que, et bien evidement, je comprendrai que tu ai d'autres chats à fouetter...

    L'idée, c'est que l'echelle de mon calque soit modifiée selon une expression, au moment ou la distance entre mon calque et la camera soit égale a une certaine valeur(disons 200), et que cette transformation de l'echelle se répète à chaque fois que la distance est de 200.

    j'en suis là :

    PosModele=transform.position;
    PosCam=thisComp.activeCamera.transform.position;
    dist=length(PosModele, PosCam);

    veloc = 18;
    amplitude = 10;
    decay =5;

    if (dist>200){
    s = amplitude*Math.cos(veloc*time)/Math.exp(decay*time);
    value+[s,s,s];

    } else {
    [50,50,50];
    }



    lorsque je mets ">" l'echelle est effectivement modifiée la 1ere fois que la distance est superieure à 200, mais pas les fois d’après. et si je met "==" ou ">" à la place : ça ne fonctionne pas !



    Du coup je me suis dis que j'arriverai peut etre à qqchose en couplant avec ce script, mais justement, je voudrai que mes déclencheurs soient une condition de distance, et non des marqueurs :

    n = 0;
    if (marker.numKeys > 0){
    n = marker.nearestKey(time).index;
    if (marker.key(n).time > time){
    n--;
    }
    }

    if (n == 0){
    value;
    } else {

    veloc = 18;
    amplitude = 4;
    decay = 8;

    t = time - marker.key(n).time;
    s = amplitude*Math.sin(veloc*(t))/Math.exp(decay*t);
    value + [s,s,s];
    }


    Bref, je n'y vois plus clair. Est-ce que ton oeil de lynx pourrait me lancer sur une piste ?
    Avec tous mes remerciements, une fois de plus.

    Maya

    RépondreSupprimer
  2. Bonjour Maya.

    Tout d'abord, une précision sur les termes. Attention à ne pas confondre script et expression.
    Un script est une suite d'ordre pour arriver à un certain but. Une expression est une façon de rendre une propriété variable dans le temps. Dans ton cas, c'est donc une expression.

    Ensuite, un petit point pratique.
    Tu commences ton expression ainsi :

    PosModele=transform.position;
    PosCam=thisComp.activeCamera.transform.position;
    dist=length(PosModele, PosCam);

    C'est souvent une bonne idée de créer des variables propres pour ne pas s'y perdre par la suite, mais la 1ère ne sert pas à grand chose. En effet, quand on veut se référer à une des propriétés du calque dans lequel on est, il suffit d'écrire la propriété en question, sans rien d'autre (ni le tansform d'ailleurs)

    Donc tu aurais pu commencer tout simplement par :

    PosCam=thisComp.activeCamera.transform.position;
    dist=length(position, PosCam);


    Ensuite, en ce qui concerne ton expression. Tout d'abord, j'ai du mal à comprendre ce que tu cherches à obtenir visuellement.
    Tu veux apparemment créer une ondulation qui s'atténue dans le temps à différent moment.
    Mais ton expression de départ veut que cela arrive quand la distance est supérieur à 200. Ce n'est pas un évènement ponctuel, c'est un état qui peut durer. Du coup, je ne vois pas où tu veux en venir.

    Mais une petite remarque quand même :

    Au delà de ce que tu cherches à faire, je pense que ce qui te chiffonne est pourquoi ça ne "marche" qu'une fois. En fait, cela vient de là :

    Math.exp(decay*time)

    En divisant par un nombre grandissant, tu temps vers une amplitude de zero, ça ok. Mais tu multiplies cette dernière par "time". Et "time" augmente tout le temps, il ne redémarre pas chaque condition remplie.
    Du coup, à 10 sec, time vaut 10, donc qu'importe si ton calque remplit une condition, la division fait déjà tout tendre vers zero.

    Peut-être pourrais-tu expliquer ce que tu cherches à obtenir visuellement ?

    RépondreSupprimer
  3. Pour préciser ma pensée, ta vibration fonctionne, mais au delà de la problématique dans AE, c'est le principe même de condition de distance qui n'est pas clair.Le marqueur fonctionne car il est ponctuel, il déclenche quelque chose. Etre et rester à plus de 200 pixels d'un calque n'est pas un évènement en soi.
    La seule condition ponctuelle qui peut correspondre à une distance est non pas une valeur particulière, mais un franchissement. Pas de devant à derrière en quelque sorte, ou l'inverse.

    RépondreSupprimer
  4. Bonjour Monsieur Saucisse,

    je viens vers vous avec une question simple :

    peut-on contraindre un calque ( de forme, par exemple ) de manière à ce qu'il s'ajuste, en hauteur et longueur, à un calque de texte, avec seulement des expressions ?

    J'ai fait des essais, pour la longueur, en utilisant sourceText.length sur scale[0] du calque de forme,et en ajoutant un multiplicateur, mais plus la typo est longue et plus la valeur d'échelle grimpe de manière exponentielle.

    Merci d'avance.

    RépondreSupprimer