好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

鼠标响应opengl.doc

3页
  • 卖家[上传人]:飞***
  • 文档编号:6457996
  • 上传时间:2017-09-11
  • 文档格式:DOC
  • 文档大小:19.50KB
  • / 3 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 检测鼠标单击要想在 OpenGL 中处理鼠标事件非常的方便, GLUT 已经为我们的注册好了函数,只要我们提供一个方法使用函数 glutMouseFunc,就可以帮我们注册我们的函数,这样当发生鼠标事件时就会自动调用我们的方法函数的原型是:void glutMouseFunc(void(*func)(int button,int state,int x,int y));参数:func:处理鼠标 click 事件的函数的函数名从上面可以看到,处理鼠标单击事件的函数,一定有 4 个参数第一个参数表明哪个鼠标键被按下或松开,这个变量可以是下面的三个值中的一个:GLUT_LEFT_BUTTONGLUT_MIDDLE_BUTTONGLUT_RIGHT_BUTTON第二个参数表明,函数被调用发生时,鼠标的状态,也就是是被按下,或松开,可能取值如下:GLUT_DOWNGLUT_UP当函数被调用时,state 的值是 GLUT_DOWN,那么程序可能会假定将会有个 GLUT_UP事件,甚至鼠标移动到窗口外面,也如此然而,如果程序调用 glutMouseFunc 传递NULL 作为参数,那么 GLUT 将不会改变鼠标的状态。

      剩下的两个参数(x,y)提供了鼠标当前的窗口坐标(以左上角为原点) 检测动作GLUT 提供鼠标动作检测能力有两种 GLUT 处理的 motion:active motion 和 passive motionActive motion 是指鼠标移动并且有一个鼠标键被按下Passive motion 是指当鼠标移动时,并有没鼠标键按下如果一个程序正在追踪鼠标,那么鼠标移动期间,每一帧将产生一个结果和以前一样,你必须注册将处理鼠标事件的函数(定义函数) GLUT 让我们可以指定两个不同的函数,一个追踪 passive motion,另一个追踪 active motion它们的函数原型如下:void glutMotionFunc(void(*func)(int x,int y));void glutPassiveMotionFunc(void (*func)(int x,int y));参数:Func:处理各自类型 motion 的函数名处理 motion 的参数函数的参数(x,y)是鼠标在窗口的坐标以左上角为原点检测鼠标进入或离开窗口GLUT 还能检测鼠标鼠标离开,进入窗口区域一个回调函数可以被定义去处理这两个事件。

      GLUT 里,调用这个函数的是 glutEntryFunc,函数原型如下:void glutEntryFunc(void(*func)(int state));参数:Func:处理这些事件的函数名上面函数的参数中,state 有两个值表明是离开还是进入窗口:GLUT_LEFTGLUT_ENTERED应用现在想实现的功能就是使用鼠标拖动,来转动场景中的物体,当鼠标左键按下,并且上下左右滑动时,场景中的物体相应的会随之上下左右旋转,当鼠标右键按下,并且上下滑动时,场景中的物体相应的会随之移入或是移出屏幕首先,定义几个全局变量:bool mouseLeftDown;bool mouseRightDown;float mouseX, mouseY;float cameraDistance;float cameraAngleX;float cameraAngleY;其中,mouseLeftDown 和 mouseRightDown 变量标志鼠标左右键按下与否, mouseX 和mouseY 变量标志鼠标滑动时,前一刻的鼠标所在位置 ,cameraDistance 这个变量根据鼠标右键按下并上下滑动来控制场景中物体移入屏幕的远近。

      cameraAngleX 和 cameraAngleY 变量根据鼠标左键按下并滑动来控制场景中物体的旋转void mouseCB(int button, int state, int x, int y){mouseX = x;mouseY = y;if(button == GLUT_LEFT_BUTTON){if(state == GLUT_DOWN){mouseLeftDown = true;} else if(state == GLUT_UP)mouseLeftDown = false;}else if(button == GLUT_RIGHT_BUTTON){if(state == GLUT_DOWN){mouseRightDown = true;}else if(state == GLUT_UP)mouseRightDown = false;}}void mouseMotionCB(int x, int y){if(mouseLeftDown){cameraAngleY += (x - mouseX);cameraAngleX += (y - mouseY);mouseX = x;mouseY = y;}if(mouseRightDown){cameraDistance += (y - mouseY) * 0.2f;mouseY = y;}glutPostRedisplay();}在主函数中,调用相应的函数注册即可:glutMouseFunc(mouseCB);glutMotionFunc(mouseMotionCB);在场景中物体绘制之前,这样就可以:glTranslatef(0, 0, cameraDistance);glRotatef(cameraAngleX, 1, 0, 0);glRotatef(cameraAngleY, 0, 1, 0);参考:鼠标事件处理。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.