Verwendung des Mausrads in GLUT
-
08-06-2019 - |
Frage
Ich möchte das Mausrad in meinem OpenGL GLUT-Programm verwenden, um in eine Szene hinein- und herauszuzoomen?Wie mache ich das?
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();
}