IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Recuperer coord du point du clic souris


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Par défaut Recuperer coord du point du clic souris
    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;
      }
     
    }

  2. #2
    Membre confirmé Avatar de Groove
    Inscrit en
    Décembre 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 97
    Par défaut
    Je n'ai pas regarder en detail mais il est clair que tu dois utiliser gluUnProject. Recupere la valeur du z, les coordonnees x, y de la souris et vois la position dans le monde comme la transformation totale de l'espace de l'ecran dans l'espace du monde du point p(x, y, z). Dans gluUnProject, il y a une inversion de matrice, donc c'est la transformation inverse du point p par rapport au transformation habituelle d'OpenGL...

  3. #3
    Membre confirmé Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Par défaut
    c'est ce que je fais et j'ai bien la coord du pt cliqué sur l'écran, mais à partir de ce point je veux faire partir un "rayon tracer" perpendiculaire ou qui vise vraiment l'objet que j'ai cliqué (c'est à dire ds la meme direction, ) et là non, il me donner le poitn de vision, j'ai l'impression que je dois annuler le type de projection( conique ou je ne sais quoi) pour avoir ce que je veux
    ???
    Ciao

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651

  5. #5
    Membre confirmé Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Par défaut
    merci mais j'avais deja vu tt ça
    le picking n'est pas ce qu'il me faut et
    Cependant il existe d'autres méthodes, qui fonctionnent tout aussi bien.


    La première méthode alternative consiste à transformer les coordonnées 2D du point dans l'espace 3D. Pour cela il suffit de lui faire subir les transformations inverses de celles qui sont appliquées aux objets 3D, ce qui donnera un rayon (et non un point unique, puisqu'on ajoute une dimension). Il suffira ensuite d'effectuer des tests d'intersection entre ce rayon et les objets de la scène afin de déterminer lequel se trouve sous le pointeur. La fonction gluUnproject permet de générer facilement un tel rayon.
    je n'arrive pas à avoir ce que je veux (voir post precedent)
    c'est pas evident
    mon pb est que si je garde la meme transformation que celle de la vision, je tombe sur une droit quo converge du pt de click sur l'ecran de projection vers le centre de vision (pointe du cone) ce que je veux pas
    je cherche la perpendiculaire à mon pt de click (celle qui transpercerai l'objet cliqué)

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    le picking n'est pas ce qu'il me faut
    Ah... Alors quelle est ta définition du picking, si ce n'est pas ça :
    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...
    mon pb est que si je garde la meme transformation que celle de la vision, je tombe sur une droit quo converge du pt de click sur l'ecran de projection vers le centre de vision (pointe du cone) ce que je veux pas
    je cherche la perpendiculaire à mon pt de click (celle qui transpercerai l'objet cliqué)
    Un petit schéma peut-être ? Parce que "pointe du cône" et "perpendiculaire au point de clic", c'est pas facile à se représenter si on n'est pas dans ta tête

Discussions similaires

  1. [Xlib]Recuperer clic souris et touches claviers
    Par Falcor dans le forum Linux
    Réponses: 21
    Dernier message: 30/10/2009, 18h27
  2. Recuperer variable selectionne clic souris
    Par Shivas dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/01/2009, 13h59
  3. Recuperer coordonnees lors d'un clic souris win32
    Par fayred dans le forum Windows
    Réponses: 3
    Dernier message: 18/10/2007, 18h40
  4. recuperer l'enregistrement d'un dbgrid pointe par la souris
    Par bidochon dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/09/2006, 15h32
  5. Réponses: 4
    Dernier message: 21/05/2004, 09h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo