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 :

Aide sur le picking


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 14
    Par défaut Aide sur le picking
    Bonjour a tous,
    Voila que j'essaye de faire du picking dans un exemple tout simple, une fenetre scindée en 4 carrés de tailles egales, un rouge, un bleu,un blanc et un vert.
    Jusque la tout va bien.
    Malgré que je ne comprenne pas trop comment ca marche, j'ai essayé de bidouiller pour comprendre le fonctionnement.

    Premierement, est ce que mon code est bon ou il y a des optimisations possible sur le picking?
    et Deuxiement, la question la plus importante a mon sens, est que quand je clique entre la jointure des 2 carrés, le hit marche est m'indique 2 mais si je fais ca a la jointure des 4 carrés, je n'est pas de hits et j'ai une ribambelle de nombre qui s'affiche infiniment et qui me fait une erreur d'overflow type 'la memoire ne peux etre "read" '...

    Voila c'est peut etre un peu long mais si quelqu'un a le courage de m'aider je l'en remercie


    Ci joint le fichier cpp correspondant aux codes
    main.cpp

  2. #2
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 14
    Par défaut
    Un ptit up pour savoir si quelqu'un peut m'aider parce que j'ai toujours pas résolu le probleme

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    J'ai galéré longtemps sur ton code pour comprendre ce qu'il faisait de travers...

    Pour finalement découvrir qu'il manquait une incrémentation de pointeur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          for (j = 0; j < (int)names; j++) { /*  for each name */
             printf ("%d ", *ptr);
          }
    or il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          for (j = 0; j < (int)names; j++,ptr++) { /*  for each name */
             printf ("%d ", *ptr);
          }
    Jc

  4. #4
    Membre expérimenté Avatar de Sixissor
    Étudiant
    Inscrit en
    Février 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 206
    Par défaut
    Salut.

    Tout d'abord, dans la fonction afficheCarre() n'oublie pas glPushMatrix() et glPopMatrix(); au début et à la fin.

    Pourquoi ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    id = buffer[(i<<2)+3];
    printf("Nom du hit=%d",id);
    Et c'est pas ça
    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
    glGetIntegerv(GL_VIEWPORT, viewport);
    glSelectBuffer(BUFSIZE,selectBuf);
    
    //on passe en mode selection
    glRenderMode(GL_SELECT);
    //on initialise la pile de noms
    glInitNames();
    //on empile qqchose dans la matrice de noms sinon erreur avec le glLoadName
    glPushName(0);
    
    glMatrixMode (GL_PROJECTION);
    glPushMatrix ();	/* push projection */
    glLoadIdentity ();
    
    gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] - y), 5.0, 5.0, viewport);
    
    gluOrtho2D(0,SCREEN_WIDTH,0,SCREEN_HEIGHT);
    //on empile les 4 carrées dans la matrice de noms
    affiche_carre();
    
    
    /**** C'est bizarre ce que t'as fait ici... :? ****/
    /*  Plusieurs choses:
    /*  Premièrement, l'appel à glFlush() doit se faire pour FINALISER le rendu une 
    /*     fois que la situation le permet. glFlush() + swap buffers = fin de la frame
    /*  Deuxièmement... Tu fais quoi là en fait ?
    /*  Il suffit de dépiler la matrice de projection que tu avais précédement empilé et c'est tout...
    /**** ****/
    
    glPopMatrix();
    
    glFlush();
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();		/* push modelview */
    glLoadIdentity();
    
    //on voit les differents hits atteint
    hits = glRenderMode(GL_RENDER);
    processHits (hits, selectBuf);
    Mais ça
    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
    glGetIntegerv(GL_VIEWPORT, viewport);
    glSelectBuffer(BUFSIZE,selectBuf);
    
    //on passe en mode selection
    glRenderMode(GL_SELECT);
    //on initialise la pile de noms
    glInitNames();
    //on empile qqchose dans la matrice de noms sinon erreur avec le glLoadName
    glPushName(0);
    
    glMatrixMode (GL_PROJECTION);
    glPushMatrix ();
    glLoadIdentity ();
    
    gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] - y),  5,  5, viewport);
    gluOrtho2D(0,SCREEN_WIDTH,0,SCREEN_HEIGHT);
    //on empile les 4 carrées dans la matrice de noms
    affiche_carre();
    
    // Voici ce qui doit être mis à la place
    glMatrixMode (GL_PROJECTION);
    glPopMatrix ();
    glFlush ();
    
    hits = glRenderMode (GL_RENDER);
    processHits (hits, selectBuf);

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Sixissor
    Salut.

    Tout d'abord, dans la fonction afficheCarre() n'oublie pas glPushMatrix() et glPopMatrix(); au début et à la fin.

    Pourquoi ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    id = buffer[(i<<2)+3];
    printf("Nom du hit=%d",id);
    Dans le cas où il y a un seul nom par "hit", cela donne son nom...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] - y), SCREEN_WIDTH, SCREEN_HEIGHT, viewport);
    gluOrtho2D(0,SCREEN_WIDTH,0,SCREEN_HEIGHT);
    /* Les 2 paramètres que j'ai mis en rouge plus haut correspondent à la largeur et à la hauteur
       de la matrice de picking */
    //on empile les 4 carrées dans la ma
    Non ! Ces deux paramètres correspondent à la taille du rectangle pour le picking. En faisant cela tu fais un rectangle de la taille de la fenêtre... Pas super...

    Jc

  6. #6
    Membre expérimenté Avatar de Sixissor
    Étudiant
    Inscrit en
    Février 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 206
    Par défaut
    Non ! Ces deux paramètres correspondent à la taille du rectangle pour le picking. En faisant cela tu fais un rectangle de la taille de la fenêtre... Pas super...
    [EDIT]

    Effectivement c'est moi qui ait pas compris à quoi ça sert... et qui ne comprends toujours pas...

    [EDIT2] OK c'est tout con... J'ai pigé... Un petit moment de faiblesse

  7. #7
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 14
    Par défaut
    Merci fearyourself pour le temps que tu as passé sur mon code, l'erreur vient bien de la et désolé encore pr le temps que tu as gaché dessus.
    Merci a toi aussi sixissor pour avoir essayer d'apporter ton aide.

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

Discussions similaires

  1. Besoin d'aide sur le PICKING .
    Par Clad3 dans le forum OpenGL
    Réponses: 5
    Dernier message: 06/06/2005, 15h38
  2. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19
  3. Réponses: 2
    Dernier message: 27/02/2003, 01h33
  4. [Kylix] Aide sur BitBlt
    Par mic006 dans le forum EDI
    Réponses: 1
    Dernier message: 10/12/2002, 22h54
  5. Aide sur une fenetre
    Par Ray-j dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/11/2002, 08h51

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