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
Rejeter la notice

Nouvelle Formation Prise de son : les inscriptions sont ouvertes !
Maîtrisez la qualité de vos prises de son avec notre formation théorique et pratique de 3 jours ! Du 14 au 16 mai 2024 à Paris.

Un bug dans Layer Space Transforms (toCompVec ou toWorldVec)

Discussion dans 'Adobe After Effects' créé par Sequelles, 5 Août 2006.

Tags:
  1. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 260
    Appréciations:
    +2 / 13 / -0
    Dans les expressions, toCompVec ou toWorldVec, permet de convertir un vecteur de l’espace calque vers l’espace Comp ou World. Ca marche bien pour l’orientation mais si l’on change l’échelle du calque ça marche à l’envers. Par exemple le vecteur [100,0] d’un calque qui subit uniquement une transformation d’échelle de 200% en x le vecteur résultant devrait être [200,0] mais le résultat donné est [50,0] ! :col:
     
  2. nab17connection

    Points Repaire:
    1 900
    Recos reçues:
    1
    Messages:
    1 051
    Appréciations:
    +0 / 0 / -0
    Je ne pense pas que cela soit un bug mais je vais avoir un peu de mal à donner une explication claire. Je sais que tu ne me jetteras pas des cailloux au visage alors je tente :D :

    Prenons le vecteur [1,0] de l'espace Calque.
    Le calque a par défaut une échelle en x de 100%. Dans l'espace World (ou Comp), ce vecteur est vu comme [1,0]. C'est sa référence on va dire.

    Modifions l'échelle en x, passons là à 200%.
    Pour le World, c'est comme si la base du repère Calque était maintenant représentée par des vecteurs de norme 2 (et non plus 1). Le vecteur [1,0] dans l'espace Calque ne représente donc plus que la moitié ! :)

    Le résultat est donc normal. C'est à toi de reformuler le truc pour retomber sur tes pieds.
    En faisant ma ptite investigation, je suis arrivé sur cette expression, bon pas trop testée c est du "sur le pouce" :lol:

    Crée un solide Blanc puis crée un calque texte et mets lui ca dans le bec:
    Code:
    theLayer = thisComp.layer("Blanc uni 1");
    x = Math.pow(theLayer.scale[0]/100,2);
    if (x == 0) res = 0; else res = theLayer.toWorldVec([x,0,0]);
    
    modifie l'échelle en x, le texte devrait t afficher le "bon vecteur". (note: j ai mis un "if" pour eviter le cas foireux d une echelle à 0% (matrice non inversible donc erreur de AE)).

    Peut etre que ma démonstration de grenier ne te convient pas vraiment (et je comprendrai :lol: ), auquel cas si tu veux je pourrais en parler sur AE Enhancers, et je pense que Dan (ou un autre) se fera un plaisir de donner son point de vue sur la question.
     
  3. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 260
    Appréciations:
    +2 / 13 / -0
    Je ne comprends pas trop ce que tu veux dire. En tous cas ça ne fait pas ce que ça devrait faire: si ça réinterprette le vecteur selon la norme modifiée du calque, ça sert à rien au niveau de la conversion d'un espace dans un autre.:col:
    Du coup je continue à croire que c'est une erreur de chez Adobe. Surtout que les expressions toComp ou toWorld fonctionne parfaitement au niveaux des points.

    Donc si on a besoin de convertir un vecteur d'un espace calque vers un espace Comp ou World (avec des modifications d'échelle) le plus simple est de se rabatte vers les Layer Space Transforms classique au niveau des points:
    (exemple de conversion vers Comp du vecteur [100,100])
    Code:
    theLayer= thisComp.layer("Blanc uni 1");
    P0 = theLayer.toComp([0,0]);
    P1 = theLayer.toComp([100,100]);
    P1-P0
    theLayer.toCompVec([100,100]) aurait du permettre de le faire directement
     
  4. nab17connection

    Points Repaire:
    1 900
    Recos reçues:
    1
    Messages:
    1 051
    Appréciations:
    +0 / 0 / -0
    je pars en vacances demain soir et tu veux m'empecher de dormir dans l'avion, c'est ca hein ! :D

    toComp(B)-toComp(A) ne peut (doit) pas se traduire par toCompVec(B-A) (bien que cela puisse paraitre naturel je suis d'accord avec toi)

    Deuxieme tentative d'explication à posteriori du résultat que AE nous sort:
    (les vecteurs sont en gras)

    layer 100%:
    u = x i+ y j, avec ||i|| = ||j|| = 1 (pixel)

    layer 200%:
    u = x' i' + y' j', avec ||i'|| = ||j'|| = 2 et i' = 2 i, j' = 2 j (c'est là où se passe le binz à mon avis)
    donc u = 2x' i + 2y' j

    cas particulier: u = [100,100] dans le calque d'origine
    u = 100 i + 100 j = 2x' i + 2y' j
    d'où 2x' = 100, 2y' = 100
    => x' = 50, y' = 50 .
    on a donc u = 50 i' + 50 j'
    (i',j') étant le repère du layer vu par l'espace Comp.
    conclusion: [50,50] = layer.toCompVec([100,100])

    autre cas particulier: layer 0%
    u peut s'exprimer comme n'importe quelle combinaison de vecteurs puisque la nlle base du repère est formée de vecteurs nuls ("n'importe quoi*0 = 0").
    la methode toCompVec ne peut donc pas agir sur un tel calque, c est pourquoi AE envoie un message d'alerte.

    edit: je suis tombé sur ce lien qui evoque plus ou moins le sujet Adobe - GroupBrowser
     
    #4 nab17connection, 9 Août 2006
    Dernière édition: 9 Août 2006
  5. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 260
    Appréciations:
    +2 / 13 / -0
    On peut en effet trouver une explication logique pourquoi ça donne ce résultat. Mais ça ne change rien au fait que les expressions de la catégorie Layer Space Transforms doivent convertir des points ou des vecteurs entre les différents espaces (c'est ce qui est annoncé dans la doc) et que les toCompVec et toWorldVec en fonctionnant de la façon que tu as brillamment analysée et décortiquée perde de leur intérêt. Ils ne peuvent pas servir quand on a un changement d'échelle, leur résultat ne sert plus à rein.

    Les vecteurs dans les expression sont du genre [x,y,z], avec des coordonnées. Coordonnés que l'on interprète comme la multiplication des vecteurs unitaires.
    Mais on peux aussi se les représenter comme les vecteurs identiques au vecteur allant du point [0,0,0] au point [x,y,z], d'ou l'expression
    Code:
    A = theLayer.toWorld([0,0,0]);
    B = theLayer.toWorld([x,y,z]);
    B-A
    Pour remplacer toWorldVec qui ne donne pas la conversion d'un vecteur de l'espace calque vers l'espace World quand l'échelle du calque est modifiée.
    ou
    Code:
    A = theLayer.toComp([0,0,0]);
    B = theLayer.toComp([x,y,z]);
    B-A
    pour remplacer toCompVec qui ne donne pas la conversion d'un vecteur de l'espace calque vers l'espace Comp quand l'échelle du calque est modifiée.
     
  6. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 260
    Appréciations:
    +2 / 13 / -0
    Je reviens la dessus car j'ai vu ça sur le site de Dan Ebberts
    Code:
    if (toCompVec([0, 0, 1])[2] > 0 ) 1 else 2
    qui permet de savoir si l'on voit la face avant ou arrière d'un calque.
    ou
    Code:
    toCompVec([0, 0, 1])[2]>0?1:2
    ;-)

    Ça marche très bien mais je comprend pas du tout. Comp est donc un espace à 3 dimensions alors que je croyais que c'était l'espace en 2D de l'image finale.:confused::confused::confused:
     
    #6 Sequelles, 14 Mai 2008
    Dernière édition: 15 Mai 2008
  7. nab17connection

    Points Repaire:
    1 900
    Recos reçues:
    1
    Messages:
    1 051
    Appréciations:
    +0 / 0 / -0
    Je serais étonné que "ça marche très bien" écrite comme ça avec une parenthèse en trop :bigsmile: (aère ton code nomdediou au lieu d'écrire en patte de mouche comme un médecin :D ).

    Je ne vois rien d'étrange là dedans, le calque est en 3D, tu passes un vecteur 3D, et tu demandes à le convertir dans l'espace vu par la caméra active.
    Dan utilisait toCompVec dans son exemple car l'opacité devait être déterminée en fonction de la caméra. Si on ne souhaite pas se préoccuper de la caméra, je pense que toWorldVec peut être utilisé.

    A propos du bug au niveau de toCompVec ou toWorldVec avec l'échelle, j'en avais parlé à Dan une fois, et il m'avait dit (traduction libre):
    "Je continue de penser que cela a du sens quelque part, mais cela ne devrait pas fonctionner comme ça. Je pense que je voterais pour un bug."
     
  8. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 260
    Appréciations:
    +2 / 13 / -0
    c'est vraiment bizarre ce toCompVec.
    Pour vérifier que l'expression marche bien j'ai créé un calque orienté à 90° en y. Donc quand il est gauche cadre on voit une face et quand il est droite cadre on voit l'autre face. Le calque ne fait qu'une tranlation: donc le vecteur ne change pas et pourtant ça marche. toCompVec traduit différemment le vecteur selon l'endroit du calque.
    Ce que les gens d'Adobe appelle Vec n'est donc pas un vecteur.
     
  9. nab17connection

    Points Repaire:
    1 900
    Recos reçues:
    1
    Messages:
    1 051
    Appréciations:
    +0 / 0 / -0
    Je pense que les gars qui ont codé ces fonctions savent ce qu'est un vecteur :bigsmile:. Néanmoins je suis d'accord avec toi pour dire qu'il y a parfois des surprises avec ces méthodes de conversion. Si j'avais plus de temps libre je lancerais une investigation en profondeur dans les rotations et les changements d'espace dans AE. Je sais qu'avec le SDK tu as accès aux matrices qui définissent les transformations des calques, de la caméra, des lumières (les changements d'espace c'est des multiplications de matrices....). Mais pour mettre tout ça a plat et bien comprendre comment les choses se passent cela nécessite du temps, de la réflexion, et pas mal de recherche (documentation) sur le net!

    Pour en revenir au sujet initial de ce post, je pense que pour ce que l'on cherchait à faire, c'est fromCompVec() ou fromWorldVec() qu'il faut utiliser.
     
Chargement...

Dernières occasions

 

Partager cette page