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 :

Qt picking openGL


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut Qt picking openGL
    Bonjour à tous,

    J'essaye de mettre en place du picking pour mon application openGL. Je parviens difficilement à sélectionner mes objets en cliquant un peu n'importe ou. Je vois pas ou est le problème, mon code :

    GLWidget.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class GLWidget : public QGLWidget
    {
        private:
            [...]
            GLenum _mode;
     
        public:
            [...]    
    };
    GLWidget.cpp
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    void GLWidget::paintGL()
    {
        [...]
     
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
        glLoadIdentity();
     
        [...]
     
        for (i = 0; i < nbrPlateau; ++i)
        {
            [...]
     
            paintQuad([...], Couleur, i);
        }
     
        glFlush    ();
        swapBuffers();
    }
     
    void GLWidget::paintQuad([...], Couleur * Couleur, int numPiece)
    {
        [...]
     
        if (_mode == GL_SELECT) glLoadName(numPiece);
     
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        glBegin(GL_QUADS);
            glColor3ub(Couleur->getRouge(), Couleur->getVert(), Couleur->getBleu());
     
            [...] /* On dessine le cube */
     
        glEnd();
     
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // Demande du dessin en fil de fer.
        glBegin(GL_QUADS);
            glColor3ub(0, 0, 0); // Couleur noir
     
            [...] /* On dessine les contours du cube */
     
        glEnd();
    }
     
    void GLWidget::processHits(GLuint buffer[])
    {
        GLuint * ptr = (GLuint *) buffer, numPiece = ptr[3];
     
        [...]
    }
     
    void GLWidget::mousePressEvent(QMouseEvent * event)
    {
        if (event->buttons() & Qt::MiddleButton)
        {
            GLuint selectBuf[BUFSIZE] = { 0 };
            GLint  viewport[4];
     
            glGetIntegerv(GL_VIEWPORT, viewport);
            glSelectBuffer(BUFSIZE, selectBuf);
     
            glRenderMode(GL_SELECT);
     
            glInitNames(); glPushName(0);
     
            gluPickMatrix(event->x(), event->y(), 1.0, 1.0, viewport);
     
            _mode = GL_SELECT; paintGL();
            _mode = GL_RENDER; glRenderMode(GL_RENDER);
     
            processHits(selectBuf);
        }
        else _lastPos = event->pos();
    }
    Merci.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 141
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Dans gluPickMatrix() êtes vous sur que ce n'est pas la taille de la fenêtre qu'il faut passer ?

    Sinon, je vous conseille d'utiliser un débogueur ou de rajouter des logs afin de mieux comprendre ce qui se passe. De plus, faire un test simple (avec un seul triangle, la camera droite et tout au plus simple) vous aidera
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Je suis toujours bloquer sur ce problème :p

    J'ai remarquer qu'il me sélectionner toutes mes pièces en affichant le nombre de hits : Le code complet :

    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 GLWidget::processHits(GLint hits, GLuint buffer[])
    {
        GLuint name, * ptr = (GLuint *) buffer;
     
        _parentFenetreDesignerForGLWidget->getCurseurTexte().insertText("NbrHits = "+QString::number(hits)+"\n");
     
        name = ptr[hits * 4 - 1];
     
        if (name > 0)
        {
     
            _parentFenetreDesignerForGLWidget->getCurseurTexte().insertText("1. Name = "+QString::number(name)+"\n");
        }
    }
     
    void GLWidget::mousePressEvent(QMouseEvent * event)
    {
        if (event->buttons() & Qt::MiddleButton)
        {
            GLuint selectBuf[BUFSIZE] = { 0 };
            GLint  hits = 0;
            GLint  viewport[4];
     
            glGetIntegerv(GL_VIEWPORT, viewport);                         // On récupére le viewport courant
            glSelectBuffer(BUFSIZE, selectBuf);
     
     
            _mode = GL_SELECT; (void)glRenderMode(GL_SELECT);
     
            glInitNames(); glPushName(0);                                 // Initialisation de la pile des noms
     
            gluPickMatrix(event->x(), event->y(), 1.0, 1.0, viewport);    // create 1x1 pixel picking region near cursor location
     
            paintGL();                                                   // On calcule la scène pour le picking : elle n'est pas dessinée dans un tampon chromatique
     
            glPopName();                                                 // On supprime le nom de la pile
     
            _mode = GL_RENDER; hits = glRenderMode(GL_RENDER);
     
            processHits(hits, selectBuf);  // On traite les sommets cliqués
        }
        else _lastPos = event->pos();
    }

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

Discussions similaires

  1. Picking OpenGL C++
    Par lulafitt dans le forum OpenGL
    Réponses: 1
    Dernier message: 22/02/2011, 17h21
  2. Question à propos du picking OpenGL
    Par choko83 dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/04/2009, 09h54
  3. Picking openGL api32
    Par g0ku_0ne dans le forum OpenGL
    Réponses: 15
    Dernier message: 15/06/2008, 07h35
  4. Probleme de Picking OPENGL
    Par Tiéry dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/11/2007, 13h41
  5. Probème Picking OpenGL
    Par johnalias110 dans le forum OpenGL
    Réponses: 3
    Dernier message: 02/05/2007, 10h02

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