module inscription newsletter haut de page forum mobile

Rejeter la notice

ateliers live resolve avec forest

Ateliers Live Resolve - Formez-vous en ligne tous les mois avec Forest !
Faites rapidement évoluer la qualité de vos étalonnage avec nos ateliers mensuels de 3h.
Toutes les infos

Ateliers et Formations

Lançons-nous dans le scripting !

Discussion dans 'Adobe After Effects' créé par Sequelles, 5 Avril 2006.

Tags:
  1. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    Le script ça fait peur mais j’y vais quand même.:help:

    Pour commencer on doit lire ça : http://www.nabscripts.com/Scripts/index.htm

    Ensuite on peut lancer ExtendScript Toolkit. Ce qui permet de tester le script.

    Mais je n’ai toujours pas trouvé d’info sur ce logiciel et je ne comprends toujours pas comment utiliser ni à quoi sert la fenêtre Explorateur de données. On aurait bien besoin d’une bibliothèque référençant comment appeler telle ou telle chose.

    Un script peux commencer par des petites infos, nom du script et commentaire en les faisant précéder de //

    Ensuite les ennuis commencent...

    Pour faire ça bien

    Il faut que les actions du script soit entre { } . Ce qui permet que toutes les variables créées pour le script ne continuent pas d’exister après.

    Il faut créer une possibilité d’annulation global du script : tout ce qu’il fait doit être encadré par app.beginUndoGroup("nom du script") et app.endUndoGroup()

    Et couramment le script doit utiliser des informations provenant de ce qui est sélectionné dans le projet.

    app.project vaut 1 si un projet est ouvert et 0 s'il n’y a pas de projet ouvert (mais dans la version 7 a priori After Effects ne peut plus être ouvert sans projet)

    !app.project donne l’inverse, s’il n’y a pas de projet d’ouvert ça vaux 1.
    if (condition)
    exécution si la condition est vérifiée, c'est-à-dire si le condition = 1
    else
    exécution si la condition n’est pas vérifiée, c'est-à-dire si le condition = 0

    Donc un premier test peut ressembler à ça :

    Code:
    if (!app.project) 
      alert("Il n’y a pas de projet ouvert");
    else
      alert("Il y a un projet d’ouvert");
    Une fois que l’on est assuré qu’un projet est ouvert, c'est-à-dire que app.project existe, on va voir ce qui est sélectionné dans ce projet au moment du lancement du script.

    Voilà, j’arrête là pour l’instant. La seule personne faisant des scripts pour After Effects ici c’est nab17connection. Est-ce que tu pourrais m’accompagner progressivement pour rédiger un premier script.

    Pour mettre tous ça en pratique j’ai une proposition : créer un script pour faire une moyenne de plusieurs Point de suivi. Je sélectionnerais mon calque et le script récupèrerait tous les points de suivi de la première piste Suivi 1 pour en faire une moyenne.
     
  2. bildebool

    Points Repaire:
    1 450
    Recos reçues:
    0
    Messages:
    940
    Appréciations:
    +0 / 1 / -0
    Salut sequelles, je te suis ! Bon personnellement, moi aussi ça me fait peur !
    Je sais pas si je serais à votre niveau (en tout cas du tiens et de celui de nab) mais je vais bien relire comme il faut son nabscript et essayer tant bien que mal de comprendre...

    Sinon pour ta premiere idée de moyenne de points suivis, dans quelles situations imagines tu ce script ? Stabiliser un mouvement de cam par exemple ? (j'espere que je ne dis pas n'importe quoi...)

    Bill

    PS : ce qui m'inquiete surtout c'est " Néanmoins, le langage des scripts est un langage beaucoup plus riche que celui des expressions" -> vu sur nabscript
     
  3. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    Je crois que pour pouvoir apprendre quelque chose il faut en avoir besoin.

    nab a développé beaucoup de script sur les masques.
    Les masques dans After Effects, ça fait partie des outils de bases. Mais leur accessibilité évolue lentement. Au cours des différentes versions d'After Effects on a pu créer plusieurs masques par calque, utiliser des modes entre eux. Et les fonctions tracé automatique et créer des silhouette sont apparues. Mais pour aller plus loin il faut utiliser les scripts.

    Le tracking, contrôles de suivi (en vf), pourrait être un autre champ d’application des scripts pour palier au manque de développement de l’application :
    Quand on utilise cet outil on ouvre une nouvelle propriété dans le calque qui s’appelle « Suivis de cible ». A l’intérieur de cette propriété on enregistre des informations à l’intérieur des pistes de Suivi qui peuvent elles même contenir plusieurs Point de suivi.

    Le tracking dans After Effects est souvent critiqué.
    Dans le cadre d’une stabilisation, la solution classique pour améliorer le résultat est de faire plusieurs stabilisations dans des compositions successives. Mais on vient de voir que l’on pouvait créer plusieurs points de suivi dans la même piste de suivi. Cette possibilité est utilisée par After Effects pour les suivis en rotation et échelle (2 suivis) ou le suivi quatre points (4 suivis). Mais on peut créer autant de points de suivi que l’on veut à l’intérieur de cette piste mère « Suivi ». On peux ensuite les utiliser grâce à une expression, ou mieux un script (c’est le sujet ici) pour faire un tracking multipoint et faire une moyenne entre tous ces suivi pour obtenir directement un meilleur résultat. .
     
  4. nab17connection

    Points Repaire:
    1 900
    Recos reçues:
    1
    Messages:
    1 051
    Appréciations:
    +0 / 0 / -0
    ah l entrée en matière, enorme ! :D Bill et Sequelles les "GI du script"

    bon ben ok, c est une super idée, par contre je prefere vous le dire tout de suite, c est pas un script dans la categorie "facile". Si tu comprends ce script là, tu pourras quasiment scripter ce que tu voudras apres (le jeu en vaut donc la chandelle).
    Il est plutot "difficile", mais à l'avantage d etre tres complet.

    Comment procede t on pour les explications ? Faut que je prepare une sorte de tutorial ou par des messages ici ?
     
  5. bildebool

    Points Repaire:
    1 450
    Recos reçues:
    0
    Messages:
    940
    Appréciations:
    +0 / 1 / -0
    Bon alors personnellement je preferes que tu mettes Sequelles PUIS bill en petit parcque j'ai du mal à assimiler tes premieres pages du scripting guide by Nab !

    Sinon pour l'idée de sequelles, c'est vrai que là d'emblée je vois pas du tout par où on doit commencer !

    Enfin je ne penses pas que tu doives faire un nouveau tut, je pense qu'on devrait y aller petit à petit ici...
    L'avis de sequelles me semble plus important que le mien je le nomme membre actif de ce post :D

    Bill

    PS : juste une question en passant : une sorte de script qui permettrait d'exporter les differentes comp avec les parametres etc depuis AE7 puis un script qui "comprendrait" tout ça pour ramener le tout dans AE65 c'est réalisable ou c'est purement fantastique ?
     
  6. l-o

    l-o

    Points Repaire:
    1 000
    Recos reçues:
    0
    Messages:
    478
    Appréciations:
    +0 / 1 / -0
    par certains qu'une moyenne permette d'approcher un meilleur résultat au contraire je dirais que çà aurrait tendance à empirer les choses à mon avis faut plus chercher du coté de la trigonométrie.
     
  7. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    Faire une moyenne de plusieurs points de suivis marche bien je l'utilise de temps en temps. En général je bricole une expression vite fait au coup par coup, j'utilise en plus le degré de confiance pour pondérer la moyenne.

    Bon je continue mes petits travaux sous le regard bienveillant de nab.

    Je pose plusieurs questions :

    Est-ce que l’on peut commencer par écrire le script par le début et progresser au fur et à mesure ou est-ce qu’il y a une autre approche ?

    Est-ce que pour ce script il faut définir au préalable des fonctions comme je le vois dans beaucoup de tes scripts ?

    On peut sans doute faire l’impasse sur le if (app.project).

    Pour l'instant j'ai réussi à afficher la valeur du Point d'attache :approb:
    Code:
    //areuh areuh bébé script
    app.beginUndoGroup("monScript");
    //pour l'instant ça sert à rien le script ne fait rien à annuler
    {
    var myComp = app.project.activeItem;
     if (!myComp  || !(myComp instanceof CompItem))
     alert("Vous devez sélectionner le calque contenant le suivi")
    //en fait rien n'est sélectionné au niveau du projet ou ce qui est sélectionné n'est pas une composition 
     else {
      var mySelectedLayers = myComp.selectedLayers;
       if (mySelectedLayers.length != 1)
       alert("Vous devez sélectionner le calque contenant le suivi");
       else {
        var myTracker = mySelectedLayers[0].property("Motion Trackers");
         if (myTracker.numProperties == 0)
         alert("Le calque ne contient pas de données de suivi")
         else{
          var myTrackPoint = myTracker.property(1).property(1).property(6).value;
          alert(myTrackPoint);
          }
         }
        }
    }
      
    app.endUndoGroup();
    
     
  8. nab17connection

    Points Repaire:
    1 900
    Recos reçues:
    1
    Messages:
    1 051
    Appréciations:
    +0 / 0 / -0
    Salut,

    pour se fixer les idées et pour que tout le monde voit bien de quoi on parle, voila ce qu'on veut obtenir:

    [​IMG]

    ---

    oui on va le faire dans l'ordre, et pas la peine d ecrire de fonction pour celui-ci (on y va direct)

    pourquoi faire l impasse, c'est mieux de faire "propre", car si par hasard dans deux mois tu lances le script sur la 6.5 par exemple, sans avoir de projet ouvert (en te disant qu'il y a une palette qui va s afficher), ca va planter.

    De mon coté j'ai ecrit le script, ca marche bien :) , je vais me baser sur ce que j ai ecrit pour les explications (plutot que de corriger ce que tu as commencé à scripter).

    Je donne le début pour le moment...

    préambule
    _Dois-je avoir une Interface Utilisateur ?
    non là c'est pas vraiment utile, pas de parametres a preciser.... donc on s'en passera
    _De quelles informations ai-je besoin ?
    des coordonnees du "Centre de la fonction" et du "Point d'attache" de chaque "Points de piste" sélectionnés...et cela pour chacune des images clés du Suivi.
    _Comment y accéder ?
    un des moyens peut etre de forcer l'utilisateur à selectionner les "Points de piste" dont il souhaite faire la moyenne. Tant que cela n'est pas fait le script ne fera rien.
    on regardera si au moins deux "Points de piste" sont selectionnés (c est le minium pour faire une moyenne)
    _Et ensuite ?
    de calculer la moyenne avec une formule de type "LaSommeDesPoints / NbDePoints".
    et enfin de créer un nouveau "Point de piste" pour lui appliquer ces donnees.

    phase 1
    On commence par ouvrir une accolade (attention il faut la mettre au tout debut, et non pas apres app.beginUndoGroup...on englobe tout le script avec un paire d accolade) et on verifie qu'il y a un projet et une comp active (une comp est automatiquement activee lorsqu un calque (ou une propriete) est sélectionné.

    [​IMG]

    ce qui veut dire:
    si le projet ("app.project") n'existe pas message d'alerte - dans un "if (maCondition) {mesInstructions}", "mesInstructions sont evaluées si et seulement si maCondition est vérifiée (si elle vaut TRUE ou n'importe quoi different de 0 ou null). Le point d'exclamation indique une négation de ce qui suit. Cette notation ne doit pas faire peur, il n'y a rien de compliquer la dedans. On aurait pu aussi ecrire : if (app.project == null) alert(...)".
    ensuite on verifie pour l element actif (notre composition normalement)....si pas d'element actif ou si cet element actif n est pas une comp, message d alerte

    On doit verifier maintenant qu'un calque a bien été sélectionné (il doit etre selectionné automatiquement si l'utilisateur a sélectionné ses "Points de piste"). L'ensemble des calques selectionné dans la comp est indiqué par "selectedLayers" (il s'agit d'un tableau).
    Donc si ce tableau ne contient pas exactement un élément (si sa taille "length" n'est pas égale à 1) alors message d'alerte.

    [​IMG]

    Le but de ces verifications est d'amener l'utilisateur dans la bonne direction pour se servir correctement du script, s'il fait de mauvaises manips on doit le guider.
    A partir de là on sait qu on a un projet ouvert, que la composition est active et qu'on a un calque de selectionner. On peut poursuivre.

    phase 2
    on recupere dans des variables le calque selectionné et le groupe de proprietes "Suivi de cible".
    comme on l'a vu "selectedLayers" représente un tableau contenant tous les calques selectionnnés; à l'index 0 se trouve le premier calque selectionné, donc ici il s'agit de notre unique calque selectionné

    [​IMG]
     
    #8 nab17connection, 6 Avril 2006
    Dernière édition: 6 Avril 2006
  9. nab17connection

    Points Repaire:
    1 900
    Recos reçues:
    1
    Messages:
    1 051
    Appréciations:
    +0 / 0 / -0
    phase 3
    On va maintenant aller chercher les "Points de piste" sélectionnés et on va les stocker dans un tableau. On declare un nouveau tableau avec l instruction "new Array()" (Array signifie tableau en anglais). Un tableau possede un attribut "length" qui indique la taille du tableau (i.e. son nb d elements ou sa dimension). Pour remplir un tableau, on peut se servir de cet attribut en ecrivant "Tableau[Tableau.length] = Element", ce qui signifie qu on crée une nouvelle "case" dans laquelle on place l'Element (donc à la derniere position du Tableau ). Cette technique est à connaitre, elle est utilisée dans tous les scripts manipulant des tableaux.

    [​IMG]

    on fait une premiere boucle sur toutes les proprietés du groupe "Suivi de cible", et une deuxieme boucle sur toutes les propriétés des sous-groupes "Suivi xx".
    Si le "Point de piste" a ete selectionné (xxx.selected == true), on le stocke dans le tableau selectedTrackPoints (tjs en derniere position pour ne pas effacer les precedents...qd on en ajoute 1 nouvel élément, alors xxx.length augmente d'1 aussi...on remplit petit a petit le tableau)
    numProperties nous indique le nombre de propriété que comporte un "groupe de propriétés", comme ici le groupe principal "Suivis de cible" ainsi que pour chacun de ses sous-groupes "Suivi xx". Meme si nous on suppose que l'on n'aura qu'un seul "Suivi", il faut traiter cela de facon générale et passer au travers de toutes les propriétés (si tu as d' autres suivis sur le calque, pas de pb car le script ne calculera qu'à partir de ceux que tu as sélectionnés).

    phase 4
    On verifie que l'utilisateur a bien selectionné au moins deux "Points de piste". La longueur de notre tableau contenant les "Points de piste" selectionnés doit etre superieure ou egale à 2, si ce n'est pas le cas messsage d alerte.

    [​IMG]

    le reste un peu plus tard ... en fonction de vos commentaires/questions sur le début ;)

    si vous y mettez un peu du votre mais que vous avez qd meme l'impression que je parle "chinois", il faut le dire sans etre géné ! (je suis un gars super relax, je ne vais gronder personne :lol: ). On est là pour rendre les choses plus accesibles et les rendre comprehensibles pour le plus grand nombre; donc on y va au rythme que vous voulez ...il vaut mieux bien seller son cheval avec de partir en randonnée ;)
     
    #9 nab17connection, 6 Avril 2006
    Dernière édition: 6 Avril 2006
  10. bildebool

    Points Repaire:
    1 450
    Recos reçues:
    0
    Messages:
    940
    Appréciations:
    +0 / 1 / -0
    Nan mais attendez là c'est pas possible on peut pas faire plusieurs phases d'un coup !!

    Bill
     
  11. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    uberTrack

    Je comprends que le tableau selectedTrackPoints stocke tous les points de suivis sélectionnés, donc chaque case du tableau contient tous les paramètres de l'objet Point de suivi, c'est un tableau de dimension 7 (il y a 7 paramètres), et ces paramètres peuvent être des valeurs de dimension 1 ou 2.

    Au final il faudrait mieux créer un nouveau Suivi contenant le Point de suivi moyen, c'est plus pratique pour l'appliquer avec la palette contrôle de suivi qui ne peut utiliser que le premier Point de suivi (sinon il faut replacer le suivi moyen en haut de la pile)

    Par rapport à ce que j'ai dis au message #7 sur l'utilisation du degré de confiance ce n'est pas vraiment une bonne façon de l'utiliser. Mais il doit y avoir un moyen de s'en servir, il faudrait par exemple une note globale (la moyenne du degré de confiance sur toutes la duré) pour donner un poids à chaque point. Mais quand ce script sera fait je pense qu'on l'on pourra réfléchir à des moyens plus performants qu'une simple moyenne.

    La cas le plus simple c'est quand tous les points suivis reste positionnés de le même façon les uns par rapport aux autres. Ca se complique si les points appartiennent à quelque chose qui tourne ou qui change de taille. Mais si ça se déforme il ne faut pas utiliser cette méthode.

    L'application la plus orthodoxe pour le moyennage des points de suivis et la stabilisation d'un problème de fixité de caméra (film) ou de fixité d'un mauvais télécinéma. Mais on poura l'appliquer à d'autre cas particulier.
     
    #11 Sequelles, 6 Avril 2006
    Dernière édition: 6 Avril 2006
  12. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    Voilà où j'en suis:
    Code:
    {
    var myComp = app.project.activeItem;
    if (!myComp || !(myComp instanceof CompItem))
    alert("Il n’y a pas de composition active")
    else {
    	if (myComp.selectedLayers.length != 1)
    	alert("le calque contenant le suivi n'est pas sélectionné")
    	else {
    		var myLayer = myComp.selectedLayers[0]
    		var myTrackerGroup = myLayer.property("Motion Trackers");
    		var selectedTrackPoints = new Array()
    		for (var i = 1; i <= myTrackerGroup.numProperties; i++) {
    			var theTracker = myTrackerGroup.property(i);
    			for (var j = 1; j <= theTracker.numProperties; j++) {
    				var theTrackPoint = theTracker.property(j);
    				if (theTrackPoint.selected == true)
    				selectedTrackPoints[selectedTrackPoints.length] = theTrackPoint;
    				}
    			}
    		var nbPoints = selectedTrackPoints.length;
    		if (nbPoints < 2)
    		alert ("Vous devez sélectionner au moins deux Point de suivi.");
    		else {
    			alert("le reste un peu plus tard ... ")
    			}
    		}
    	}
    }
    
     
  13. nab17connection

    Points Repaire:
    1 900
    Recos reçues:
    1
    Messages:
    1 051
    Appréciations:
    +0 / 0 / -0
    OK tres bien..on continue alors

    On a donc au moins deux "Points de piste" sélectionnés.

    On declare maintenant plusieurs tableaux qui nous sevriront plus tard pour stocker des donnees. le "CF" indique "Centre de la Fonction" et le "PA" le "PointdAttache".

    [​IMG]

    On va maintenant aller récuperer pour chacun des "Points de piste", les deux propriétes qui nous interessent : "Centre de la fonction" et "Point d'attache". Elles sont placées en 1ere et 6e position parmi les proprietes d'un "Point de piste".
    Nous declarons egalement une variable isOK qui nous servira plus tard lors de verifications.

    [​IMG]

    On va faire d'autres verifications qui vont en apparence compliqué les choses, mais on est là pour faire les choses proprement et essayer de gerer les evenements qui peuvent arriver.
    Nous allons devoir verifier si les "Points de piste" ont bien le meme nombre d'images clés, et si elles coincident bien (commencent en meme temps et finissent en meme temps).
    Si les proprietes possedent au moins une image clé , alors on va memoriser dans les tableaux (meme technique que plus haut..avec "length") le nombre de clés, l'instant de debut et l instant de fin.
    Si ces proprietes ne sont pas animées (un etourdi qui n aurait pas lancer le tracking par exemple), i.e. aucune image clé, alors message d alerte et le "isOK devient "false" (cela nous sert de 'drapeau' pour savoir si il y a eu une casse en route ...)

    [​IMG]

    ps: Sequelles, j ai rajoute une ligne en fin de script pour faire remonter le nouveau Point de piste en 1ere position si c'est mieux (cf gif animé pus haut).
     
  14. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    1-
    Les coordonnés qui nous interresses sont celles du Point d'attache (on ne se sert pas du Centre de la fonction)

    2-
    Il ne faut pas faire ça. Un Point de suivi n'a pas forcément des images clés partout quand on choisit d'Extrapoler le mouvemenent dans les options. Ce qui nous interresse c'est les coordonnés du Point d'atttache à chaque image.

    3-
    Le plus pratique selon moi est de créer un nouveau Suivi contenant le Point de suivi moyen. Si c'est possible.
     
  15. nab17connection

    Points Repaire:
    1 900
    Recos reçues:
    1
    Messages:
    1 051
    Appréciations:
    +0 / 0 / -0
    ...
    si isOK a passé le cap , on doit maintenant faire les verifs mentionnées plus haut...
    c'est pas tres joli , y a beaucoup de "ou" || (en plus j'ai tassé pour que ca rentre sur une image pas trop grande).
    Il y aura donc un message d'erreur si l'une des proprietes ne comporte pas le meme nb de clés, ou si elles sont décalées dans le temps (on les compare toutes par rapport au premier Point).
    On maintient à jour le isOK pour recuperer une eventuelle anomalie. Si c'est le cas on utilise l'instruction "break" qui sert à interrompre la boucle dans laquelle on se trouve. En d autres termes, si le script repère un point qui ne respecte pas les consignes (des clés en trop par exemple), on stoppe la boucle, cela ne sert a rien d aller checker les autres Points.

    [​IMG]

    Le "vrai" script commence ici ...

    si isOK a encore une fois franchi le cap (si sa valeur est TRUE), on déclare 3 tableaux: le premier pour stocker les valeurs du "Centre de la fonction", le second pour celles du "Point d'attache" et le dernier pour les instants des images clés.

    [​IMG]

    Maintenant pour toutes les images clés situées en la premiere et la derniere clé (qu on a memorisees dans nos tableaux plus haut) , on va calculer la somme des valeurs. La somme pour le "Centre de la fonction" et la somme des valeurs du "Point d'attache". Ce sont des proprietes de dimension deux, c'est pourquoi on initialise "centre" et "attache" comme des tableaux 2D (remplis aves des zéros au debut).
    Une fois que la somme est calculee, nous devons la diviser par le nombre de points qu on avait selectionnés.
    Le tableau "myKeysTime" sert à memoriser l instant des clés (ca facilitera pour l'etape suivante - la dernière- ...).

    note: le " t += xxx" à la fin de la boucle "for" indique que "t" va augmneter de "myComp.frameDuration" à chaque iteration ("sauter d'image en image").

    [​IMG]

    Voila on a quasiment fini, nous avons tout ce qu'il nous faut :)
    La derniere étape consistera a creer le nouveau "Point de piste" et lui attribuer les valeurs
    que l on a memorisées.
    Ce sera donc le coeur du script, là ou il commencera à agir concretement sur le projet.

    Un peu plus tard pour vous laisser le temps :cool:

    ps: Sequelles je n avais pas lu ton message et je n en ai pas tenu compte dans mon message. Je dois partir de chez moi, je suis à la bourre a++ :D

    EDIT: le " + 0.001" dans la boucle for sert à ne manger la derniere image clé; si on n ajoute pas cela (ou une autre une petite valeur), la derniere clé ne sera pas correctement affectée.
     
    #15 nab17connection, 6 Avril 2006
    Dernière édition: 6 Avril 2006
Chargement...
Discussions similaires - Lançons scripting
  1. geoay
    Réponses:
    1
    Nb. vues:
    898

Partager cette page