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

OpenGL Discussion :

Conversion d' matrix/quaternion en AxisAngle


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut Conversion d' matrix/quaternion en AxisAngle
    Bonjour,

    Je dois transformer une matrice en rotation OpenGL.
    La matrix'e est retournée par un moteur physique ODE: www.ode.org .

    La DOC. d'ODE explique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const dReal * dGeomGetPosition (dGeomID);
    const dReal * dGeomGetRotation (dGeomID);
    void dGeomGetQuaternion (dGeomID, dQuaternion result);
     
    The first two return pointers to the geom's position vector and rotation matrix. The returned values are pointers to internal data structures, so the vectors are valid until any changes are made to the geom. If the geom is attached to a body, the body's position / rotation pointers will be returned, i.e. the result will be identical to calling dBodyGetPosition or dBodyGetRotation.
     
    dGeomGetQuaternion copies the geom's quaternion into the space provided. If the geom is attached to a body, the body's quaternion will be returned, i.e. the resulting quaternion will be the same as the result of calling dBodyGetQuaternion.
     
    Calling these functions on a non-placeable geom results in a runtime error in the debug build of ODE.
    Je dois transformer la matrix retournée par: dGeomGetRotation();
    ou meme transformer le quaternion retourné par: void dGeomGetQuaternion (dGeomID, dQuaternion result);
    pour que je puisse utiliser glRotatef();

    Ici il y a de l'aide mais je n'arrive pas a integrer
    http://skal.planet-d.net/demo/matrixfaq.htm

    Merci d'avance d'un coup de main

  2. #2
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 578
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 578
    Par défaut
    Tu n'as pas possibilité d'utiliser directement glMultMatrix(f/d) ?

    Etant donné que c'est une matrice de rotation qui t'es transmise, il suffirait de l'interpréter directement plutot que de la retranscrire pour faire un glRotate qui va recréer une matrice qu'il multipliera enfin

    tu vois ce que je veux dire
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Merci pour la réponse ,
    Mais en fait vous savez, quand je met glMultMatrix();
    tous mes objets apres, disparaissent , ca peut etre une probleme de glMatrixMode(); ?
    Je dois l'utiliser comment?

  4. #4
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 578
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 578
    Par défaut
    Peut etre un problème de glMatrixMode

    - assures toi d'abord que tu es bien en GL_MODELVIEW qui est la matrice de transformation du monde et donc des objets

    - ta matrice est -elle ordonnées en "column-major order" ou en "row-major order", regardes dans la doc de Ode s'il disent quoi que ce soit à ce sujet, cela a son importance vu que OpenGL traite en "column-major order"
    c'est peut-etre un "format" (structure) de données interne à Ode ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Alors, voici mon code pour la 3d:
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    glViewport(0,0,LDElargeurInit,LDEhauteurInit);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(p,(float)LDElargeurInit/(float)LDEhauteurIni,s,LDEendDraw);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    -"column-major order" ou en "row-major order" <= je vais chercher mais pour le moment, quoique je face, par example:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GLfloat matrixe[16];
    glMultMatrix(matrixe);
    Objet(); // l'objet n'est pas affiché et si l'objet change de pos/rot, sur l'ecran il y a plain de trucs qui defile,
    //des triangles dans tous les sens ..  :(
    -Je vais mettre un exe

  6. #6
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 578
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 578
    Par défaut
    Citation Envoyé par Happy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GLfloat matrixe[16];
    glMultMatrix(matrixe);
    Objet(); // l'objet n'est pas affiché et si l'objet change de pos/rot, sur l'ecran il y a plain de trucs qui defile,
    //des triangles dans tous les sens ..  :(
    tu as quoi dans matrixe ?
    ton tableau n'est pas initialisé dans ton exemple, c'est une omission ou c'est réel (auquel cas je comprend que ut ais des réaction bizarres) ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  7. #7
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Ben .. j'avais essayé comme ca:
    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
    matrixe[0] = 1;
            matrixe[1] = 1;
            matrixe[2] = 1;
            matrixe[3] = 1;
            matrixe[4] = 1;
            matrixe[5] = 1;
            matrixe[6] = 1;
            matrixe[7] = 1;
            matrixe[8] = 1;
            matrixe[9] = 1;
            matrixe[10] = 1;
            matrixe[11] = 1;
            matrixe[12] = 1;
            matrixe[13] = 1;
            matrixe[14] = 1;
            matrixe[15] = 1;
            matrixe[16] = 1;
    et l'objet ne s'affiche pas .. est ce que j'avais faux?
    Mais alors je ne comprends pas pour la matrix d'ODE!
    Je vais toujours chercher pour: "column-major order" .. "row-major order"

    EDIT!: je vien de trouver ceci: Ode outputs its rotation as a 3*3 matrix ..
    alors de ce que je sai OpenGL c'est une de 4*4 .. je crois que ca vien de la, mais alors comment je vais transformer tout ca ..

  8. #8
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 578
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 578
    Par défaut
    Citation Envoyé par Happy
    Ben .. j'avais essayé comme ca:
    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
    matrixe[0] = 1;
            matrixe[1] = 1;
            matrixe[2] = 1;
            matrixe[3] = 1;
            matrixe[4] = 1;
            matrixe[5] = 1;
            matrixe[6] = 1;
            matrixe[7] = 1;
            matrixe[8] = 1;
            matrixe[9] = 1;
            matrixe[10] = 1;
            matrixe[11] = 1;
            matrixe[12] = 1;
            matrixe[13] = 1;
            matrixe[14] = 1;
            matrixe[15] = 1;
            matrixe[16] = 1;
    et l'objet ne s'affiche pas .. est ce que j'avais faux?
    Euh, en fait, oui
    une matrice identité, qui ne fait aucune transformation, ça ressemble à ça :
    1 0 0 0
    0 1 0 0
    0 0 1 0
    0 0 0 1

    EDIT!: je vien de trouver ceci: Ode outputs its rotation as a 3*3 matrix ..
    alors de ce que je sai OpenGL c'est une de 4*4 .. je crois que ca vien de la, mais alors comment je vais transformer tout ca ..
    Dans ce cas tu peux ajouter la 4ème colonne et la quatrième ligne :
    a b c 0
    d e f 0
    g h i 0
    0 0 0 1

    avec de a à f les paramètre de la matrice 3*3 retournée par Ode

    à tester
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  9. #9
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 578
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 578
    Par défaut
    Au fait, est-ce que tu as l'habitude de manipuler des matrices ?

    si ce n'est pas le cas, je te conseille vivement de chercher quelques cours parcequ'utiliser des matrices sans les connaitre, ça va pas être du gateau
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  10. #10
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    MERCI, je vais bien etudier les matrices c'est sur, j'ai commencé aujourd'hui .. ca vas etre un peu dur au debut mais pas tant que ca, et puis je vien de trouver un example de transfo d'ODE=>OpenGL, pour ceux qui ont besoin, a essayer:
    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
    21
    22
    23
    GLfloat local_matrix[16];
     
    void set_matrix (const float pos[3], const float R[12]) {
        local_matrix[0]    =     R[0];
        local_matrix[1]    =     R[4];
        local_matrix[2]    =     R[8];
        local_matrix[3]    =     0;
        local_matrix[4]    =     R[1];
        local_matrix[5]    =     R[5];
        local_matrix[6]    =     R[9];
        local_matrix[7]    =     0;
        local_matrix[8]    =     R[2];
        local_matrix[9]    =     R[6];
        local_matrix[10] =     R[10];
        local_matrix[11] =     0;
        local_matrix[12] =     pos[0];
        local_matrix[13] =     pos[1];
        local_matrix[14] =     pos[2];
        local_matrix[15] =     1;
    }
     
    set_matrix( dBodyGetPosition(body), dBodyGetRotation(body));
    glMultMatrixf (local_matrix);

  11. #11
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Par défaut
    Euh, c'est peut-être une réponse naïve, mais est ce que tu refais bien un glLoadidentity() avant chaque appel de multmatrix.
    Parce que sinon, ça va à chaque fois multiplier par la même matrice donc cumuler les rotations ce qui expliquerait peut être ton impression de défilement rapide....

  12. #12
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Essayé et réessayer et ca marche pas, c'est pas mon jour .
    J'ai mal a la tete .. je vais encore essayer demain, et meme apres demain, et meme toujours!
    Merci pour votre aide

  13. #13
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    tu a essayer en utilisant glPushMatrix/glPopMatrix pour que ta transformation ne modifie pas les autres objets ?
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  14. #14
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Oui, biensur car si j'ai beaucoup d'objets, chaqun devra avoir son propre mouvement, mais alors l'objet qui est entre un glPush,glPopMatrix, si je met "glMultMatrixf();", alors il ne s'affiche plu . C'est peut - etre parsce que j'utiliser OpenGL 1.4.1 .. ?
    Je vais installer le 2.0.1 pour voir

  15. #15
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 578
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 578
    Par défaut
    Ce n'est pas un problème de version, c'est certainement un problème dans l'utilisation des matrices générées
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  16. #16
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Excusez moi, donc comme sheron666 a dit, j'utilisai pas bien la matrix.

    1 0 0 0
    0 1 0 0
    0 0 1 0
    0 0 0 1

    <= danc cette ordre la mon objet s'affiche!
    Donc maintenant me reste juste a mieu apprendre la matrix, et transformer "comme il faut", d'ODE à OGL, voila merci beaucoup de votre aide!!

    ALORS ca marche!

    voici le code qui marche, c'est le meme que celui d'en haut, mais je ne l'utilisais pas bien:
    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
    21
    22
    glPushMatrix();
            const dReal *pos = dGeomGetPosition(boxGeom);
            const dReal *R = (dReal*)dGeomGetRotation(boxGeom);
            local_matrix[0]    =     R[0];
            local_matrix[1]    =     R[4];
            local_matrix[2]    =     R[8];
            local_matrix[3]    =     0;
            local_matrix[4]    =     R[1];
            local_matrix[5]    =     R[5];
            local_matrix[6]    =     R[9];
            local_matrix[7]    =     0;
            local_matrix[8]    =     R[2];
            local_matrix[9]    =     R[6];
            local_matrix[10] =     R[10];
            local_matrix[11] =     0;
            local_matrix[12] =     pos[0];
            local_matrix[13] =     pos[1];
            local_matrix[14] =     pos[2];
            local_matrix[15] =     1;
            glMultMatrixf(local_matrix);
            LDEbox(3,3,3);
            glPopMatrix();
    et un lien vers l'exe: http://rapidshare.de/files/12862060/TRYode.rar

  17. #17
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 578
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 578
    Par défaut
    Pas mal pour un début, par contre la "caméra" vibre, c'est bizarre
    et sur mon pc la sphère déconne au niveau de l'éclairage, tantot jaune tantot bleu foncé

    en tout cas bravo, tu sembles bien parti
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  18. #18
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Merci

    La camera vibre car elle est a la meme position que la grande boite, et eloignée sur l'axe Z, donc quand la boite est par eterre, et l'endor pas, et elle vibre 8) .
    Pour l'eclairage de la sphere, je crois que ca vien du fait que dans ce test j'ai utilisé une grande echelle pour les objets et beaucoup de lignes sur la grille .. je crois ..

    La boite laquelle on regarde, on peut la controler avec les touches de 1 à 9 et space, 7 pour la monter dans l'air, si dans l'air la camera vibre alors c'est vraiment bizarre

    edit : Minus et Plus et click droit + bouger la sourie, ca bouge la camera, pour ceux qui veule bien regarder les mouvements d'ODE

  19. #19
    Membre chevronné
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Par défaut
    La surface au centre (en jaune) scintille chez moi sinon est trés sympa

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. Conversion Data.Frame en Matrix
    Par Momoze dans le forum R
    Réponses: 2
    Dernier message: 06/02/2011, 22h47
  3. probleme conversion matrice quaternion
    Par csauv29 dans le forum OpenGL
    Réponses: 10
    Dernier message: 21/11/2010, 12h09
  4. Réponses: 3
    Dernier message: 04/12/2007, 17h38
  5. convertir une MATRIX en Quaternion
    Par supergrey dans le forum DirectX
    Réponses: 2
    Dernier message: 15/05/2006, 21h52

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