Frage

Ich möchte das Mausrad in meinem OpenGL GLUT-Programm verwenden, um in eine Szene hinein- und herauszuzoomen?Wie mache ich das?

War es hilfreich?

Lösung 2

Beachten Sie, dass ehrwürdig Nate Robins GLUT Die Bibliothek unterstützt das Scrollrad nicht.Aber spätere Implementierungen von GLUT mögen FreeGLUT Tun.

Die Verwendung des Scrollrads in FreeGLUT ist kinderleicht.Hier ist, wie:

Deklarieren Sie eine Rückruffunktion, die immer dann aufgerufen werden soll, wenn das Scrollrad gescrollt wird.Das ist der Prototyp:

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

Registrieren Sie den Rückruf mit der (Free)GLUT-Funktion glutMouseWheelFunc().

glutMouseWheelFunc(mouseWheel);

Definieren Sie die Callback-Funktion.Der zweite Parameter gibt die Richtung des Scrollens an.Werte von +1 bedeuten vorwärts, -1 bedeutet rückwärts.

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

    return;
}

Das ist es!

Andere Tipps

Der glutMouseWheelFunc-Rückruf von Freeglut ist versionabhängig und in X nicht zuverlässig.Verwenden Sie die Standardmausfunktion und testen Sie die Tasten 3 und 4.

Die OpenGlut-Hinweise zum glutMouseWheelFunc-Status:

Aufgrund mangelnder Informationen über die Maus ist es zu diesem Zeitpunkt unmöglich, dies korrekt auf X zu implementieren.Die Verwendung dieser Funktion beschränkt die Portabilität Ihrer Anwendung.(Diese Funktion funktioniert auf X, nur nicht zuverlässig.) Sie werden aufgefordert, die Standard-Maus-Button-Berichterstattung und nicht die Rollereignisse zu verwenden.

Verwendung der Standard-GLUT-Maus-Berichterstellung:

#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);

Wie das OP feststellte, ist es „ganz einfach“.Er lag einfach falsch.

Beachten Sie Fall 3 und 4 in der folgenden Switch-Anweisung im MouseClick-Rückruf

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top