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 :

Détection des coordonnées de la souris avec OpenGL


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Par défaut Détection des coordonnées de la souris avec OpenGL
    Bonjour,
    Comment détecter les coordonnées de la souris et les transformer en coordonnées OpenGL?

  2. #2
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Par défaut
    bonjour,

    dans quel langage de programmation travail tu ?

    voila un exemple pour JOGL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int x = e.getX();
        int y = e.getY();
        Dimension size = e.getComponent().getSize();
     
        float thetaY = 360.0f * ( (float)(x-prevMouseX)/(float)size.width);
        float thetaX = 360.0f * ( (float)(prevMouseY-y)/(float)size.height);
     
        prevMouseX = x;
        prevMouseY = y;
     
        view_rotx += thetaX;
        view_roty += thetaY;
    sinon avec C++ tu peut utiliser les fonction de la SDL

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Par défaut
    OpenGL n'a aucune connaissance des inputs clavier/souris, ce sont des librairies de plus haut niveau qui fournissent ces données (glut, SDL, DirectInput, serveur X, ...)

    Avec quelle librairie initialises-tu OpenGL ?

    Concernant la transformation en coordonnées OpenGL, que souhaites-tu faire exactement ? De la sélection d'objet ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Par défaut
    Merci pour vos réponse,
    En fait j'utilise JOGL.
    J'ai implémenté un exemple qui existe sur le net. Il permet de détecter les coordonnées de la souris (avec mouse move par exemple), mais il donne des coordonnées à la mains pour z (o ou 1) pour pouvoir calculer x et y.
    J'ai trouvé dans l'exemple ici de nehe une instruction "glReadPixels()" pour calculer la valeur de Z. Mais j'ai toujours un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-1" javax.media.opengl.GLException: pack pixel_buffer_object must be enabled to call this method
    Je sais pas comment activer le pixel_buffer_object.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Par défaut
    J'ai utilisé le code suivant pour détecter la position x, y, z de la souris:
    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
     
     public void mouseMoved(MouseEvent e) 
        {  
        	mouseX= e.getX();
        	mouseY = e.getY();
        	mouseZ=0;
                /* note viewport[3] is height of window in pixels */
                realy = viewport[3] - (int) mouseY - 1;
                glu.gluUnProject((double) mouseX, (double) realy,buffer.getFloat(0), //
                    mvmatrix, 0,
                    projmatrix, 0, 
                    viewport, 0, 
                    wcoord, 0);
                DecimalFormat df = new DecimalFormat ( ) ; 
                df.setMaximumFractionDigits ( 3 ) ; //arrondi à 2 chiffres apres la virgules 
               // df.setMinimumFractionDigits ( 3 ) ; 
                //df.setDecimalSeparatorAlwaysShown ( true ) ; 
     
                CoordinatesTextField.setText(
                		df.format(wcoord[0] + model3D.getBarycenter().getX())+"; " + 
                		df.format(wcoord[1] +model3D.getBarycenter().getY())+ "; " + 
                		df.format(wcoord[2]+model3D.getBarycenter().getZ())
                		);
        }
    Sachant que la valeur de depth est calculée en utilisant l'instruction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl.glReadPixels( mouseX, (int)mouseY, 1, 1, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT, buffer );
    Mais en bougeant la souris, que X et Y changenet et Z reste fixe. Et lorsque je fais une rotation du modèle j'ai toujours les mèmes X, et Y. Donc, les coordonnées sont prises par rapport à l'écran et non pas par rapport au modèle. Avez vous une idée comment peut-on corriger ces problémes.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Par défaut
    Le probléme est résolu, et voilà le code pour ceux qui sont intéressés. Il s'agit d'une fonction qui stocke les coordonnées de la souris dans un JtextField:
    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
     
    void GetOGLPos(int x, int y, JTextField textField)
    	{
    		double winX, winY,winZ;
    		java.nio.ByteBuffer buffer = BufferUtil.newByteBuffer(4); 
    		double position[]=new double[3];;
     
    		gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);
            gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, mvmatrix, 0);
            gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, projmatrix, 0);
            gl.glEnable(GL.GL_DEPTH_TEST);
    		winX = (float)x;
    		winY = (float)viewport[3] - (float)y;
    		gl.glReadPixels( x, (int)winY, 1, 1, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT, buffer );
     
    		glu.gluUnProject((double) winX, (double) winY, (double)buffer.getFloat(), //
    	              mvmatrix, 0,
    	              projmatrix, 0, 
    	              viewport, 0, 
    	              position, 0);
     
    		 DecimalFormat df = new DecimalFormat ( ) ; 
             df.setMaximumFractionDigits ( 3 ) ; //arrondi à 2 chiffres apres la virgules           
    	     textField.setText(
            		df.format(position[0] + model3D.getBarycenter().getX())+" || " + 
            		df.format(position[1] +model3D.getBarycenter().getY())+ " || " + 
            		df.format(position[2]+model3D.getBarycenter().getZ())
            		);
    	}
     
     
    }  // End class

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/06/2011, 16h36
  2. Réponses: 1
    Dernier message: 27/10/2008, 07h28
  3. Récupération des coordonnées de la souris
    Par kabil.cpp dans le forum MFC
    Réponses: 11
    Dernier message: 23/05/2008, 06h43
  4. Souris avec Opengl
    Par MProg dans le forum OpenGL
    Réponses: 2
    Dernier message: 23/11/2006, 21h49

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