module inscription newsletter haut de page forum mobile

Rejeter la notice

formations etalonnage sur davinci resolve

Nos Formations Etalonnage avec Forest reviennent en octobre !
Adoptez une réelle méthodologie d'étalonnage professionnelle et atteignez vos objectifs créatifs avec nos formations intensives sur 3 jours
Toutes les infos
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
Rejeter la notice

Formation Lumière - Pratique Intensive du 14 au 16 octobre à Paris
Formez-vous avec cet atelier de pratique intensive dans des conditions exceptionnelles ! Formation finançable.
Toutes les infos

Ateliers et Formations

Expression : conversion point 3D en position 2D

Discussion dans 'Adobe After Effects' créé par HerrB, 25 Avril 2006.

Tags:
  1. HerrB

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

    voici une question pour les matheux et les as des expressions:
    Je vais essayer d'être clair, hum hum...

    je cherche une methode pour trouver automatiquement la position de l'axe central d'un calque( ou solid) 3d dans l'image 2D d'une caméra 3d de composition, en gros, convertir la position d'un element 3D sur un plan 2D (l'image obtenue par ma caméra AE), cela eviterait de faire un tracking de la compo et j'imagine pourrait être surement bcp plus précis.

    je mets une image pour être plus clair, vu que je n'ai obtenu aucune réponse de mon précédent post, ni même un embryon de piste :(

    voila en esperant que cela soit plus explicite (je cherche à obtenir les coordonnées du point 2D, en imaginant que cela soit le centre d'un calque 3D et non la cible de la caméra :) ) :

    [​IMG]

    Pensez vous que cela soit possible?
    Et cerise sur le gateau , obtenir distance de ce point 3d par rapport à la caméra pour obtenir un rapport d'echelle?

    Si quelqu'un a des pistes?

    Merci d'avance

    HerrB
     
    #1 HerrB, 25 Avril 2006
    Dernière édition: 3 Mai 2006
  2. HerrB

    Points Repaire:
    1 200
    Recos reçues:
    1
    Messages:
    232
    Appréciations:
    +0 / 0 / -0
    j'ai trouvé ça dans un vieux forum de 3D sur virtools, mais je n'ai pas assez de connaissance en expression et en math pour le traduire sous AE.

    XYZ are 3D coords of a point IN CAMERA REF
    xy are screen coords of the same point
    WH are width and height of the screen
    then we have:
    X=Z*tan(fov/2)*(2*x/W-1);//1
    Y=Z*tan(fov/2)*(H-2*y)/W;//2
     
  3. Sequelles

    Sequelles Modérateur
    Modérateur So

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

    Faire ça mathématiquement est trop compliqué !

    Heureusement il y a des expressions qui vont le faire à ta place. :bravo:

    Ce dont tu as besoin se trouve dans la catégorie Layer Space Transforms des expressions.
    Où tu pourras par exemple trouver toComp Pour convertir les coordonnés d’un point d’un calque dans le référentiel de ta composition (vu par la caméra s’il y en a une).

    Prenons par exemple un solide et tu t’intéresses à son centre. Si ce solide fait 400x300 pixels son centre vaut [200,150]. On donne la position de ce point dans le référentiel du calque dont l’origine est le coin en haut à gauche.

    Pour convertir ce point du référentiel calque vers le référentiel composition nous utilisons l’expression toComp. Pour utiliser les expressions de la catégorie Layer Space Transforms tu dois indiquer avant, de quel référentiel tu pars et dans la fonction, en paramètre, tu dois indiquer le point dont tu parles dans ce référentiel de départ.

    Donc ça nous donne :

    thisComp.layer("solide").toComp([200,150])

    Ce qui convertir le point de coordonnée [200,150] appartenant au calque qui s’appelle « solide » dans le référentiel Comp vu par la caméra.

    Bravo pour ton obstination! En cherchant par toi même et en revenant sur le forum reposer la question avec les résultats de tes recherches et une formulation super claire, ç'était bien motivant pour t’apporter la meilleur réponse que je pouvais donner. J’espère que ça va t’aider.
     
  4. Sequelles

    Sequelles Modérateur
    Modérateur So

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

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    Pour obtenir la distance entre deux point 3D, tu peux utiliser l’expression length(point1, point2) de la catégorie Vector Math.
     
  6. HerrB

    Points Repaire:
    1 200
    Recos reçues:
    1
    Messages:
    232
    Appréciations:
    +0 / 0 / -0
    Merci beaucoup Sequelles, je me disais bien qu'il devait bien y avoir une solution avec les expressions pour résoudre mon problème.

    Mais pour le rapport d'echelle, j'ai tenté d'adapter le script trouvé dans Motionscript mais ça ne semble pas fonctionner. J'ai beau changer le "facteur" et deplacer le layer "tracké", ça ne modifie pas la "size" je ne sais pas où ça coince.

    voilà mon script :

    factor = 2;
    cam = thisComp.layer("camera1");
    L = thisComp.layer("mon_layer_cible");
    d = length(cam.position,L.position);
    d1 = length(cam.position,L.position.valueAtTime(0));
    s=(d1/d)*factor;
    scale*s

    je ne connais pas la syntaxe de valueAtTime(0) , est ce que (0) est correct?

    Merci pour un dernier coup de main.

    Renny
     
  7. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    valueAtTime demande comme paramètre le temps en seconde.
    Là tu récupères donc la valeur à 0 seconde: à la première ilmage de ta comp.

    Je supose que tu veux parler d'expression, le script c'est autre chose
    voir ici pour info.

    Tu fais référence à quel tuto de chez http://www.motionscript.com/ ?
     
  8. HerrB

    Points Repaire:
    1 200
    Recos reçues:
    1
    Messages:
    232
    Appréciations:
    +0 / 0 / -0
    Euh oui , pour moi quelques lignes de codes s'apparentent à un "script", bien que je reconnaisse que cela signifie autre chose dans AE. Je tacherai de moins melanger les termes.

    Le tuto que j'ai repris, est celui indiqué dans ton lien "Layer Space Transforms", puisqu'il permettait déjà de récuperer une "distance" pour la convertir en "taille" pour un effet lens flare. Je me suis dit que je n'etais pas loin... Mais mon calque cible est pourtant présent à l'image 0, et cela ne donne rien alors que la distance entre ce calque et ma caméra se réduit, ce qui devrait donner une modification en "taille".

    Sinon pour info, je suis sur AE 6.5.1, si cela change quelque chose?
     
  9. HerrB

    Points Repaire:
    1 200
    Recos reçues:
    1
    Messages:
    232
    Appréciations:
    +0 / 0 / -0
    Mea culpa, j'ai trouvé l'origine de mon erreur , le script était bon, mais comme dans ma compo, c'est la caméra qui bouge et non le calque, il etait normale que ma valeur d1 soit identique à la valeur d. J'ai donc inversé le paramètre valueAtTime sur la camera et tout est rentré dans l'ordre.

    Derniere question: Mon calque cible n'étant pas toujours à la taille 100% ,mais des fois plus petit, ça change le ratio de positionnement du même coup. Où devrais je mettre le ratio de taille dans le script de tracking?

    thisComp.layer("calquecible").toComp([x,y]) ??

    Pour m'aider à débugger, j'ai mis le resultat de mes valeurs dans un calque texte pour comprendre ce qui se passait, c'est bien pratique, comme un inpecteur de variable, mais est ce qu'il existe des outils de débuggage dans AE?

    +

    HerrB
     
  10. Sequelles

    Sequelles Modérateur
    Modérateur So

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

    Pourrais-tu me dire ce que tu veux faire avec les expressions parce que je n'ai toujours pas compris. :(
     
  11. HerrB

    Points Repaire:
    1 200
    Recos reçues:
    1
    Messages:
    232
    Appréciations:
    +0 / 0 / -0
    Hum desolé, si je ne suis pas plus clair.

    Pour exemple, j'ai monté une composition 3d dans AE, avec des calques comprenant des formes vectorielles dessinées dans Illustrator. Tout ça bouge dans tous les sens dans la compo . Ensuite je voudrai "coller"sur certains dessins vectorielles ,des indications textuelles (contenu dans un calque Texte par ex), qui soient toujours face à la caméra et à l'horizontale.
    Je me suis dit qu'il etait surement plus simple de garder ces calques d'indications en 2D, et simplement "tracké" l'élement 3D cible sur lequel je veux attacher l'indication.

    Je sais que l'on peut garder un calque 3D toujours orienté vers la caméra, mais ça le tourne dans n'importe quel sens pour le maintenir face à la caméra. Je pense donc que la solution de garder les "calques d'indication texte" en 2D est la solution la plus simple et la plus souple, si l'on a la solution via les "expressions"...

    Si ça n'est pas assez claire, j'enverrai une compo zippé.

    Merci encore Sequelles.
     
  12. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    Donc l'expression pour convertir le point 3D vers la Comp marche. Mais tu veux que l'échelle de ton calque 2D varie pour reproduire l'éloignement par rapport à la caméra ?
    voilà:
    Code:
    positionCible = thisComp.layer("mon_layer_cible").position;
    positionCam = thisComp.layer("camera1").position;
    zoomCam = thisComp.layer("camera1").zoom;
    facteurZoom = zoomCam/length(positionCible, positionCam);
    scale*facteurZoom
     
  13. HerrB

    Points Repaire:
    1 200
    Recos reçues:
    1
    Messages:
    232
    Appréciations:
    +0 / 0 / -0
    A vrai dire la fonction "scale" fonctionne, mais c'est le positionnement qui ne marche plus lorsque le calque 3D "cible" n'est pas à une taille de 100%.

    Il me semble que "l'expression de repositionnement", qui suit un pixel defini en x et y, ne tient pas compte de l'eventuel redimensionnement de ce pixel.

    Si vous avez une piste pour m'indiquer où je pourrai mettre un pourcentage de taille dans l'expression, ça serait bien aimable... :)

    Mais en attendant, je vais refaire mes tests avec ton expression, merci Sequelles.
     
  14. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    Si tu modifies l'échelle du layer_cible et que tu veux que ça affecte l'échelle du calque qui le suit, quelle transformation d'échelle du layer_cible récupérer, x,y ou z ?
    En utilisant que le x:
    Code:
    positionCible = thisComp.layer("mon_layer_cible").transform.position;
    positionCam = thisComp.layer("camera").transform.position;
    zoomCam = thisComp.layer("camera").cameraOption.zoom;
    facteurZoom = zoomCam/length(positionCible, positionCam);
    transformCible = thisComp.layer("mon_layer_cible").transform.scale[0]/100;
    scale*facteurZoom*transformCible
     
    #14 Sequelles, 6 Mai 2006
    Dernière édition: 6 Mai 2006
Chargement...

Partager cette page