我想在我的OpenGL GLUT程序中使用鼠标滚轮来放大和缩小场景?我怎么做?
Freeglut的glutMouseWheelFunc回调依赖于版本,在X中不可靠.使用标准鼠标功能并测试按钮3和4.
关于glutMouseWheelFunc状态的OpenGlut注释:
由于缺少有关鼠标的信息,此时无法在X上正确实现此功能.使用此功能会限制应用程序的可移植性.(此功能适用于X,但不可靠.)建议您使用标准,可靠的鼠标按钮报告,而不是轮子事件.
使用标准GLUT鼠标报告:
#includevoid 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); } } glutMouseFunc(mouse);
正如OP所说,它"简单易行".他错了.
请注意,古老的Nate Robin的GLUT库不支持滚轮.但是,后来像FreeGLUT这样的GLUT实现了.
使用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; }
而已!