Usando la rueda de desplazamiento del mouse en GLUT
-
08-06-2019 - |
Pregunta
¿Quiero usar la rueda de desplazamiento del mouse en mi programa OpenGL GLUT para acercar y alejar una escena?¿Cómo puedo hacer eso?
Solución 2
Tenga en cuenta que venerable El GLUT de Nate Robin La biblioteca no admite la rueda de desplazamiento.Pero, implementaciones posteriores de GLUT como GratisGLUT hacer.
Usar la rueda de desplazamiento en FreeGLUT es muy sencillo.Aquí es cómo:
Declare una función de devolución de llamada que se llamará cada vez que se desplace la rueda de desplazamiento.Este es el prototipo:
void mouseWheel(int, int, int, int);
Registre la devolución de llamada con la función (Free)GLUT glutMouseWheelFunc().
glutMouseWheelFunc(mouseWheel);
Defina la función de devolución de llamada.El segundo parámetro da la dirección del desplazamiento.Los valores de +1 son hacia adelante, -1 son hacia atrás.
void mouseWheel(int button, int dir, int x, int y)
{
if (dir > 0)
{
// Zoom in
}
else
{
// Zoom out
}
return;
}
¡Eso es todo!
Otros consejos
La devolución de llamada glutMouseWheelFunc de Freeglut depende de la versión y no es confiable en X.Utilice la función estándar del mouse y pruebe los botones 3 y 4.
Las notas de OpenGlut sobre el estado glutMouseWheelFunc:
Debido a la falta de información sobre el mouse, es imposible implementar esto correctamente en X en este momento.El uso de esta función limita la portabilidad de su aplicación.(Esta característica funciona en X, pero no de manera confiable). Se le recomienda utilizar los informes estándar y confiables de botón de mouse, en lugar de eventos de la rueda.
Usando informes de mouse GLUT estándar:
#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);
Como dijo el OP, es "muy simple".Simplemente estaba equivocado.
observe los casos 3 y 4 en la declaración de cambio a continuación en la devolución de llamada de 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();
}