Bonjour,
J'essaie de faire une sorte de paint 3D, avec 4 viewports, pour mon projet de première année, mais je n'arrive pas à faire fonctionner le picking, après bien des recherches !
J'utilise l'API WIN 32.
http://www.casimages.com/img.php?i=0...0223443836.jpg
Voici le code :
Je garde les matrices de projection grâce à la fonction ci-dessous :
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 void picking( t_objet* ptrDeb, POINT curseurSouris, int largeur, t_viewport viewportActif, t_objet* ptrdeb ) { int nbObjets, hits,; double precision[2] = { 3, 3 }; GLuint buffer[ 500 ]; GLuint* ptr = buffer; /* Renversement de l'axe des ordonnées */ curseurSouris.y = hauteur - curseurSouris.y; glSelectBuffer( 500, buffer ); glRenderMode( GL_SELECT ); glInitNames(); glPushName(0); glMatrixMode( GL_PROJECTION ); glPushMatrix(); glLoadIdentity(); gluPickMatrix( (GLdouble)curseurSouris.x, (GLdouble)curseurSouris.y, precision[0], precision[1], viewportActif.viewport ); glMultMatrixd( viewportActif.projection ); glMatrixMode( GL_MODELVIEW ); dessinerSceneSelect( ptrDeb, buffer ); hits = glRenderMode( GL_RENDER ); }
Donc la matrice et le viewport sont toujours à jour.
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 void dessin( t_viewport* viewport, t_objet* ptrDeb, int largeur, int hauteur ) { float coef; glViewport( viewport->viewport[0], viewport->viewport[1], viewport->viewport[2], viewport->viewport[3] ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); if( viewport->vueAssociee == VIEWPORT_INACTIF ) return; if( viewport->vueAssociee != VUEDEPERSPECTIVE ) { if( largeur > hauteur ) { coef = (float)largeur/hauteur; glOrtho( viewport->fenetrage[0]*coef, viewport->fenetrage[1]*coef, viewport->fenetrage[2], viewport->fenetrage[3], 0.1, 1000 ); } else { coef = hauteur/(float)largeur; glOrtho( viewport->fenetrage[0], viewport->fenetrage[1], viewport->fenetrage[2]*coef, viewport->fenetrage[3]*coef, 0.1, 1000 ); } } else gluPerspective( 45, (float)largeur / hauteur, 0.1, 1000 ); /* Sauvegarde des informations sur les vues */ glGetDoublev( GL_PROJECTION_MATRIX, viewport->projection ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); if( viewport->vueAssociee == VUEDEFACE ) gluLookAt( 0.0, 0.0, viewport->camera.z, viewport->camera.cibleX, viewport->camera.cibleY, viewport->camera.cibleZ, viewport->camera.angleX, viewport->camera.angleY, viewport->camera.angleZ ); else if( viewport->vueAssociee == VUEDEDERRIERE ) gluLookAt( 0.0, 0.0, -viewport->camera.z, viewport->camera.cibleX, viewport->camera.cibleY, viewport->camera.cibleZ, viewport->camera.angleX, viewport->camera.angleY, viewport->camera.angleZ ); else if( viewport->vueAssociee == VUEDEDESSUS ) gluLookAt( 0.0000001, viewport->camera.y, 0.0,//Beug sinon... viewport->camera.cibleX, viewport->camera.cibleY, viewport->camera.cibleZ, viewport->camera.angleX, viewport->camera.angleY, viewport->camera.angleZ ); else if( viewport->vueAssociee == VUEDEPERSPECTIVE ) gluLookAt( viewport->camera.x, viewport->camera.y, viewport->camera.z, viewport->camera.cibleX, viewport->camera.cibleY, viewport->camera.cibleZ, viewport->camera.angleX, viewport->camera.angleY, viewport->camera.angleZ ); /* Sauvegarde des informations sur les vues */ glGetDoublev( GL_MODELVIEW_MATRIX, viewport->modelview ); axes(); quadrillage(); dessinerScene( ptrDeb ); }
Ensuite je dessine tout les objets contenus dans ma liste chainée. Exemple avec un triangle :
Mais malheureusement, soit ça me génére hit = -1 quand je clique sur un objet, ce qui n'est déjà pas si mal
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void triangleSelect( t_objet* triangle, GLuint* buffer ) { glColor3f( triangle->couleur[0], triangle->couleur[1], triangle->couleur[2] ); glLoadName( triangle->id ); glBegin( GL_TRIANGLES ); glVertex3d( triangle->x[0], triangle->y[0], triangle->z[0] ); glVertex3d( triangle->x[1], triangle->y[1], triangle->z[1] ); glVertex3d( triangle->x[2], triangle->y[2], triangle->z[2] ); glEnd(); }, mais mais rien n'est exploitable dans le tableau buffer. Après quelques objets dessinés, hit devient bien égal à 1 quand je clique que un objet mais le tableau n'est toujours pas exploitable.
Je ne sais plus quoi faire...
Je fournis le code pour ceux que ça interesse. Merci d'avance ^^
Partager