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 :

Selection d'un point sur un terrain avec la souris en OpenGL


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 13
    Points
    13
    Par défaut Selection d'un point sur un terrain avec la souris en OpenGL
    Bonjour à toutes et à tous.

    Je suis tout a fait nouveau sur le site et j'ai un petit problème de sélection en OpenGL.

    J'ai déjà vu les conversation à ce sujet qui m'ont aiguillé dans mes développement mais il me reste un truc à résoudre.

    J'utilise le code source fourni par Nehe pour la sélecdtion d'un point sur un terrain avec la souris.
    http://nehe.gamedev.net/data/article...asp?article=13

    Je récupère les coordonées X, Y et Z et j'ai eu vraiment du mal à comprendre comment représenter mon marqueur sur le terrain.

    J'utilise ce code pour afficher ma sphère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	glPushMatrix();
    	glLoadIdentity ();
    	glTranslated(X, Y, Y);
    	glColor4f (1,0,0,1);
    	gluSphere (quadObjLight,4,8,8);
    	glPopMatrix();
    Ce code fonctionne très bien, mais is je retire glLoadIdentity les coordonées semblent abérantes.

    Je pensait que les coordonées X, Y et Z renvoyée par la fonction gluUnProject étaient vraiment des coordonées sur mon terrain mais il semble que non mais plutot un vecteur de translation par rapport à la caméra ou je ne sais quoi.

    Avez vous une idée pour transformer ces coordonée X, Y et Z renvoyée par gluUnProject en coordonée réelles sur le terrain et donc par rapport à l'axe 0,0,0 de mon monde.

    En espérant me faire comprendre.

    Cordialement.

    Sam

  2. #2
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 528
    Points : 5 198
    Points
    5 198
    Par défaut
    salut et bienvenue

    si ça peux te rassurer, tu fais partie des nombreuses personnes à avoir des problèmes à l'utilisation de gluUnProject

    normalement tu récupères les coordonnées réelles sur ton terrain
    pour cela, il faut que tu récupères correctement les matrices que tu passes en paramètre

    logiquement, les valeurs que tu récupères indiquent le point que tu as indiqué mais non projeté (d'où le unproject), et si tu veux placer une sphère dans ta vue en 3D par rapport aux coordonnées 2D, alors tu dois appliquer à ton résultat les mêmes transformations qu'il y a dans les matrices que tu as envoyé à gluUnProject

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 118
    Points : 118
    Points
    118
    Par défaut
    http://pyopengl.sourceforge.net/docu...roject.3G.html

    Ton point est exprimer en coordonnées homogène dans la matrice de la caméra(comme indiqué sur le lien, la valeur w n'est pas renvoyer mais doit valeur dans ton cas 1).

    Ensuite, si tu veut la coordonnée de ton point dans le repère de ton terrain, tu doit la multiplier par la matrice de ta caméra et la tu aura ces coordonnées global.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Oui, j'ai vu ça apparement je ne suis pas le seul à avoir des problème avec la fonction gluUnProject.

    Bon déjà merci pour vos réponses, mais je ne suis pas sur de bien comprendre.

    Après avoir récupéré les coordonées avec gluUnProject, je dois ensuite effectuer une transformation de ces coordonées en utilisant la matrice de ma caméra ? Mais en fait je pensais que le code fourni par Nehe se suffisait à lui même ?

    Je n'ai pas encore implémenté de caméra, j'ai commencé mon rendu OpenGL par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		glTranslatef(xt,yt,zt);
    		glRotatef(wAngleX, 1.0f, 0.0f, 0.0f);
    		glRotatef(wAngleY, 0.0f, 1.0f, 0.0f);
    		glRotatef(wAngleZ, 0.0f, 0.0f, 1.0f);
    La question que je pose,
    dois je faire un glGetFloatv (GL_MODELVIEW_MATRIX,MaMatrice de 16)
    pour obtenir la matrice de ma vue pour ensuite transformer les points X,Y et Z de gluUnProject avec cette matrice ?

    J'ai déjàa essayé plein de truc comme
    - une rotation des coordonées X,Y et Z avec la matrice GL_MODELVIEW_MATRIX
    - une rotation avec la matrice inverse
    - une translation etc..
    Sans aucun succès.

    Sam

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Bon alors du nouveaux,

    Effectivement j'ai compris maintenant que les coordonées renvoyées par gluUnProject sont:
    - X et Y données par rapport au centre de ma caméra et donc par rapport au centre de mon écran.
    - Z est la distance entre la surface de mon ecran (le plan) et le point sélectionné sur le terrain.

    Ce que je fais ensuite je crée un vecteur
    (X,0,Z) car la coordonées Y me sera données par une méthode du genre GetElevation (X,Z)

    Puis je multiplie mon vecteur (X,0,Z) par la matrice de la camméra pour l'orienter dans le même sens que ma caméra.

    Puis j'ajoute les coordonées x,y,z de ma caméra et jusqu'à là ça me semble assez logique mais le résultat n'est super significatif.

    Le problème c'est que Z renvoyé par gluUnProject est toujours négatif.

    Vous n'avez pas une petite idée ?

    Sam

  6. #6
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 528
    Points : 5 198
    Points
    5 198
    Par défaut
    Citation Envoyé par Lejumeau
    Le problème c'est que Z renvoyé par gluUnProject est toujours négatif.
    l'axe Z est dirigé vers toi non ?
    donc le fond de ta vue part dans les Z négatifs
    logique

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Bon pour la suite

    voici une petite image ou je vous demande votre avis




    Donc voici ce que j'ai compris.


    Schéma 1.
    Les coordonées renvoyées par gluUnProject sont X et Y dans le repère de ma caméra et donc
    c'est la distance qui sépare le point P cliqué à l'écran du centre de la caméra.

    Pour transformer ces coordonées sur le terrain, pourriez vous me dire si mon raisonnement est correcte.

    Schéma 2.) Les coordonées X et Y sont considérés dans un repère comme si la caméra avait aucune rotation ni translation.

    Schéma 3.) ensuite je multiplie X et Y par ma matrice de rotation de ma caméra

    Schéma 4.) ensuite j'applique une translation en fonction des coordonées de ma caméra.

    Schéma 5.) puis selon mon vecteur d'orientation V de ma caméra j'applique une translation de distance Z la troisième valeur renvoyée par gluUnProject.
    En là en théorie je devrais obtenir les coordonées du point P' qui est en fait les coordonées réelles sur mon terrain.

    J'ai avancé un peu plus avec ce raisonnement mais j'ai encore quelques surprises.

    La distance Z renvoyé par gluUnProject doit - elle subir les effets de la transformation (rotation, translation etc) ?

    Je l'utilise comme Distance essentiellement et quelque soit son signe j'effectue le calcul du point p' selon cette méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                // cam.dx,dy et dz est mon vecteur V de direction.
     
    	Pprime.x = P.x + cam.dx * fabs (Z);
    	Pprime.y = P.y + cam.dy * fabs (Z);
    	Pprime.z = P.z + cam.dz * fabs (Z);

    Une autre petite question.
    Au risque d'avoir l'air con, la matrice GL_MODELVIEW_MATRIX, contient -elle toutes les informations de rotation et de translation de ma caméra ?



    Sam

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    J'ai donc réussi à sélectionner un point sur le terrain.
    J'ai mis du temps à piger certaine chose mais j'y suis enfin arrivé.

    Pour la petite histoire, hier soir je me suis décidé à vérifier le contenu de cette putain de matrice GL_MODELVIEW_MATRIX !!!
    Et qu'elle a été ma surprise, d'avoir une matrice initialisée à son identité.
    1 0 0 0
    0 1 0 0
    0 0 1 0
    0 0 0 1

    En fait lorsque j'appelle ma fonction ProjectMousse c'est depuis une méthode OnMouseMove d'une fenêtre Windows.
    A ce moment la matrice GL_MODELVIEW_MATRIX est initialisée à son identité.
    J'ai donc ajouté un glGetDoublev( GL_MODELVIEW_MATRIX, modelview); juste après le gluLookAt dans ma méthode qui permet de dessiner ma vue. Je sais qu'à ce moment la matrice sera initialisée avec des informations d'angle et de déplacement valides.

    Un peu plus tard, ma méthode ProjectMousse qui permet de calculer les coordonées 3D sur le terrain avec gluUnProject, utilise les données de la matrice sauvegardée au moment du dessin

    Voici le code finale de ma méthode
    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
     
    // x et y sont les coordonnées de ma souris
    //
    // quelque part j'ai déclaré 
    // float winX,winY,winZ
    // float X,Y,Z les futurs coordonées sur le terrain
    // GLint viewport[4];
    // GLdouble modelview[16];
    // GLdouble projection[16];
    void COpenglView::ProjectMousse (int x,int y)
    {
    	glGetDoublev( GL_PROJECTION_MATRIX, projection );
    	glGetIntegerv( GL_VIEWPORT, viewport );
     
    	winX = (float) x;
    	winY = (float) viewport[3] - (float) y;
     
    	glReadPixels( (GLint) winX, (GLint)winY , 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
    	gluUnProject( winX, winY, winZ, modelview, projection, viewport, &X, &Y, &Z);
     
    	// X, Y et Z retournées par gluUnProject sont vraiment des coordonées sur le terrain.
     
    }
    Sinon il est possible d'extraire la matrice de vue seulement au moment opportun en effectuant un PushMatrix, puis en positionnant la caméra, puis un PopMatrix comme 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
    void COpenglView::ProjectMousse (int x,int y)
    {
    	glPushMatrix();
    	gluLookAt (cam.x,	cam.y,	cam.z,	cam_xview,	cam_yview,	cam_zview,	0,1,0);
    
    	glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
    	glGetDoublev( GL_PROJECTION_MATRIX, projection );
    	glGetIntegerv( GL_VIEWPORT, viewport );
    
    	winX = (float) x;
    	winY = (float) viewport[3] - (float) y;
    
    	glReadPixels( (GLint) winX, (GLint)winY , 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
    	gluUnProject( winX, winY, winZ, modelview, projection, viewport, &X, &Y, &Z);
    
    	glPopMatrix();
    }


    La portion de code me permettant d'afficher le point sur le terrain est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	glDepthFunc (GL_ALWAYS);
    	glPointSize (4);
    	glBegin (GL_POINTS);
    		glColor4f (1,0,0,1);
    		glVertex3f (X,Y,Z); // Les coordonées récupérées
    	glEnd ();
    	glPointSize (1);
    	glDepthFunc (GL_LESS);
    Voila avec perséverrance ..., mais franchement ca fait deux semaines que j'y suis et je commençais à en avoir plein le ... enfin vous aurez compris

  9. #9
    Membre régulier Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Points : 75
    Points
    75
    Par défaut
    bonjour

    j'essaye la meme chose que vous mais les coord renvoyés sont nuls :

    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
    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();
    //   gluLookAt (cam.x, cam.y, cam.z, cam_xview, cam_yview, cam_zview, 0,1,0);
       gluLookAt(10.0,2.0,3.0,0.0,0.0,0.0,0.0,1.0,0.0);
       glGetDoublev( GL_PROJECTION_MATRIX, projection );
       glGetIntegerv( GL_VIEWPORT, viewport );
       winX = X;
       winY = viewport[3] - Y;
       glReadPixels( (GLint) winX, (GLint)winY , 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
       gluUnProject( winX, winY, winZ, modelview, projection, viewport, &mireX, &mireY, &mireZ);
        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));
      }
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // mire
     GLdouble mireX,mireY,mireZ;  //  les futurs coordonées sur le terrain
     GLdouble winX,winY,winZ;
     GLint viewport[4];
     GLdouble modelview[16];
     GLdouble projection[16];
    (il n'a pas accepté les float) mais je ne pense pas que le pb vient de là
    sous C++Builer BDS2006

    il me donne des mire X Y Z nuls, alors que les winX sont bons et que la matrices projection contient qqe' chose mais si c'est "sparse"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    GLvoid TGL_Form::resize( GLsizei width, GLsizei height )
    {
     glViewport(0,0,width,height);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     gluPerspective(45,float(width)/float(height),0.01,100);
     glMatrixMode(GL_MODELVIEW);
      DrawScene(); // ma fonction de dessin, je n'ai pas de gluLookAt mais uniquement des rotation / translation % à la vue par defaut.
    }

    une idée ?
    merci

  10. #10
    Membre régulier Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Points : 75
    Points
    75
    Par défaut
    j'ai essayé ça (mettre mes matrices de rot, trans de vue) aussi mais sans succes, les coord ne sont pas bonnes
    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
    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 !
    //   gluLookAt (cam.x, cam.y, cam.z, cam_xview, cam_yview, cam_zview, 0,1,0);
    //   gluLookAt(10.0,2.0,3.0,0.0,0.0,0.0,0.0,1.0,0.0);
       glGetDoublev (GL_MODELVIEW_MATRIX, modelview);
       glGetDoublev( GL_PROJECTION_MATRIX, projection );
       glGetIntegerv( GL_VIEWPORT, viewport );
       winX = X;
       winY = viewport[3] - Y;
       glReadPixels( (GLint) winX, (GLint)winY , 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
       gluUnProject( winX, winY, winZ, modelview, projection, viewport, &mireX, &mireY, &mireZ);
      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));
      }
    l'appli est sur : Lien

  11. #11
    Membre régulier Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Points : 75
    Points
    75
    Par défaut
    encore pas resolu
    je veux tracer un vecteur entre mon point (correctement obtenu en coord reels) et un pt ds la direction du clic (pour avoir le vecteur)
    et c'est ce dernier que je n'ai pas, tt ce que je pexu avoir c'est le point de vision (centre)
    en effet, je n'utilise pas de camera mais je tourne tous autour
    comme suit :
    Drawscene :
    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
     
    //---------------------------------------------------------------------------
    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);
     
    //------- 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();
    }
    la determination du point Mire et Mire0 du vecteur recherché
    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
    //---------------------------------------------------------------------------
    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.5;
    //   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));
      }
    une idée ?

Discussions similaires

  1. Récupérer les coordonnées de points d'une surface avec la souris
    Par ijnuhbygv dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 06/08/2011, 01h57
  2. Selection d'une figure dans un panneau avec la souris
    Par Geo34 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 16/12/2010, 17h25
  3. Réponses: 0
    Dernier message: 22/02/2010, 01h59
  4. séléctionner le point d'une courbe avec la souris et un axe
    Par maristil dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 10/04/2009, 11h57
  5. Dessiner un point sur un pixmap avec GTK2
    Par jijiz dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 14/04/2008, 17h52

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