Question

Je souhaite utiliser la molette de la souris dans mon programme OpenGL GLUT pour zoomer et dézoomer sur une scène ?Comment je fais ça?

Était-ce utile?

La solution 2

Notez que le vénérable Le GLUT de Nate Robin la bibliothèque ne prend pas en charge la molette de défilement.Mais, les implémentations ultérieures de GLUT comme GratuitGLUT faire.

Utiliser la molette de défilement dans FreeGLUT est extrêmement simple.Voici comment:

Déclarez une fonction de rappel qui doit être appelée chaque fois que la molette de défilement défile.Voici le prototype :

void mouseWheel(int, int, int, int);

Enregistrez le rappel avec la fonction (Free)GLUT glutMouseWheelFunc().

glutMouseWheelFunc(mouseWheel);

Définissez la fonction de rappel.Le deuxième paramètre donne le sens du défilement.Les valeurs de +1 correspondent à l'avant, celles de -1 à l'arrière.

void mouseWheel(int button, int dir, int x, int y)
{
    if (dir > 0)
    {
        // Zoom in
    }
    else
    {
        // Zoom out
    }

    return;
}

C'est ça!

Autres conseils

Le rappel glutMouseWheelFunc de Freeglut dépend de la version et n'est pas fiable dans X.Utilisez la fonction de souris standard et testez les boutons 3 et 4.

Les notes d'OpenGlut sur l'état glutMouseWheelFunc :

En raison du manque d'informations sur la souris, il est impossible de l'implémenter correctement sur X pour le moment.L'utilisation de cette fonction limite la portabilité de votre application.(Cette fonctionnalité fonctionne sur X, mais pas de manière fiable.) Vous êtes encouragé à utiliser les rapports standard et fiables de souris, plutôt que sur les événements de roue.

Utilisation des rapports de souris GLUT standard :

#include <GL/glut.h>

<snip...>

void mouse(int button, int state, int x, int y)
{
   // Wheel reports as button 3(scroll up) and button 4(scroll down)
   if ((button == 3) || (button == 4)) // It's a wheel event
   {
       // Each wheel event reports like a button click, GLUT_DOWN then GLUT_UP
       if (state == GLUT_UP) return; // Disregard redundant GLUT_UP events
       printf("Scroll %s At %d %d\n", (button == 3) ? "Up" : "Down", x, y);
   }else{  // normal button event
       printf("Button %s At %d %d\n", (state == GLUT_DOWN) ? "Down" : "Up", x, y);
   }
}

<snip...>

glutMouseFunc(mouse);

Comme l'a déclaré le PO, c'est "très simple".Il avait tout simplement tort.

observez les cas 3 et 4 dans l'instruction switch ci-dessous dans le rappel mouseClick

glutMouseFunc(mouseClick);

...

void mouseClick(int btn, int state, int x, int y) {
  if (state == GLUT_DOWN) {
    switch(btn) {
    case GLUT_LEFT_BUTTON:
      std::cout << "left click at: (" << x << ", " << y << ")\n";
      break;
    case GLUT_RIGHT_BUTTON:
      std::cout << "right click at: (" << x << ", " << y << ")\n";
      break;
    case GLUT_MIDDLE_BUTTON:
      std::cout << "middle click at: (" << x << ", " << y << ")\n";
      break;
    case 3:  //mouse wheel scrolls
      std::cout << "mouse wheel scroll up\n";
      break;
    case 4:
      std::cout << "mouse wheel scroll down\n";
      break;
    default:
      break;
    }
  }
  glutPostRedisplay();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top