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 :

Picking 3D - pblm


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Par défaut Picking 3D - pblm
    Bonjour,
    Je suis actuellement entrain de travailler sur un projet basé autour de la visualisation de polyèdre. Je peux effectuer un zoom, une rotation ou encore coloriser tous les polyèdres qui s'affiche à l'écran.
    J'utilise wxwidget pour le fenêtrage.

    J'aimerais rajouter une fonctionnalitée basé sur le picking, pour pouvoir ainsi selectionner le polyèdre de mon choix ( ils sont dans un environnement 3D).
    J'ai suivi les tutoriels mais rien ne marche. J'ai divisé mon code afin qu'il soit plus lisible : une methode init, une methode reshape et display ( appelle mes liste d'affichage ), une autre qui s'occuper d'initialiser mes listes.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    void OpenGL_VT::pickingGL()
    {printf("pickingGL\n");
     
       GLuint selectBuf[BUFSIZE];
       GLint hits;
       GLint viewport[4];
     
       glGetIntegerv(GL_VIEWPORT, viewport);
     
       glSelectBuffer(BUFSIZE, selectBuf);
       (void) glRenderMode(GL_SELECT);
     
       glInitNames();
       glPushName(0);
     
       glMatrixMode(GL_PROJECTION);
       glPushMatrix();
       glLoadIdentity();
    /*  create 5x5 pixel picking region near cursor location */
       gluPickMatrix((GLdouble) x, (GLdouble) (viewport[3] - y),
                   5.0, 5.0, viewport);
       glOrtho(aspect*-top, aspect*top , -top, top, 10, 2000.0);
     
       drawPicking();
     
     
     
     
       glPopMatrix();
       glFlush();
     
       hits = glRenderMode(GL_RENDER);
       processHits(hits, selectBuf);
     
    }
    La methode ci-dessus s'occupe de la selection.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    void OpenGL_VT::reshapeGL()
    {printf("reshapeGL\n");
     
      int w, h;
      GetClientSize(&w, &h);//prend la longeur et largeur de la fenetre GL et le met ds w et h...si avant d'ouvrir le fichier,on change la taille, ça prendre ces valeurs
      printf("init w = %d - h = %d\n",w,h);
     
      aspect = ((float)w)/h;
      top = tan(zoom/2*M_PI/180.0)*( 2*pgvs); //calcul du champ de vision
     
     
     
     
     
      glViewport (0, 0, (GLsizei) w, (GLsizei) h);	// reset current viewport ( on définit un rectangle de la taile de la fenêtre - celle définit par wxwidget
      glMatrixMode (GL_PROJECTION);		// select projection matrix
     
      glLoadIdentity ();				// reset projection matrix
     
     
     
     
     
      //gluPerspective(zoom, ((float)w)/h, 0.1, 100.0); //voir page 134, calcul pour trouver champ de vision
      glOrtho(aspect*-top, aspect*top , -top, top, 10, 2000.0);
     
     
      gluLookAt(500.0, 500.0 , 500.0,  // a parametrer
      	    baryc->x  , baryc->y , baryc->z, // la camera pointe sur le barycentre des polyedres // 0.0, 0.0, 0.0,
      	    //0, 0, 0,
      	    0.0 , 1.0 , 0.0);
     
     
    // mise a l'echelle globlalement pour tous les polyedres ( on normalise)
    glScaled(1.0/ppvs, 1.0/ppvs, 1.0/ppvs);
     
     
      //gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);	// calculate the aspect ratio of the window
      glMatrixMode(GL_MODELVIEW);			// select modelview matrix
      glLoadIdentity();				// reset modelview matrix
     
     
    //glTranslated(baryc->x, baryc->y, baryc->z);
      arcb->setSize(w, h); // Update mouse bounds for arcball
     
     
    }
    J'ai utiliser une perspective cavaliere ( glOrtho) pour mon champ de vision. C'est le même qui celui que j'utilise dans la methode pickingGL().

    J'appele le code de la facon suivante :
    PickinGL()->reshapeGL()->displayGL()

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    void OpenGL_VT::drawPicking()
    {
    GLlist_POLYG = 2;
     
    for(int ttt=0; ttt<nbP; ttt++, GLlist_POLYG++) //on a une liste d'affichage pour chaque polyèdre
    {
     
          coul[0] = fmod(rand(), 100)*0.01;
          coul[1] = fmod(rand(), 100)*0.01;
          coul[2] = fmod(rand(), 100)*0.01;
          glColor3fv(coul); 	// draw in "coul" color
        for(int i=0; i<p[ttt]->NF; i++)
        {
     
     
          glBegin(GL_POLYGON);
            if (p[ttt]->fac[i][0]-1 == 1) //(p[ttt]->NS == 1)
              drawPoint(p[ttt]->som[ p[ttt]->fac[i][1] ]->x, p[ttt]->som[ p[ttt]->fac[i][1] ]->y, p[ttt]->som[ p[ttt]->fac[i][1] ]->z
                      , p[ttt]->som[ p[ttt]->fac[i][1] ]->x, p[ttt]->som[ p[ttt]->fac[i][1] ]->y, p[ttt]->som[ p[ttt]->fac[i][1] ]->z);
            else
            if (p[ttt]->fac[i][0]-1 == 2) //(p[ttt]->NS == 2)
              drawPoint(p[ttt]->som[ p[ttt]->fac[i][1] ]->x, p[ttt]->som[ p[ttt]->fac[i][1] ]->y, p[ttt]->som[ p[ttt]->fac[i][1] ]->z
                      , p[ttt]->som[ p[ttt]->fac[i][2] ]->x, p[ttt]->som[ p[ttt]->fac[i][2] ]->y, p[ttt]->som[ p[ttt]->fac[i][2] ]->z);
          glEnd();
     
     
          if (p[ttt]->fac[i][0]-1 > 2) //(p[ttt]->NS > 2)
          {
     
     
     
     
          for(int j=1; j<p[ttt]->fac[i][0]; j++){
            glLoadName(ttt+1);
    	glBegin(GL_POLYGON);
            glVertex3d(p[ttt]->som[ p[ttt]->fac[i][j] ]->x, p[ttt]->som[ p[ttt]->fac[i][j] ]->y, p[ttt]->som[ p[ttt]->fac[i][j] ]->z); 
          glEnd();
           }
          }
         }
     
    }
    }

    Dans le code de pickinGL, quand je laisse le glOrtho, je peux cliquer n'importe ou mais le nombre de hit reste à 0. Si je l'enleve, le hit se met à 1 quans je clique dans ce qui semble etre un petit carré centré sur le centre de la fenetre.

    Je ne sais pas où est le problème, peut etre je définit pas bien mes glLoadName mais ça ne devrait pas être ça.

    Merci de votre aide

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Par défaut
    Bonjour,
    Est ce que t'as essayé de voir ce qui est affiché au moment de traitement des clicks?
    J'ai eu a coder le traitement des clicks il y a peu et le meilleur moyen d'etre sur que ca marche c'est d'enlever gluPickMatrix et de voir ce qui est affiché par la methode PickingGL(). Il se peut que t'as oublié de faire un gluLookAt ou un changement de matrice ou autre erreur de ce genre.

    ++

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Par défaut re
    En enlevant gluPickMatrix ça revient au même : hit = 0, il y a le code au-dessus, j'ai vérifié plusieurs fois et je pense pas avoir oublié quelque chose :/
    En mode render, tout marche bien donc je comprend vraiment pas pourquoi ça marche pas...

  4. #4
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Par défaut re
    J'ai réglé le problème...il faut vraiment faire attention à l'histoire des matrices...j'ai enlever le gluLookat que j'avais dans le reshape, je 'lai mis dans le display ( après avoir initialisé ma matrie bien sur) et j'ai enlevé le popmatrix du display...je dois dire que je comprend pas encore tout donc je vais voir comment ça fonctionne plus précisément!

Discussions similaires

  1. pblm d'affichage d'un div vide d'une largeur désirée
    Par nuage dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 06/08/2005, 10h35
  2. [newbie] pblm nombres décimaux
    Par klipfel dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 12/07/2005, 12h15
  3. QT OpenGL Picking
    Par Teufboy dans le forum OpenGL
    Réponses: 5
    Dernier message: 12/07/2005, 07h49
  4. Besoin d'aide sur le PICKING .
    Par Clad3 dans le forum OpenGL
    Réponses: 5
    Dernier message: 06/06/2005, 15h38
  5. [win XP] [DOS] Pblm affichage d'un programme DOS
    Par jesus144 dans le forum Windows XP
    Réponses: 11
    Dernier message: 20/02/2005, 23h32

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