我想在OpenGL GLUT程序中使用鼠标滚轮来放大和缩小场景?我该怎么做?
答案 0 :(得分:34)
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);
正如OP所说,它“简单易行”。他错了。
答案 1 :(得分:23)
请注意,古老的Nate Robin's 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;
}
就是这样!
答案 2 :(得分:0)
在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();
}