El uso de la rueda de desplazamiento del ratón en GLUT


Quiero usar la rueda de desplazamiento del ratón en mi programa OpenGL GLUT para acercar y alejar una escena? ¿Cómo hago eso?

Author: Ashwin Nanjappa, 2008-08-18

2 answers

La devolución de llamada glutMouseWheelFunc de Freeglut depende de la versión y no es confiable en X. Use la función estándar del ratón y pruebe los botones 3 y 4.

Las notas de OpenGlut sobre glutMouseWheelFunc dicen:

Debido a la falta de información sobre el ratón, es imposible implemente esto correctamente en X en este momento. Uso de esta función limita la portabilidad de su aplicación. (Esta característica funciona en X, solo que no es confiable.) Se le anima a utilizar el estándar, informes fiables con el botón del ratón, en lugar de eventos de rueda.

Usando el reporte estándar de GLUT 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);

Como decía el OP, es "muy simple". Estaba equivocado.

 34
Author: BentFX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-23 22:40:02

Tenga en cuenta que la biblioteca de venerable Nate Robin's GLUT no admite la rueda de desplazamiento. Pero, implementaciones posteriores de GLUT como FreeGLUT lo hacen.

Usar la rueda de desplazamiento en FreeGLUT es muy simple. Aquí está 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);

Registra la devolución de llamada con la función GLUT (Libre) glutMouseWheelFunc().

glutMouseWheelFunc(mouseWheel);

Definir la devolución de llamada función. El segundo parámetro indica la dirección del desplazamiento. Valores de +1 es hacia adelante, -1 es 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!

 23
Author: Ashwin Nanjappa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-18 09:29:49