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

Développement 2D, 3D et Jeux Discussion :

Problème de transformation quaternions/matrices


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut Problème de transformation quaternions/matrices
    Bonjour,

    Comme l'indique le titre du post j'ai quelques petits problèmes à l'utilisation des quaternions et des matrices, et plus précisement la transformation du premier en second.
    Je précise que je travaille avec OpenGL et ce que je cherche à obtenir la matrice de transformation inverse (pour l'exprimer à une caméra...) en sachant que le quaternion correspond à la matrice non-inversée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //Colonne X 
            matrix[0] = (1-2*quat.y*quat.y-2*quat.z*quat.z) * scale.x;
            matrix[1] = (2*quat.x*quat.y-2*quat.w*quat.z) * scale.x;
            matrix[2] = (2*quat.x*quat.z+2*quat.w*quat.y) * scale.x;
            matrix[3] = 0.0f;
            //Colonne Y
            matrix[4] = (2*quat.x*quat.y+2*quat.w*quat.z) * scale.y;
            matrix[5] = (1-2*quat.x*quat.x-2*quat.z*quat.z) * scale.y;
            matrix[6] = (2*quat.y*quat.z+2*quat.w*quat.x) * scale.y;
            matrix[7] = 0.0f;
            //Colonne Z
            matrix[8] = (2*quat.x*quat.z-2*quat.w*quat.y) * scale.z;
            matrix[9] = (2*quat.y*quat.z+2*quat.w*quat.x) * scale.z;
            matrix[10] = (1-2*quat.x*quat.x-2*quat.y*quat.y) * scale.z;
            matrix[11] = 0.0f;
            //Colonne des translations
            matrix[12] = -pos.x;
            matrix[13] = -pos.y;
            matrix[14] = -pos.z;
            matrix[15] = 1.0f;
    Comme vous l'aurez compris 'quat' est un quaternion normé(w, x, y, z), 'scale' et 'pos' les vecteurs d'échelle et de position...Vous remarquerez aussi sans doute j'utilise la transposition de la matrice de rotation et l'opposé du vecteur de translation pour obtenir la transformation inverse...

    Le problème: à l'affichage l'utilisation des commandes de rotations m'aplatissent l'espace et les commandes de translations agissent sans encombres mais je ne comprends pas pourquoi...

    Dans la FAQ Quaternions il y "conjugué = inverse" or en se reportant à la page Wikipedienne il y a bien deux significations distinctes...

  2. #2
    Membre averti Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Points : 358
    Points
    358
    Par défaut
    Attention aux notations, les anglais n'ont pas les même termes que nous pour certains trucs ...

    Accessoirement, as - tu verifié que ton quaterion etait unitaire ? ( longueur 1), car dans le cas contraire, cela pourrait expliquer l'applatissement( je parle d'experience).

  3. #3
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Oui j'ai vérifié que la norme du quaternion est de 1...C'est pour cela que je trouve ce problème bizzare ...

  4. #4
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Commment obtient on la rotation inverse à partir d'un quaternion???
    transposée de la matrice? Conjugué du quaternion? Inverse du quaternion ou de la matrice???

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Tu as vérifié que ton vecteur scale fonctionnait comme il faut? Parce que j'aurais plutôt mis scale.x pour les entrées 0, 4, 8 de la matrice, scale.y pour les entrées 1, 5, 9, etc ....

  6. #6
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Justement je pensais que la transposée suffirait à obtenir l'inverse de ma rotation c'est pour cela que le vecteur x est sur 0, 1, 2 et non pas sur 0, 4, 8 etc.

    Bon je "up" un peu le message mais je suis toujours dans le flou...

    OpenGL fonctionne avec des matrices 4*4, je dois les inverser entièrement ou simplement la partie 3*3 "rotation"???


    De plus, je voudrais utiliser des quaternions (je pense que vous le savez déjà) mais je trouve bizarre de n'avoir aucun code optimisé pour ceux-ci. Pour être plus clair, on trouve bien le code qui permet de transformer un quaternion en une matrice de rotation mais pas de code optimisé qui donne directo l'inverse en connaissant bien sûr les autre éléments de la matrice (translations/Scaling/Viewport etc.).

    Si quelqu'un à un logiciel de calcul formel, pourrait-il m'envoyer la donnée d'une matrice inversée provenant de :
    [a, b, c, d]
    [e, f, g, h]
    [i, j, k, l]
    [m, n, o, p]

    Merci...

  7. #7
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Une matrice n'est pas forcément inversible (cas où le déterminant est nul)

    Regarde ici :

    http://jeux.developpez.com/faq/matqu...s_inverses#Q24

  8. #8
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Euh, les matrices utilisées dans le cadre de transformation spatiale ne sont-elles pas censées être toute inversible???
    En fait je ne comprend pas comment on ne puisse pas obtenir une transformation inverse à une transformation donnée dans l'espace...

  9. #9
    Membre éclairé
    Avatar de N_I_C_S
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 450
    Points : 681
    Points
    681
    Par défaut
    Salut,
    je crois qu'il y a plusieurs erreurs.

    D'abord, comme le dit HunLyxxod, je pense que la matrice n'est pas "dans le bon sens", cad qu'il faut disposer les scales comme il l'indique et mettre la translation plutôt sur 3, 7, 11.

    Ensuite, cette matrice a l'air de décrire l'enchaînement :
    translation -> scale -> rotation

    Or l'inverse de cette transformation est :
    rotation inverse -> scale inverse -> translation inverse

    cad une matrice qui n'a plus du tout la même "gueule" donc inverser les valeurs des transformations (valeurs quaternion, x y z translation et scale) ne donne pas la transformation inverse de ta matrice. Dans le cas actuel, tu dois inverser toute ta matrice.

  10. #10
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Ok, donc dans l'ordre je dois créer la matrice 4*4 avec les rotations, les translations et le 'scaling' (cad toute la transformation complète) et après je dois l'inverser pour donc obtenir la transformation inverse?

    C'est quand qu'on voit les matrices en maaaaaths

  11. #11
    Membre éclairé
    Avatar de N_I_C_S
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 450
    Points : 681
    Points
    681
    Par défaut
    Ok, donc dans l'ordre je dois créer la matrice 4*4 avec les rotations, les translations et le 'scaling' (cad toute la transformation complète) et après je dois l'inverser pour donc obtenir la transformation inverse?
    Oui, tout à fait (au passage, à mon avis le scale est superflu pour une camera).

    Pour être clair, tu aurais une matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    |  quat  quat  quat  posX  |
    |  quat  quat  quat  posY  |
    |  quat  quat  quat  posZ  |
    |    0       0       0      1    |
    qui décrit la situation objective de la caméra (position et orientation). Tu l'inverse et tu obtiens la transformation subjective à envoyer à OpenGL pour positionner l'environnement.

  12. #12
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Merci beaucoup ^^

    Mais j'ai vu sur certains sites et en obtenant la matrice identité générée par OpenGL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glLoadIdentity();
    glGetFloatv(GL_MODELVIEW_MATRIX, matr);
    que les paramètre passés à glFrustum avait des incidences sur la dernière ligne (qui n'est plus alors [0, 0, 0, 1]) ce qui parait un peu normal du fait que les systèmes de projections diffèrent alors...
    Dois-je en tenir compte? La multiplication par la matrice identité suffira-t-elle à "transporter" ces paramètres?

  13. #13
    Membre éclairé
    Avatar de N_I_C_S
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 450
    Points : 681
    Points
    681
    Par défaut
    Mmm, je pense pas qu'il faille en tenir compte car ta matrice est une transformation indépendante de toute idée de rendu à l'écran. Et quand tu enverras son inverse à OpenGL pour multiplication, là les paramètres de frustum seront pris en compte.

  14. #14
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Ok ok

    Et alors mon 'idée' de chercher à simplifier les calculs du PC en partant de la matrice que nous connaissons (la transformation directe), il y a peut-être des simplifications à apporter du fait que le quaternion soit normé non?

  15. #15
    Membre éclairé
    Avatar de N_I_C_S
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 450
    Points : 681
    Points
    681
    Par défaut
    Malheureusement, j'ai peur que tout ce qui pouvait être optimisé dans ce domaine l'ait déjà été. Les quaternions sont eux-même une énorme optimisation et leur mise en matrice est assez complexe pour qu'il n'y ait pas de "règle" de ce genre

  16. #16
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Ok
    En tout cas merci pour votre aide!

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par N_I_C_S Voir le message
    Oui, tout à fait (au passage, à mon avis le scale est superflu pour une camera).

    Pour être clair, tu aurais une matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    |  quat  quat  quat  posX  |
    |  quat  quat  quat  posY  |
    |  quat  quat  quat  posZ  |
    |    0       0       0      1    |
    qui décrit la situation objective de la caméra (position et orientation). Tu l'inverse et tu obtiens la transformation subjective à envoyer à OpenGL pour positionner l'environnement.
    inverse ou transposée ? (sachant que l'inverse d'une matrice de rotation 33=sa transposée, qui est plus rapide à calculer) (pour la matrice 44 globale, ce n'est donc plus vrai)

    J'ai dû envoyer moi aussi la transposée de la matrice à OpenGL
    mais je ne comprends pas pourquoi il faut le faire
    Cela a-t-il un rapport avec si on configure en counter clock-wise ou non ?

  18. #18
    Membre éclairé
    Avatar de N_I_C_S
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 450
    Points : 681
    Points
    681
    Par défaut
    inverse ou transposée ? (sachant que l'inverse d'une matrice de rotation 33=sa transposée, qui est plus rapide à calculer) (pour la matrice 44 globale, ce n'est donc plus vrai)
    Non, c'est bien l'inverse (transposée de la matrice des cofacteurs divisée par le déterminant). C'est clair, c'est pas ce qu'il y a de plus speed à calculer
    J'ai dû envoyer moi aussi la transposée de la matrice à OpenGL
    mais je ne comprends pas pourquoi il faut le faire
    Cela a-t-il un rapport avec si on configure en counter clock-wise ou non ?
    Non, rien à voir. C'est juste que quand on tourne la tête à droite le monde "tourne à gauche", quand on avance le monde "recule". Donc pour simuler une vue subjective dans un environnement virtuel, on applique au décor l'inverse de la situation de notre oeil.

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

Discussions similaires

  1. Problème de conversion de matrice en quaternion
    Par wperrad dans le forum Moteurs 3D
    Réponses: 6
    Dernier message: 03/05/2012, 23h14
  2. [WordML][XSLT] Problème de transformation
    Par fouhaa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/05/2006, 15h22
  3. [XSLT] Problème de transformation XML avec un fichier xslt
    Par seb35 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 24/04/2006, 22h02
  4. [RegEx] Problème pour transformer les url en liens cliquable
    Par AlphaYoDa dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2006, 13h54
  5. Problème de transformations...
    Par Omfraax dans le forum OpenGL
    Réponses: 7
    Dernier message: 19/01/2006, 18h26

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