Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using the mouse scrollwheel in GLUT

I want to use the mouse scrollwheel in my OpenGL GLUT program to zoom in and out of a scene? How do I do that?

like image 721
Ashwin Nanjappa Avatar asked Aug 18 '08 09:08

Ashwin Nanjappa


People also ask

How do I make my Mousewheel click?

On a mouse with a scroll wheel, you can usually press directly down on the scroll wheel to middle-click. If you don't have a middle mouse button, you can press the left and right mouse buttons at the same time to middle-click.

What is the degree of integration of the scrollbar used with a mouse?

A scrollbar is a 1D instrument controlled by a 2D mouse, therefore its degree of integration is 1/2.


3 Answers

Freeglut's glutMouseWheelFunc callback is version dependant and not reliable in X. Use standard mouse function and test for buttons 3 and 4.

The OpenGlut notes on glutMouseWheelFunc state:

Due to lack of information about the mouse, it is impossible to implement this correctly on X at this time. Use of this function limits the portability of your application. (This feature does work on X, just not reliably.) You are encouraged to use the standard, reliable mouse-button reporting, rather than wheel events.

Using standard GLUT mouse reporting:

#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); 

As the OP stated, it is "dead simple". He was just wrong.

like image 125
BentFX Avatar answered Oct 25 '22 02:10

BentFX


Note that venerable Nate Robin's GLUT library doesn't support the scrollwheel. But, later implementations of GLUT like FreeGLUT do.

Using the scroll wheel in FreeGLUT is dead simple. Here is how:

Declare a callback function that shall be called whenever the scroll wheel is scrolled. This is the prototype:

void mouseWheel(int, int, int, int); 

Register the callback with the (Free)GLUT function glutMouseWheelFunc().

glutMouseWheelFunc(mouseWheel); 

Define the callback function. The second parameter gives the direction of the scroll. Values of +1 is forward, -1 is backward.

void mouseWheel(int button, int dir, int x, int y) {     if (dir > 0)     {         // Zoom in     }     else     {         // Zoom out     }      return; } 

That's it!

like image 35
Ashwin Nanjappa Avatar answered Oct 25 '22 01:10

Ashwin Nanjappa


observe case 3 and 4 in the switch statement below in the mouseClick callback

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();
}
like image 24
StackAttack Avatar answered Oct 25 '22 03:10

StackAttack