Aide pour After Effect, techniques, expressions.

jeudi 21 janvier 2010

remappage temporel de clef
















Bonsoir à tous.

Ce soir, un petit outil très pratique qui va vous permettre de gérer la vitesse d'animation d'une valeur sans toucher à cette dernière.
Petit exemple:
Comme vous le savez, quand un objet va d'un point A à un point B, vous pouvez gérer la courbe de vitesse pour faire en sorte que l'objet accélère tout du long, ou freine juste à la fin, etc.

Mais c'est un peu plus compliqué quand l'objet décrit une trajectoire faite de 5 ou 256 points. On peut toujours mettre les points en mode "déplacement dans le temps", mais on ne gère que la vitesse globale et non local (à chaque instant).

Nous allons donc installer un système de remappage temporel, mais pour les clefs.
Vous allez voir, c'est assez simple.

J'explique d'abord ce que l'on va faire:
On va créer une valeur qui va de 0 à 100. Quan la valeur vaudra 0, on chargera la position qui est sur la 1er clef. Quand la valeur vaudra 100, on chargera la valeur qui est sur la dernière clef.

Créez votre objet, faites lui faire une petite trajectoire faite avec 4-5 clefs, qu'importe.
Ensuite, rajoutez lui un paramètre glissière et écrivez ceci :

n=position.numKeys;

On demande que n valle le nombre de clefs dans la valeur "position".

start=position.key(1).time;
end=position.key(n).time;

On crée 2 variables qui nous indiquent à quel code temporel se trouve la 1ere clef et la dernière clef (et oui, la clef "n" sera toujours la dernière. Vous pouvez rajouter des clefs, ça se mettra à jour tout seul).

linear(value,0,100,start,end);

Et voilà !
Il ne vous reste plus qu'à animer ce paramètre glissière en l'animant de 0 à 100.
Cela vous permet de gérer l'accélération/décélération de l'objet, ou vous pouvez aussi faire varier la valeur dans tous les sens pour faire une yoyo, ou même utiliser un wiggle pour aller de 0 à 100.

















A présent, écrivez ceci dans la position de l'objet :

p=effect("Paramètre glissière")("Curseur");
valueAtTime(p)

La position va donc charger la position à un moment différent, celle qui est dans le paramètre glissière.

Ça fonctionne évidemment pour toutes les propriétés.

5 commentaires:

  1. bonjour freelance saucisse!

    grace a ton blog j'ai pu progresser enorment et faire des tas de choses avec les expressions, beaucoup de bricolage mais ca marche....sauf que la y a un detail bien genant que je comprend pas a quoi c'est du???
    j'ai bien suivi tes explications pour ton post sur le "remappage temporel de clefs" je l'ai utiliser plein de fois et ca marche super bien, sauf que la quand je rentre ca :

    A=thisComp.layer("cuisse 1_pop")
    B=thisComp.layer("pied 01_pop");
    point1=A.toComp(A.anchorPoint) ;
    point2=B.toComp(B.anchorPoint);

    distance=length(point2, point1);
    pos1=thisLayer.marker.key("01").time;
    pos2=thisLayer.marker.key("02").time;
    P=linear(distance, 2430,2454, pos2, pos1)
    valueAtTime(P)

    quand je deplace mon calque "pied" de maniere lineaire sans amortis le linear fonctionne bien pour arriver de la "pos2" a la "pos1" mais cela interpol pas du tout de maniere lineaire, le passage de la "pos1" a la "pos2" se fait comme si il y avait des amortis.....resultat mon petit calque "pied" et mon calque "cuisse" match bien seulement a la clef d'arriver et la clef de depart, entre deux c'est pas synchro....j'espere ne pas etre trop confus...
    si tu as bien sur un peu de temps pour m'aider ou une idée a quoi est du se decalage de lecture ce serai super cool, sinon tant pis
    en tout cas ton blog est evidemment genial et merci pour toutes tes explications sur les expressions.

    nicolas G

    RépondreSupprimer
  2. A quel calque est appliqué cette expression ?
    J'ai du mal à saisir ton raisonnement, pourquoi avec créé les points 1 et 2 avec le point d'ancrage puisque ses valeurs sont locales ?

    Dis moi plutôt ce que tu cherches à faire, car peut être es-tu parti sur une piste alambiquée.

    RépondreSupprimer
  3. salut!

    tu vas trouver mon idée terriblement hasardeuse j'en suis sur....l'idée est de creer un systeme d'IK (j'ai d'ailleur reussi a en faire plusieurs de maniere differentes et grace a toi, merci) que je peux activer et desactiver, mais cela n'est que le debut...
    Dans ce cas precis j'ai creer un calque "cuisse" ,"mollet" et un calque "pied", je preanime le deplacement des calques "cuisse" et "mollet" situé entre deux markeurs "01" et "02" avec un effet "geometrie" (et la tu te dis "oulalala qu'est ce qui fais") de maniere a donner l'illusion que ma jambe est plier et tendu sans toucher au parametre de base tel que la position et la rotation, mon calque "cuisse" et "mollet" ne bouge uniquement parce que j'ai animer mon effet geometrie...puis j'avais l'idée que en liant la distance du "pied" et du haut du calque "cuisse" cela fairai appel au clef situé entre mes deux markeurs "01" et "02"....
    pffff j'explique trop mal, et il doit manquer surement plei d'info pour que tu puisses voir l'idée globale....
    en super simple je veux bricoler un systeme d'IK que je oeux activer et desactiver...voila
    et comme je ne mis connais pas tres bien en expression je recupere des bouts de ligne de codes a droites et a gauches en m'efforcant de comprendre et je mix tout ca en croisant les doigts...
    arf, la traversé du desert m'attend....

    nicolas G

    RépondreSupprimer
  4. j'ai reussi a faire ce que je souhaitais avec mon systeme tout alambiqué, il est evident que ce n'est surement pas la meilleur solutions mais bon....d'autres problemes ce créer au fur et a mesure, je pense trouver les solutions sur ton blog....
    merci

    nicolas G

    ps: desolé pour le fautes d'orthographes, c'est une honte

    RépondreSupprimer
  5. Bonjour free-lance saucisse,
    J'essaye d'adapter une expression que j'ai trouvée sur le net sous le nom d'"Inertial bounce". Elle permet de rajouter des rebonds automatiques sur la position ou la rotation d'un calque.

    mp = .1;
    freq = 2.0;
    decay = 2.0;

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

    if (n == 0){ t = 0;
    }else{
    t = time - key(n).time;
    }

    if (n > 0){
    v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
    value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
    }else{value}

    On y retrouve la méthode numKeys dont tu parles plus haut.
    Voilà je cherche à adapter cette expression, j'aimerais que mon calque bounce non pas en fonction de sa propre rotation mais en fonction de la rotation de son parent ou d'un autre calque.
    J'ai essayé de mettre une variable avant la méthode numKeys, en vain.
    En fait j'aimerais que la méthode Numkeys ailles chercher les clés d'un calque autre que le sien.


    merci beaucoup a toi

    RépondreSupprimer