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.
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 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); }
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().
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'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
Partager