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?

¿Fue útil?

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top