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 :

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 );
 
}
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
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 );
}
Donc la matrice et le viewport sont toujours à jour.

Ensuite je dessine tout les objets contenus dans ma liste chainée. Exemple avec un triangle :

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 malheureusement, soit ça me génére hit = -1 quand je clique sur un objet, ce qui n'est déjà pas si mal , 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 ^^