Picking opengl

Résolu
gillescpp Messages postés 33 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 22 octobre 2007 - 21 avril 2006 à 17:23
gillescpp Messages postés 33 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 22 octobre 2007 - 24 avril 2006 à 16:25
Bonjour,

Voila un ceratint temps que j'essaie de maitriser le picking et jusqu'a présent, c'est sans success.

Le code suivant comporte deux fonctions : l'une affiche un simple triangle et l'autre l'affiche aussi mais cettte fois-ci pour le picking.

C'est de cette dernière qu'il sagit en fait. J'ai mis en commentaire l'appel à glRenderMode pour rester en RENDER et j'ai ajouté un appel à l'affichage SDL_GL_SwapBuffers() pour qu'il m'affiche le résultat.

Le problème semble venir de gluPickMatrix(). En effet, malgré le fait que les transformations de matrices (hormis cette dernière) soient identiques, le résultat n'est pas du tout celui attendu. Le triangle apparait beaucoup plus grand et à une position qui parait être aléatoire (ce ne doit pas être le cas). Lorsque j'enleve l'appel à gluPickMatrix(), le triangle s'affiche bien à la place voulue.

Voici le code :

void GRILLE::Afficher_GL()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective (40.0, 4.0/3.0, 0.1, 100.0);

glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
gluLookAt (7.5, 7.5, 12.5, 2.5, 2.5, -5.0, 0.0, 1.0, 0.0);


glBegin (GL_TRIANGLES);
glVertex3f (-0.5, 0.0, 1.0);
glVertex3f (0.0, 0.8, 1.0);
glVertex3f (0.2, 0.2, 1.0);
glEnd ();

}

void GRILLE::Select_GL(int x, int y)
{
GLuint tampon[512], hits;
GLint viewport[4];
glSelectBuffer(512, tampon);
glGetIntegerv(GL_VIEWPORT, viewport);
//(void) glRenderMode(GL_SELECT);

glInitNames();
glPushName(0);

glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPickMatrix(x,viewport[3] - y, 50.0, 50.0, viewport);
gluPerspective (40.0, 4.0/3.0, 0.1, 100.0);

glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
gluLookAt (7.5, 7.5, 12.5, 2.5, 2.5, -5.0, 0.0, 1.0, 0.0);

glColor3f(0.0, 0.0, 1.0f);
glLoadName(1);
glBegin (GL_TRIANGLES);
glVertex3f (-0.5, 0.0, 1.0);
glVertex3f (0.0, 0.8, 1.0);
glVertex3f (0.2, 0.2, 1.0);
glEnd ();
glColor3f(1.0, 1.0, 1.0);
glPopMatrix();
glFlush();

hits = glRenderMode(GL_RENDER);
printf("nombre de hits : %d\n", hits);
SDL_GL_SwapBuffers();
}

Le projet a été réalisé avec Dev c++ sur la base d'un squelette de projet SDL et Opengl.

Il se peut qu'il y ait une erreur assez grosse pour que ne la voie pas ...

Merci pour vos suggestions.

Gilles

4 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
24 avril 2006 à 10:00
Bas regarde ma source ou je fais du picking, car il me semble que tu n'as pas bien compris son fonctionnement.

http://www.cppfrance.com/codes/PICKING-OPENGL-GLUT-INTERPOLATION-BEZIER-SPLINE-CATMULROM_33230.aspx


Par exemple, pk tu dis ca : "En effet, malgré le fait que les transformations de matrices (hormis
cette dernière) soient identiques, le résultat n'est pas du tout celui
attendu. Le triangle apparait beaucoup plus grand et à une position qui
parait être aléatoire (ce ne doit pas être le cas)." car en mode SELEC, aucun n'affichage n'est fait.

Et tu utilises pas correctement la fonction:

gluPickMatrix(x,viewport[3] - y, 50.0, 50.0, viewport);

Les paramètres 50 sont bien trop grand. Ca serait plutot 5 ou au max 10.

Et ca:
//(void) glRenderMode(GL_SELECT);
C'est SURTOUT PAS EN COMMENTAIRE.
3
gillescpp Messages postés 33 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 22 octobre 2007
24 avril 2006 à 14:14
J'ai mis le mode GL_SELECT en commentaires et un appel à Swapbuffers pour m'afficher ce que dessine opengl et que l'on est censé pas voir. C'est uniquement qu'a des fins de déboguage. Quant aux 50, c'était pour m'assurer de viser juste. Pourtant, en corrigeant comme tu me le conseilles, ca à l'air de fonctionner correctement. Voici le code corrigé :
void GRILLE::Select_GL(int x, int y)
{
GLuint tampon[512], hits;
GLint viewport[4]; 
glSelectBuffer(512, tampon);
glGetIntegerv(GL_VIEWPORT, viewport);
(void) glRenderMode(GL_SELECT);

glInitNames();
glPushName(0);

   glPushMatrix();
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPickMatrix(x,viewport[3] - y, 1.0, 1.0, viewport);
   gluPerspective (40.0, 4.0/3.0, 0.1, 100.0);

   glMatrixMode (GL_MODELVIEW);
   glLoadIdentity ();
   gluLookAt (7.5, 7.5, 12.5, 2.5, 2.5, -5.0, 0.0, 1.0, 0.0);
  
   glColor3f(0.0, 0.0, 1.0f);
   glLoadName(1);  
   glBegin (GL_TRIANGLES);
   glVertex3f (-0.5, 0.0, 1.0);
   glVertex3f (0.0, 0.8, 1.0);
   glVertex3f (0.2, 0.2, 1.0);
   glEnd ();
   glColor3f(1.0, 1.0, 1.0);
glPopMatrix();
glFlush();

hits = glRenderMode(GL_RENDER);
printf("nombre de hits : %d\n", hits);
//SDL_GL_SwapBuffers();
}


Merci pour tout en tous cas.

Nicolas
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
24 avril 2006 à 14:44
Oue, ca semble correct, en tout cas. C'est quasi identique à ce que j'avais fais et qui marchait bien.
0
gillescpp Messages postés 33 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 22 octobre 2007
24 avril 2006 à 16:25
Même apres d'autres traansformations qui ne sont connues que pendant l'exécution du programme, le picking fonctionne correctement. C'est du tout bon.

Nicolas
0
Rejoignez-nous