Utilizzando la rotellina del mouse in GLUT
-
08-06-2019 - |
Domanda
Voglio utilizzare la rotella del mouse nel mio programma OpenGL GLUT per ingrandire e rimpicciolire una scena?Come lo faccio?
Soluzione 2
Nota che la venerabile la libreria GLUT di Nate Robin non supporta la rotellina di scorrimento. Tuttavia, le successive implementazioni di GLUT come FreeGLUT lo fanno.
L'uso della rotella di scorrimento in FreeGLUT è semplicissimo. Ecco come:
Dichiara una funzione di callback che deve essere chiamata ogni volta che si fa scorrere la rotella di scorrimento. Questo è il prototipo:
void mouseWheel(int, int, int, int);
Registra il callback con la funzione (Free) GLUT glutMouseWheelFunc () .
glutMouseWheelFunc(mouseWheel);
Definisce la funzione di richiamata. Il secondo parametro fornisce la direzione dello scorrimento. I valori di +1 sono avanti, -1 è indietro.
void mouseWheel(int button, int dir, int x, int y)
{
if (dir > 0)
{
// Zoom in
}
else
{
// Zoom out
}
return;
}
Questo è tutto!
Altri suggerimenti
Il callback glutMouseWheelFunc di Freeglut dipende dalla versione e non è affidabile in X. Utilizzare la funzione mouse standard e testare i pulsanti 3 e 4.
Le note di OpenGlut sullo stato glutMouseWheelFunc:
A causa della mancanza di informazioni sul mouse, è impossibile implementarlo correttamente su X in questo momento. Uso di questa funzione limita la portabilità della tua applicazione. (Questa funzione funziona su X, ma non in modo affidabile.) Sei incoraggiato a utilizzare lo standard, reportistica affidabile tramite pulsante del mouse, anziché eventi su ruote.
Uso del report GLUT standard sul mouse:
#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);
Come affermato dal PO, è "morto semplice". Aveva solo torto.
osserva i casi 3 e 4 nella seguente istruzione switch nel callback 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();
}