34

我想在我的 OpenGL GLUT 程序中使用鼠标滚轮来放大和缩小场景?我怎么做?

4

3 回答 3

38

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

正如 OP 所说,它“非常简单”。他错了。

于 2011-10-25T07:08:52.280 回答
25

请注意,古老的 Nate Robin 的 GLUT库不支持滚轮。但是,像FreeGLUT这样的 GLUT 的后续实现确实如此。

在 FreeGLUT 中使用滚轮非常简单。方法如下:

声明一个回调函数,当滚轮滚动时调用该回调函数。这是原型:

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

使用(免费)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;
}

就是这样!

于 2008-08-18T09:29:49.010 回答
2

在 mouseClick 回调中观察下面 switch 语句中的情况 3 和 4

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();
}
于 2018-11-14T16:41:09.383 回答