IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Moteur 2D: Pb de calcul de Matrice de transformation


Sujet :

Algorithmes et structures de données

  1. #1
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut Moteur 2D: Pb de calcul de Matrice de transformation
    Bonjour,

    Le calcul matriciel a l'air de faire couler beaucoup d'encre sur ce forum, avant de poster j'ai pu lire pas mal de post. Mais je n'ai pas trouvé de reponse a mon probleme.
    Je suis en train de créer un editeur 2D. Avec des cercles et des carrés, chaque objets posséde sa matrice de transformation. Ce qui me permete d'avoir des ellipses, et des rectangles.
    Le probleme vient de la mutipication par une matrice 2D de rotation: si je l'applique à un rectangle (carré avec modification d'echelle), il forme un losange, et non une rotation de mon rectangle...

    Je ne pense pas avoir de pb de calcul, je pense plutot a un probleme de fond.

    Merci d'avance
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  2. #2
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    montre nous la tête d'une de tes matrices de rotation...
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  3. #3
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cos(teta) | -sin(teta) | 0
    sin(teta) | cos(teta)  | 0
         0    |      0     | 1
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  4. #4
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Je croyais que tu faisai de la 2D ??? Enfin ça marche quand même, sauf si ton axe de rotation c'est pas l'axe z
    Mais je pense que ça tu le savais...
    Tu peux envoyer la tête du losange qui est le transformé de ton carré ?
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  5. #5
    Membre actif Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Points : 299
    Points
    299
    Par défaut
    En 3d mmmh.
    Non je pense plustot qu'il travaille en coordonnées homogénes.
    Si tu ne te plantes pas, comment veux tu pousser?

  6. #6
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut


    Je precise que si c'est un carré sa ne pose pas de probleme.

    Et je rajoute que je fait bien de la 2D, avec des coordonnées homogene
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  7. #7
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Tu ferais pas par hasard ta mise à l'échelle après la rotation?
    Parce qu'un carré tourné de 45°, puis un ratio de 0.5 sur les y, ça donne un joli losange...

    Mais vu que ça ne fait que bouger ton image, je ne vois pas vraiment ton problème!!!
    T'aurais pas une image statique plutôt...?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  8. #8
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    J'avais pensé à l'ordre de transformation au début, c'est pas juste....
    Voleur de solution
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  9. #9
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Citation Envoyé par Rafy
    J'avais pensé à l'ordre de transformation au début, c'est pas juste....
    Voleur de solution

    T'as pas pensé assez fort, j'ai rien vu d'écrit!

    Allez, va, je te la rends alors... sauf si c'est la bonne!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  10. #10
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Ben je crois que je suis sur que c'est ça, car si ça ne le fait pas avec le carré, mais seulement avec le rectangle, qui est généré à partir d'un carré puis étiré. Comme la seule choses qui change c'est l'étirement....
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  11. #11
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Merci pour vos reponces.

    Mais je ne peut inversé l'ordre de transformation des matrices.
    Et j'aimerai bien garder des formes tres simple de base : carré, cercle (de taille unitaire => calcul d'intersection simple )

    Donc les premières transformations sont une Translation suivit d'une Mise à l'echelle. Apres l'utilisateur peut modifié l'echelle, ou d'eplacer sa figure.
    Mais pour la rotation comment faire ? Je doit annuler l'echelle de l'objet faire la rotation puis remetre a l'echelle ?
    Dans le GDI+ l'ordre de multiplication des matrices de transformation peut etre inversé, a quoi cela correspond ?

    Encore Merki
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  12. #12
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Ben en fait, ton soucis semble être un problème d'axes lors de ta mise à l'échelle. Il nous faudrait ta méthode exacte pour en être sûr, mais apparemment, tu fais ta mise à l'échelle par rapport aux axes du repère global, alors qu'il faudrait utiliser le repère local de ta forme pour ça (qui va suivre la forme au cours de sa rotation).

    Ou sinon, mettre l'objet à l'échelle, dans le repère global, et ensuite faire la rotation. Mais si tu n'as pas le droit de changer l'ordre des matrices...

    Enfin, bon, de toute façon, donne nous des détails sur ce que tu fais, parce qu'on répond un peu en aveugle là...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  13. #13
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Aller je me lance je vous dis tous !
    Chaqu'une de mes Form derive de la class Form, qui possede un membre Transform.
    La class Transform contient 1 matrice referentiel et son inverce.
    Si on prend le carré FormSquare qui derive de Form:
    Lorsque que l'utilisateur créer la form je calcul les 2 points extreme du rectangle dessiné par l'utilisateur. A la fin du tracé je calcul la matrice de transformation pour passé du carré de base [ -0.5,-0.5 ; 0.5;0.5 ] au rectanlgle tracé par l'utilisateur.
    Pour l'affichage de dessine mon carré "unitaire" puis j'applique la matrice qui vient d'etre calculé.
    Lorsque que l'utilisateur modifie l'echelle ou deplace la Form, je calcul un vecteur dans le repere monde que je multiplie par la matrice inverce pour me retrouvé dans le repere de la Form, puis je multiplie la matrice referentiel de la Form par une matrice de Transformation (Echelle, Translation). Cela marche tres bien.
    Lorsque l'utilisateur tente d'appliquer une rotation sur la Form, je calcul l'angle de rotation dans le referentiel de la Form. Puis je multiplie la matrice Referentiel de la Form par une matrice de Transformation rotation d'angle n.
    Pour le rendu je dessine tjrs mon carré uniforme est j'applique sa matrice de transformation (GDI+).
    Le principe est un peu comme tous les softs de tracé vectoriel (Inkscape, Illustrator...) Il n'y a pas vraiment d'ordre de multiplication de matrice (mise a part lors de la construction Translation, puis Echelle ). Car l'utilisateur peut modifier quand bon lui semble l'echelle, le deplacement et la rotation de sa Form.
    Et je precise que de travailler avec des Forms unitaires est beaucoup plus simple pour calculer les intersections.

    Merci d'avoir tout lu
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par themadmax
    Il n'y a pas vraiment d'ordre de multiplication de matrice
    Qu'est ce que tu entends par là ?

    Tu te limites visiblement aux transformations affines, i.e. de la forme
    (hx sx tx)
    (sy hy ty)
    (0 0 1)
    qui forment un groupe, et dont il est facile de calculer l'inverse, tu n'as pas besoin de conserver l'inverse pour chaque transformation.

    A te lire on a l'impression que tu rejoues toutes les transformations pour obtenir la figure finale. Or si tu ne les rejoues pas "dans l'ordre" il est normal que tu puisses obtenir des losanges (la rotation d'un carré suivi d'une homothétie donne un losange si les facteurs d'homothétie ne sont pas les mêmes pour chaque axe).

  15. #15
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Bon j'ai resolu mon probleme :
    Lorsque l'utilisateur click sur le handle permetant la rotation d'une Form, je stock le valeur de mise a l'echelle de la matrice de transformation. Ensuite j'applique la transformé inverse de la mise a l'echelle (pour un rectangle je me retrouve avec un carré) puis j'applique ma matrice de rotation et je remultiplie pour remetre a la bon echelle. Et mon beau rectangle reste rectangle...
    Merci a tout le monde pour votre aide, et Adobe n'a qu'a bien se tenir
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul de matrices de projection par resectioning
    Par amwus dans le forum OpenCV
    Réponses: 0
    Dernier message: 09/02/2010, 15h18
  2. algorithme qui calcul la matrice de coocurence
    Par takfa2008 dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 13/11/2008, 09h41
  3. Calcul de matrice jacobienne
    Par malikakika dans le forum C++Builder
    Réponses: 1
    Dernier message: 04/05/2008, 02h17
  4. Calculer une matrice avec la méthode de EULER
    Par lematlabeur dans le forum MATLAB
    Réponses: 7
    Dernier message: 05/11/2007, 18h22
  5. calcul de matrice
    Par harsh dans le forum OpenGL
    Réponses: 1
    Dernier message: 08/03/2005, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo