Aide pour After Effect, techniques, expressions.

mardi 25 mars 2014

Laissez-moi là

Bonjour à tous.

Cela fait très longtemps que rien n'a été écrit sur ce blog, non pas par manque d'envie, mais par manque de contenu. En effet, en général un article sort de terre quand un travail demande de trouver une nouvelle astuce. Et cela faisant donc longtemps que je n'avais pas du remettre un peu les mains dans le cambouis.

Je reviens donc avec une petite astuce pour, en quelque sorte, animer un lien de position.
En d'autre terme, c'est comme si on coupait un lien de parent-enfant entre 2 objets, mais uniquement pour la position.


L'idée est la suivante :
-suis la même position qu'un autre calque, plus un décalage spatial si nécessaire.
-Si on te dit de ne plus avoir ce lien, garde la dernière position que tu avais avant qu'on t'ait dit d'arrêter.

Voilà en gros comment faire :

On a 2 carrés, le rouge est le parent, le vert est l'enfant. Attention !! Il ne faut pas créer de lien de parenté !

Tout se passe donc sur le carré vert.
On rajoute à ce dernier un modificateur "Paramètre case", qui permet d'avoir une value intégrale (entière) de 0 (non) ou de 1 (oui). Appelons le "oui non".
Quand la valeur est égale à 0, le carré ne suivra pas, quand la valeur est égale à 1, il le suit.

On ouvre la position du carré vert, et c'est parti :

target=thisComp.layer("Parent");
I=effect("oui non")("Case");

"Case", c'est ainsi que j'ai nommé mon effet "Paramètre case".

Maintenant, on va chercher la clef "case" la plus proche de nous.

N=I.nearestKey(time);
Ni=N.index;

C'est assez simple, on a créé une autre variable Ni qui contient l'index de la clef la plus proche.

if ( N.time>time) { Ni=Ni-1};
Ngood=I.key(Ni);

Grace à ces 2 lignes, on fait en sorte que la clef la plus proche soit forcément celle qui soit derrière nous, c'est à dire dans le passé. Cela nous servira uniquement dans le cas où on souhaite recréer le lien de parent après l'avoir cassé.

Nt=Ngood.time;

Nt vaut donc la position de la clef "non" qui est juste derrière nous.

if ( I==1) { target.position + value }
else {
target.position.valueAtTime(Nt) +value }

Si I=oui, ajoute à ta positon la position du carré rouge.
Si I=non, ajoute à ta position la position du carré au moment où I t'as dit non.

REMARQUE : il faut mettre une clef "oui" ou "non" à l'image 0 de la composition, sinon ça bug.

Et voilà. C'est assez basique et écrit rapidement, je verrai comment cela peut être affiné.

9 commentaires:

  1. Bonjour Monsieur Saucisse,

    Tout d'abord, merci pour votre blog passionnant que je compulse depuis quelques mois déjà et oh surprise, je découvre avec plaisir la parution d'un nouvel article.

    J'en viens à mon tour à vous poser une question sur une expression que je n'arrive pas à écrire sans doute par manque de connaissance et qui fait appel à la 'trigolo' !

    voilà ma question : Comment 'raccorder' 2 périodes avec 2 sinus égaux avec chacun une fréquence différente ? Exemple :

    J'ai disons une première période time(1.48) avec une fréquence de 4 ce qui équivaut à un sinus de -0.48
    Pour ma deuxième période j'ai une fréquence de 6 ce qui équivaut à un sinus de -0.68 : toujours pour time(1.48)
    Comment raccorder ma deuxième période pour la faire démarrer à -0.48 à time(1.48) ?

    Si vous pouviez m'aider ou nous faire partager la solution, je vous en remercie beaucoup d'avance.
    Cordialement

    RépondreSupprimer
  2. La solution la plus simple qui me vient à l'esprit est d'ajouter une constante à la 2eme periode pour que ça colle au moment voulu.
    En l'occurence +0.2. Mais comme je ne sais pas ce que vous entendez par "raccorder 2 périodes", je ne sais pas si cette solution fonctionne dans votre cas.

    RépondreSupprimer
  3. Bonsoir Monsieur Saucisse,

    Merci pour votre réponse, je n'ai pas été assez explicite dans mon premier post et je m'en excuse d'avance. Je vais essayer d'être plus précis.

    Voilà l'idée :

    J'ai une première période avec une fréquence donnée (par exemple : 4) sin(4 * '1.48' * 2 * Math.PI);
    Le '1.48' est paramétrable via un paramètre glissière par ex. Donc dans ce cas, j'ai un sinus avec une valeur de -0.48.

    Après ma première période '1.48', j'applique une autre fréquence (par exemple : 6) ce qui me donne un sinus de -0.68.

    Donc, dans ma seconde période, comment faire pour faire coïncider ma courbe sinusoïdale dans la continuité de la première période.
    Quel est le décalage à calculer sachant que ma première période peut avoir une duréedifférente ?

    Voici une partie de l'expression :

    ============================================================================================
    ampl = 60 ; // amplitude en pixel
    decroi_Amplitude = 1.80; // facteur décroissance

    duree_initiale =2;

    freq_initiale =4;

    freq_secondaire = 6;

    UnTour = 2 * Math.PI;

    if (time >= inPoint)
    {
    if ((time - inPoint) <= duree_initiale)
    {

    // CALCUL AU CAS OU LE CALQUE NE COMMENCE PAS AU DEBUT DE LA COMPOSITION
    FractionTemps = UnTour - inPoint * UnTour * freq_initiale;

    u = ampl * Math.sin(freq_initiale * time * UnTour) + FractionTemps);
    ampl + u ;

    }
    else
    {
    FractionTemps = UnTour - inPoint * UnTour * freq_secondaire;

    u = ampl * Math.sin(freq_secondaire * time + ???? * UnTour) + FractionTemps ) * Math.exp(- decroi_Amplitude * ((time - duree_initiale) - inPoint)) ;
    ampl + u ;
    }


    }
    ==================================================================================

    J'ai mis en points d'interrogation la valeur à calculer pour que la courbe de la deuxième période démarre à la valeur du sinus de la première période.

    Merci de votre attention Monsieur Saucisse !

    Bien à vous !

    RépondreSupprimer
  4. Bonjour Monsieur Saucisse,

    je tiens à dire que ce dernier script de lien de parenté ne marche pas chez moi.
    J'ai pourtant été jusqu'a faire un copier/coller du vôtre, sur la position de l'objet enfant, équipé d'un paramètre Case, mais non.
    J'ai cru déceler ça et là des erreurs de syntaxes, si je ne m'abuse, du moins c'est ce qu'en dit certain message d'erreur (mon niveau reste bien en deça du vôtre, je tiens à le préciser), mais au final il me donne une erreur comme quoi la position 0, à la ligne
    Ngood=I.key(Ni);
    n'existe pas.
    J'avoue, je ne trouve pas mon erreur.

    Voilà , avec un calque parent "Bleu roi uni 1" et 3 clés de positions, et 1 clé de OUI, une autre de NON sur le calque enfant accompagné de cette expression sur la position:

    target = thisComp.layer("Bleu roi uni 1") ;
    I = effect("Case")("Case") ;

    N = I.nearestKey(time) ;
    Ni = N.index ;

    if ( N.time>time) { Ni=Ni-1} ;
    Ngood = I.key(Ni) ;

    Nt = Ngood.time ;

    if ( I==1) { target.position + value }
    else
    {
    target.position.valueAtTime(Nt) + value
    }


    Cordialement

    RépondreSupprimer
  5. En effet il y avait quelques fautes de frappe, c'est à présent corrigé.
    J'ai également rajouté une petite remarque, il faut mettre une clef "oui" ou "non" à l'image zero de la composition, sinon ça bug.
    Merci de me les avoir fait remarquer.

    RépondreSupprimer
  6. Super.
    Ca marche du tonnerre.

    Un grand merci.

    RépondreSupprimer
  7. Si j'ai bien compris le problème de phase entre les oscillations, voilà ma solution.
    En gros, il suffit de calculer la valuer de la 1ère oscillation à un moment T, la valeur de l'oscillation 2 au même moment, et de la soustraire à la 1ère oscillation.
    Voilà l'expression pour le calque qui change d'oscillation en cours de route sans saut :

    a=thisComp.layer("a").transform.position;
    b=thisComp.layer("b").transform.position;

    t=marker.key(1).time;

    b2=a.valueAtTime(t) - b.valueAtTime(t) + b;

    if ( time<t) { Px=a[1];}
    else { Px=b2[1] }

    [value[0],Px]


    c'est bien ça ?

    RépondreSupprimer
  8. Ici mon expression récupère juste la valeur sur Y, mais le principe est là.

    RépondreSupprimer
  9. Merci beaucoup !

    Le blog va t'il survivre à la marche du temps ? Beaucoup d'images gif manquent déjà à l'appel (snif).
    Je le souhaites, toutes ces explications m'ont permis de faire de très belles choses :)

    RépondreSupprimer