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 :

Problème de souris


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 31
    Par défaut Problème de souris
    Bonjour à tous,

    J'essaye présentement de créer un petit menu de jeu en OpenGL et j'essaye d'avoir un curseur qui suit les mouvement de la souris. J'ai essayer d'aller chercher la position de la souris avec WM_mousemove mais je ne réussit jamais à faire suivre mon curseur parfaitement, il y a toujours un petit décalage avec la vrai souris.

    Alors j'aimerais trouver une manière de faire suivre ma forme au mouvement de la souris. J'ai vu plusieurs forum qui disait d'utiliser la fonction glutPassiveMotionFunc mais je ne trouve jamias comment l'implémenter correctement car je voudrais convertir les coordonnées de ma souris en coordonnée opengl pour pouvoir l'utiliser dans une fonction translatef(x,y,z).

    Si vous connaissez une meilleur manière n'hésiter pas à l'écrire ici.

    Merci,

    Maxetime

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par maxetime
    Bonjour à tous,

    J'essaye présentement de créer un petit menu de jeu en OpenGL et j'essaye d'avoir un curseur qui suit les mouvement de la souris. J'ai essayer d'aller chercher la position de la souris avec WM_mousemove mais je ne réussit jamais à faire suivre mon curseur parfaitement, il y a toujours un petit décalage avec la vrai souris.

    Alors j'aimerais trouver une manière de faire suivre ma forme au mouvement de la souris. J'ai vu plusieurs forum qui disait d'utiliser la fonction glutPassiveMotionFunc mais je ne trouve jamias comment l'implémenter correctement car je voudrais convertir les coordonnées de ma souris en coordonnée opengl pour pouvoir l'utiliser dans une fonction translatef(x,y,z).

    Si vous connaissez une meilleur manière n'hésiter pas à l'écrire ici.

    Merci,

    Maxetime
    Vu que tu as parlé de Glut, je t'ai fait un petit programme qui le fait. J'ai pris le pire scénario possible :

    Ta scéne de base est en vue perspective et tu veux coller une souris en vue orthogonale.

    A savoir :

    - Tu as parlé de Glut donc j'ai fait le programme en Glut
    - Pour un jeu avec des animations, SDL est tout de même plus adapté
    - Pour un jeu tour à tour, Glut fait bien l'affaire.

    Bref, voici le code, si tu ne comprends pas certaines parties, pose des questions :

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    #include <GL/glut.h>
    #include <iostream>
    #include <stdlib.h>
    const int LARGEUR_FENETRE = 800;
    const int HAUTEUR_FENETRE = 600;
    const int LARGSOURIS = 20;
    const int HAUTSOURIS = 20;
    int g_mx=0, g_my=0;
    int g_w, g_h;
    double g_anglex=0.0f;
     
    //fonctions ci-dessous servent pour afficher le texte
    void reshape(GLint w, GLint h) 
    {
      g_w = w;
      g_h = h;
     
      glViewport(0, 0, g_w, g_h);
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      gluPerspective(65.0, (float)g_w / g_h, 1, 1000);
      glMatrixMode(GL_MODELVIEW);
    }
     
    void mousemotion(int x, int y)
    {
        g_mx = x;
        g_my = y;
        glutPostRedisplay();
    }
     
    //fonctions ci-dessous servent pour afficher le texte
    void Graphique_SetOrthographicProjection() 
    {
        //Sauvegarde de la matrice MODELVIEW
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
     
        // Passer dans le mode projection
        glMatrixMode(GL_PROJECTION);
        //Sauvegarde de la matrice PROJECTION    
        glPushMatrix();
        glLoadIdentity();
     
        // Mettre en place une perspective orthogonale
        gluOrtho2D(0,g_w, g_h, 0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
     
    void Graphique_ResetPerspectiveProjection() 
    {
        glMatrixMode(GL_PROJECTION);
        //On remet la matrice de PROJECTION
        glPopMatrix();
     
        glMatrixMode(GL_MODELVIEW);
        //On remet la matrice de MODELVIEW 
        glPopMatrix();
    }
     
    void dessine_souris()
    {
       Graphique_SetOrthographicProjection();
       glColor3f(1.0,1.0,1.0);
       glBegin(GL_QUADS);
            glVertex2i(g_mx, g_my);
            glVertex2i(g_mx+LARGSOURIS, g_my);
            glVertex2i(g_mx+LARGSOURIS,g_my + HAUTSOURIS);
            glVertex2i(g_mx, g_my+HAUTSOURIS);
       glEnd();
       Graphique_ResetPerspectiveProjection();
    }
     
    void display()
    {
           // Enleve la couleur
           glClear(GL_COLOR_BUFFER_BIT);
           glLoadIdentity();
     
     
           glColor3f(1.0,1.0,1.0);
     
           //Rendu de la scene
           glTranslatef(0.0,0.0,-5.0);
           glRotatef(g_anglex,1.0,0.0,0.0);
     
           glutWireTeapot(1);
     
           //Rendu de la souris
           dessine_souris();
     
           //On tourne un peu
           g_anglex += 0.1;
           // On echange les tampon
           glutSwapBuffers();
    }
     
    int main(int argc, char **argv)
    {
        glutInit(&argc,argv);
        glutInitWindowSize (LARGEUR_FENETRE,HAUTEUR_FENETRE);
        glutInitDisplayMode ( GLUT_RGB | GLUT_DOUBLE);
        glutCreateWindow ("Exemple souris");
     
        glutDisplayFunc(display);
        glutMotionFunc(mousemotion);
        glutPassiveMotionFunc(mousemotion);
        glutReshapeFunc(reshape);
     
        glutMainLoop();
        return EXIT_SUCCESS;
    }
    Jc

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,
    c'est super utile comme petit bout de code.
    Il faudrait le mettre quelque part afin que tous le monde y ait accés... cela me semble un problème déjà posé plusieurs fois...
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par ToTo13
    Bonjour,
    c'est super utile comme petit bout de code.
    Il faudrait le mettre quelque part afin que tous le monde y ait accés... cela me semble un problème déjà posé plusieurs fois...


    Je pense effectivement qu'on pourrait le mettre en temps que source ou dans un tutoriel ou les deux.

    Pour le moment il restera ici mais bientôt il se retrouvera à un endroit digne de ce nom

    Pour compléter :

    Si vous voulez ensuite enlever la souris de base pour n'avoir plus que celle rendu par la fonction dessine_souris, alors il suffit d'ajouter un appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glutSetCursor(GLUT_CURSOR_NONE);
    dans le main...

    Jc

  5. #5
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Sinon, pour chaque frame calculée, tu appels GetCursorPos qui va te retourner la position de la souris.

    Moins de messages à traiter, et cela évite l’utilisation massive du processeur pour envoyer des milliers de message.

    D’ailleurs petite expérience « rigolote » (ok je rigole pour rien), ouvre un explorer Windows, ouvre un répertoire qui peut être scrollé, ouvre le gestionnaire des tâches, moniteur l’utilisation du CPU, maintenant saisi ta scrollbar, et bouge la de haut en bas… regarde l’utilisation CPU, à chaque message tout est recalculé, ce qui fait flamber l’utilisation du CPU.

  6. #6
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Sans glut sous Windows


  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Ti-R
    Sinon, pour chaque frame calculée, tu appels GetCursorPos qui va te retourner la position de la souris.

    Moins de messages à traiter, et cela évite l’utilisation massive du processeur pour envoyer des milliers de message.
    Cela fonctionne sous windows seulement, je pense qu'il doit avoir un équivalent sous *Nux mais je préfére perdre un peu de CPU et garder le code portable (ensuite si je cherche à optimiser, c'est une autre histoire)...

    D’ailleurs petite expérience « rigolote » (ok je rigole pour rien), ouvre un explorer Windows, ouvre un répertoire qui peut être scrollé, ouvre le gestionnaire des tâches, moniteur l’utilisation du CPU, maintenant saisi ta scrollbar, et bouge la de haut en bas… regarde l’utilisation CPU, à chaque message tout est recalculé, ce qui fait flamber l’utilisation du CPU.
    Faudrait que j'essaie lorsque je me trouve devant un ordi Windows

  8. #8
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Je n’ai rien contre Glut, qui est portable et tout
    Je l'ai souvent utilisé d'ailleurs pour sa simplicité.

    C'est juste que sous Windows avec l'API win32, peut être que cela serait mieux pour maxetime, ensuite c'est plus goût et couleur, et pour quelque chose de portable ta solution est bien meilleur !

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 31
    Par défaut
    Salut,

    Merci pour se code,
    mais il me donne l'erreur suivant lorsque j'essaye de le construire (je l'ai essayé dans un nouveau programme)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Linking...
    LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
    Debug/Menu.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.
    Et j'ai une deuxième question est-ce possible d'utiliser glut même si on ne l'utilise pas pour créer notre fenêtre. (si elle est creer avec API windows par exemple)

    Voila,

    Maxetime

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

Discussions similaires

  1. Problème de souris folle
    Par firaponte dans le forum Périphériques
    Réponses: 20
    Dernier message: 01/08/2007, 15h29
  2. Xubuntu, problème de souris
    Par LinuxUser dans le forum Ubuntu
    Réponses: 1
    Dernier message: 26/06/2007, 16h42
  3. Problème de souris avec mandriva 10.1 en live
    Par ChPr dans le forum Mandriva / Mageia
    Réponses: 7
    Dernier message: 29/04/2007, 15h33
  4. Problème clavier/souris sans fil logitech
    Par arnaud_verlaine dans le forum Windows XP
    Réponses: 4
    Dernier message: 20/12/2006, 10h48
  5. Problème de souris (TouchPad)
    Par Loceka dans le forum Périphériques
    Réponses: 2
    Dernier message: 23/09/2005, 23h02

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