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