Использование колеса прокрутки мыши в GLUT

Я хочу использовать колесо прокрутки мыши в моей программе OpenGL GLUT для увеличения и уменьшения масштаба сцены? Как я могу это сделать?

Ответов (3)

Решение

Обратите внимание, что библиотека GLUT достопочтенного Нейта Робина не поддерживает колесо прокрутки. Но более поздние реализации GLUT, такие как FreeGLUT, делают.

Использовать колесо прокрутки в FreeGLUT очень просто. Вот как:

Объявите функцию обратного вызова, которая будет вызываться при прокрутке колеса прокрутки. Это прототип:

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

Зарегистрируйте обратный вызов с помощью (Free) функции GLUT glutMouseWheelFunc () .

glutMouseWheelFunc(mouseWheel);

Определите функцию обратного вызова. Второй параметр указывает направление прокрутки. Значения +1 - вперед, -1 - назад.

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

    return;
}

Вот и все!

Обратный вызов glutMouseWheelFunc Freeglut зависит от версии и ненадежен в X. Используйте стандартную функцию мыши и проверьте кнопки 3 и 4.

Заметки OpenGlut о состоянии glutMouseWheelFunc:

Из-за отсутствия информации о мыши, в настоящее время невозможно правильно реализовать это на X. Использование этой функции ограничивает переносимость вашего приложения. (Эта функция действительно работает в X, но ненадежно.) Вам рекомендуется использовать стандартные надежные отчеты о нажатии кнопок мыши, а не о событиях колесика.

Использование стандартных отчетов мыши GLUT:

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

Как сказано в ОП, это «очень просто». Он просто ошибался.

обратите внимание на случаи 3 и 4 в инструкции switch ниже в обратном вызове 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();
}