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 :

Problème gestion référentiel


Sujet :

OpenGL

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème gestion référentiel
    Bonjour,

    J'ai déjà utilisé OpenGL plusieurs fois, mais là j'avoue sécher sur un problème de géométrie. La fatigue, perte de neuronnes, etc je sais pas. J'en appele donc à vos compétences.

    En gros je veux dessiner une surface 3D et être capable de la déplacer. Jusque là aucun problème.

    Je veux pouvoir:
    1. La faire tourner autour de (x;-y) (en vecteur). Donc je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glRotatef(angle1, 1.0,-1.0,0.0);
    Ce qui fonctionne seul.
    2. La faire tourner autour des z. Je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glRotatef(angle2, 0.0,0.0,1.0);
    Ca fonctionne aussi seul.

    Sauf que je voudrais combiner les deux, et là arrive mon problème. Le premier glRotetef va bien effecuter la rotation, mais il va aussi faire une rotation du repère. Ce qui fait que la seconde rotation se fait sur le repère modifié par le premier glRotate, hors je voudrais que ce soit fait par le repère de base.
    (Je ne suis pas sur d'être clair).

    Mon code en gros:
    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
     
    void display(void)
    {
         ...
         glPushMatrix();
              glTranslatef(centreX, centreY, 0.0); /*place mon repère au centre de l'objet*/
              glRotatef(angle1, 1.0,-1.0,0.0);
              glRotatef(angle2, 0.0,0.0,1.0); 
              glTranslatef(-centreX, -centreY, 0.0); /*Je replace mon repère*/
     
              glPushMatrix();
                   drawmyobject();
              glPopMatrix();
         glPopMatrix();
         ... 
    }
    Voilà en gros le truc. J'ai tenté avec des glLoadIdentity(), mais ça annule la précédante rotation, etc. Donc là franchement je ne vois pas.

    Si vous avez une solution, merci. Je suis sur que c'est tout bète en plus.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    Dans ce cas, je crains que tu doivent toi meme calculer la matrice "a la main" et faire glMultMatrix..

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ouais c'est ce que je me suis dis, mais ça n'a pas l'air de mieux fonctionner.

    Pour que l'on soit bien sur:
    la matrice de rotation d'un glRotatef(angle,1.0,-1.0,0.0) c'est égal à la multiplication des matrices de rotation d'un glRotatef(angle,1.0,0.0,0.0) et glRotatef(angle,0.0,-1.0,0.0) ?
    Il y a pas un glScalef qui traine dans le glRotate? Car au final le rendu est pas correct.

    Sinon j'ai voulu faire autrement, c'est à dire faire un déplacement du gluLookAt en coordonnée sphérique, mais ça a pas l'air de mieux fonctionner. Franchement là je suis perdu.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    local (objet) ----------> global ----------> local (camera)

    MODELVIEW = OBJET x CAMERA

    la matrice MODELVIEW est composee comme le montre le schema de deux sous matrices.

    La matrice OBJET (celle qui nous interresse) permet de passer de l espace des vertex a l espace global.

    Si tu decomposes OBJET par une sequence de transformations ressemblant a

    OBJET = ROTATION x SCALING x TRANSLATION

    alors , tu obtiens deux resultats differents suivant que tu fais :

    ROTATION <- ROTATION x R'

    ou

    ROTATION <- R' x ROTATION

    C'est a mon avis le coeur de ton probleme, et tu devrais prospecter la dessus

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    note que pour opengl, les transformations sont fournis dans le sens contraire de 'traversee' des vertex. Tu ecriras donc quelquechose comme


    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
    24
    25
     
     
      glPushMatrix();
     
        set_camera_transform();
     
        glPushMatrix();
     
          set_object_transform();
     
          draw_object();
     
        glPopMatrix
     
      glPopMatrix
     
     
    void set_object_transform(){ /* si on considere mon pipeleline plus haut */
     
      glTranslate(...)
     
      glScale(...)
     
      glRotate(...)  
    }
    L interet de cette inversion, c'est que ta matrice CAMERA est un indendant de l objet affiche. Tu peux donc user et abuser de glPush et glPop pour eviter d'avoir a specifier pour chaque objet la transformation issue de la camera

Discussions similaires

  1. Problème gestion IOException
    Par matt8-5 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 03/11/2006, 15h07
  2. [C# 2.0] Problème gestion mémoire
    Par Stéphane-M dans le forum Windows Forms
    Réponses: 13
    Dernier message: 21/09/2006, 14h36
  3. Problème gestion actionListener pour JButton
    Par cedricbr dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 26/05/2006, 16h39
  4. [Héritage] problème intégrité référentielle
    Par Ouark dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 24/01/2006, 18h47
  5. Problème - Gestion des exceptions - MFC.
    Par Atomikx dans le forum MFC
    Réponses: 4
    Dernier message: 14/11/2005, 09h38

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