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

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

18.08.2008 09:29:34
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;
}

Это оно!

23
18.08.2008 09:29:49
К моему большому раздражению, freeGLUT, похоже, не реализует обратный вызов glutMouseWheelFunc (). Скорее иронично, что постеры жаловались на этот стиль публикации, но ответ, который вы разместили для себя, был неверным.
Rich 12.01.2009 20:57:05
В добавление к этому - даже когда используется #include <GL/freeglut.h>так, чтобы код компилировался, glutMouseWheelFunc, кажется, не вызывается (как проверено на Ubuntu 10.04 x86_64, который поставляется с FreeGlut 2.6.0). Решение состоит в том, чтобы использовать обычный glutMouseFuncобратный вызов и проверять, нет ли button == 3колеса вверх и button == 4вниз.
Carlos Scheidegger 14.07.2010 21:13:09
Функция обратного вызова glutMouseWheelFunc является специфической для Windows, может отсутствовать в системах Linux и MAC
AMCoded 17.11.2017 08:41:54

Обратный вызов Freeglut glutMouseWheelFunc зависит от версии и ненадежен в 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);

Как указывалось в ОП, это "очень просто". Он был просто неправ.

34
23.03.2015 22:40:02
К сожалению, использование фиксированных кнопок довольно ненадежно, так как то, какие кнопки мыши соответствуют колесу мыши, зависит от того, какое устройство вы подключили. На самом деле, я думаю, что наиболее распространенной является кнопка 4/5 для вверх / вниз, а не 3/4. Для любой используемой программы вы хотите, чтобы пользователь мог легко ее изменить.
Chris Dodd 29.07.2012 20:00:53
На моем Mac со свободным переизбытком 3/4 соответствуют вертикальной прокрутке вверх и вниз, а 5/6 соответствуют горизонтальной прокрутке (на моем трекпаде).
Alec Jacobson 19.10.2012 08:54:14
Спасибо, приятель, это решение отлично работает в моем сценарии тестирования.
Maurizio Benedetti 5.02.2013 17:59:47

наблюдайте случаи 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();
}
0
14.11.2018 18:15:05