我想在我的OpenGL GLUT程序中使用鼠标滚轮来缩放场景。我该怎么做?
Freeglut的glutMouseWheelFunc回调函数在不同版本中会有差异,并且在X环境下不可靠。建议使用标准鼠标函数并测试3和4按键。
关于glutMouseWheelFunc,OpenGlut的说明如下:
由于缺乏有关鼠标的信息,在目前无法正确地在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);
正如楼主所说,这很“死板简单”。但他是错的。
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;
}
就是这样啦!
#include <GL/freeglut.h>
让代码编译通过外,即使在 Ubuntu 10.04 x86_64 上测试(该系统附带 freeglut 2.6.0),glutMouseWheelFunc
回调函数似乎也没有被调用。解决方法是使用普通的 glutMouseFunc
回调函数并检查 button == 3
表示向上滚动鼠标轮,button == 4
表示向下滚动鼠标轮。 - Carlos ScheideggerglutMouseWheelFunc
(https://sourceforge.net/p/freeglut/code/HEAD/tree/trunk/freeglut/freeglut/src/x11/fg_main_x11.c#l850),但我没有检查它是否有效。 - Yakov GalkaglutMouseFunc(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();
}