我想使用鼠标滚轮在我的OpenGL GLUT程序和退出场景的放大? 我怎么做?
Answer 1:
Freeglut的glutMouseWheelFunc回调取决于版本,并在十用标准鼠标功能和测试按钮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说,它是“死简单”。 他是不对的。
Answer 2:
需要注意的是古老的内特罗宾的GLUT库不支持滚轮。 但是,后来像GLUT的实现FreeGLUT做。
使用FreeGLUT滚轮是死的简单。 方法如下:
声明一个回调函数,每当滚轮滚动即应被调用。 这是原型:
void mouseWheel(int, int, int, int);
注册与(免费)转运蛋白功能glutMouseWheelFunc回调()。
glutMouseWheelFunc(mouseWheel);
定义回调函数。 第二个参数给出了滚动的方向。 +1值是向前,-1是落后。
void mouseWheel(int button, int dir, int x, int y)
{
if (dir > 0)
{
// Zoom in
}
else
{
// Zoom out
}
return;
}
而已!
Answer 3:
在鼠标点击回调下面的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();
}
文章来源: Using the mouse scrollwheel in GLUT