Bonjour

en fait, je veux en cliquant sur une scene où j'ai des robots, recupéer les coord du pt de click pour ensuite lancer un rayon vers le click, calculer son intersection avec le sol ou se trouve ledit robot et verifier si je l'ai selectionné ou pas...

Mais gluUnProject est dur à utiliser, je n'ai pas saisi ttes les nuances
voici ma fonction dessin et celle qui recupere le clic de la souris

Merci pour tte aide
PS j'avais posté en http://www.developpez.net/forums/sho...53#post1685653
mais le sujet etait trop vieux et donc... personne n'a repondu

ciao

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
59
60
61
62
63
64
65
66
67
68
//---------------------------------------------------------------------------
void __fastcall TGL_Form::DrawScene()
{
 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
//  mix example
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glDisable(GL_TEXTURE_2D);
  glTranslatef(0, 0, -zpos);
 glRotatef(xrot,1,0,0);
 // dessine les 2 rectangles de surfaces de l'MRV
 if (ListeRobots[0][RobSel]->Type==TypeMRVlin) Draw2DPlots();
 //------- point de vision
  // marque "en altitude ypos" du point de vision
  glColor3d(1.0, 1.0, 0.0);
  glPushMatrix ();
   glScalef(zpos*0.5,zpos*0.5,zpos*0.5);
   glBegin( GL_TRIANGLES );
    glVertex3f( 0.0f, 0.0f, -0.1f);
    glVertex3f( 0.086f, 0.0f,  0.05f);
    glVertex3f(-0.086f, 0.0f,  0.05f);
   glEnd();
  glPopMatrix ();
  glTranslatef(0,-yv, 0);
  // marque au sol de l'ombre du point de vision
  glColor3d( 0.4, 0.4, 0.4);
  glPushMatrix ();
   glScalef(zpos*0.5,zpos*0.5,zpos*0.5);
   glBegin( GL_TRIANGLES );
    glVertex3f( 0.0f, 0.0f, -0.1f);
    glVertex3f( 0.086f, 0.0f,  0.05f);
    glVertex3f(-0.086f, 0.0f,  0.05f);
   glEnd();
  glPopMatrix ();
 //------- fin point de vision
  glRotatef(yrot,0,1,0);
  glTranslatef(-xv, 0, -zv);
 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  glCallList(Terrain);
 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
 glPushMatrix ();
  glRotatef (-90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0); // repere xy au sol !
// j'affiche le pt de mire
//http://www.developpez.net/forums/showthread.php?p=1599109#post1599109<br%20/>
  glDepthFunc (GL_ALWAYS);
  glPointSize (4);
  glBegin (GL_LINES);
   glColor4f (1,0,0,1);
   glVertex3f (mireX,mireY,mireZ); // Les coordonées récupérées
   glVertex3f (mireX0,mireY0,mireZ0); // Les coordonées récupérées
  glEnd ();
  glPointSize (20);
  glBegin (GL_POINTS);
   glColor4f (1,0,1,0);
   glVertex3f (mireX,mireY,mireZ); // Les coordonées récupérées
  glEnd ();
  glPointSize (1);
  glDepthFunc (GL_LESS);
  if (afficheRepere)   glCallList(Repere);
 // dessine les Robots
  for (int i=0; i<NRobots; i++)
        ListeRobots[0][i]->Dessine();
 glPopMatrix ();
 CalculateFrameRate();
 SwapBuffers(ghDC);
  UpDateStatusBar();
}
//---------------------------------------------------------------------------
et la recuperation des infos du click
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
59
60
61
62
63
64
65
//---------------------------------------------------------------------------
void __fastcall TGL_Form::FormMouseDown(TObject *Sender,
   TMouseButton Button, TShiftState Shift, int X, int Y)
{
 if (Button==mbLeft)
  {
  MouseMovesScreen=true;
  StatusBar->Panels->Items[1]->Text="Mouse moves screen";
  OldMouseX=X;
  OldMouseY=Y;
  // recherche du robot pointé
  glPushMatrix();
    glLoadIdentity();
    glTranslatef(0, 0, -zpos);
    glRotatef(xrot,1,0,0);
     // marque "en altitude ypos" du point de vision
     glTranslatef(0,-yv, 0);
     // marque au sol de l'ombre du point de vision
    //------- fin point de vision
    glRotatef(yrot,0,1,0);
    glTranslatef(-xv, 0, -zv);
     glRotatef (-90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0); // repere xy au sol !
   glGetDoublev (GL_MODELVIEW_MATRIX, modelview);
   glGetDoublev( GL_PROJECTION_MATRIX, projection );
   glGetIntegerv( GL_VIEWPORT, viewport );
   winX = X;
   winY = viewport[3] - Y;
// winZ=0;
   glReadPixels( (GLint) winX, (GLint)winY , 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
   gluUnProject( winX, winY, winZ, modelview, projection, viewport, &mireX, &mireY, &mireZ);
  glPopMatrix();
  // recherche d'un pt sur la meme droite de viion
  glPushMatrix();
    glLoadIdentity();
    glTranslatef(0, 0, -zpos);
    glRotatef(xrot,1,0,0);
     // marque "en altitude ypos" du point de vision
     glTranslatef(0,-yv, 0);
     // marque au sol de l'ombre du point de vision
    //------- fin point de vision
    glRotatef(yrot,0,1,0);
    glTranslatef(-xv, 0, -zv);
     glRotatef (-90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0); // repere xy au sol !
   glGetDoublev (GL_MODELVIEW_MATRIX, modelview);
   glGetDoublev( GL_PROJECTION_MATRIX, projection );
   glGetIntegerv( GL_VIEWPORT, viewport );
   winX = X;
   winY = viewport[3] - Y;
 winZ=0.0;
//   glReadPixels( (GLint) winX, (GLint)winY , 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
   gluUnProject( winX, winY, winZ, modelview, projection, viewport, &mireX0, &mireY0, &mireZ0);
  glPopMatrix();
  // mireX, mireY et mireZ retournées par gluUnProject sont vraiment des coordonées sur le terrain.
  StatusBar->Panels->Items[1]->Text=AnsiString("X="+IntToStr(X)+" Y="+ IntToStr(Y)
         +" mireX="+FloatToStr(mireX)+" mireY="+FloatToStr(mireY)+" mireZ="+FloatToStr(mireZ));
  }
 if (Button==mbRight)
  {
  MouseRotatesScreen=true;
  StatusBar->Panels->Items[1]->Text="Mouse rotates screen";
  OldMouseX=X;
  OldMouseY=Y;
  }
 
}