Opengl鼠标交互函数glutMouseFunc()函数介绍

检测鼠标单击

要想在OpenGL中处理鼠标事件非常的方便,GLUT已经为我们的注册好了函数,只要我们提供一个方法。使用函数glutMouseFunc,就可以帮我们注册我们的函数,这样当发生鼠标事件时就会自动调用我们的方法。

函数的原型是:

void glutMouseFunc(void(*func)(int button,int state,int x,int y));
参数:
func:处理鼠标click事件的函数的函数名。

从上面可以看到,处理鼠标单击事件的函数,一定有4个参数。第一个参数表明哪个鼠标键被按下或松开,这个变量可以是下面的三个值中的一个:
GLUT_LEFT_BUTTON
GLUT_MIDDLE_BUTTON
GLUT_RIGHT_BUTTON

第二个参数表明,函数被调用发生时,鼠标的状态,也就是是被按下,或松开,可能取值如下:
GLUT_DOWN
GLUT_UP

当函数被调用时,state的值是GLUT_DOWN,那么程序可能会假定将会有个GLUT_UP事件,甚至鼠标移动到窗口外面,也如此。然而,如果程序调用glutMouseFunc传递NULL作为参数,那么GLUT将不会改变鼠标的状态。

剩下的两个参数(x,y)提供了鼠标当前的窗口坐标(以左上角为原点)。

检测动作

GLUT提供鼠标动作检测能力。有两种GLUT处理的motion:active motion和passive motion。Active 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_LEFT
GLUT_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);
  • 16
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 使用OpenGL绘制鼠标拖动点的方法如下: 1. 首先,我们需要在OpenGL中创建一个窗口并设置好视口和投影矩阵。 2. 接下来,我们需要定义一个存储点坐标的数据结构,以便在鼠标拖动过程中保存绘制的点。 3. 在窗口的鼠标回调函数中,我们需要监听鼠标的移动事件,获取到当前鼠标的坐标。 4. 当鼠标按下且移动时,在鼠标回调函数中调用OpenGL的绘制函数,将当前鼠标的坐标作为参数传入。 5. 在绘制函数中,我们可以使用OpenGL提供的绘制点的函数(如glPointSize、glBegin和glVertex),将鼠标的坐标作为点的位置进行绘制。 6. 在鼠标释放时,我们可以将最后的鼠标坐标保存到数据结构中,以便在下次绘制时继续绘制。 7. 最后,在OpenGL的主函数中,我们需要循环调用绘制函数,实时更新绘制的点。 通过以上步骤,我们可以实现使用OpenGL绘制鼠标拖动的点。在鼠标移动过程中,不断绘制得到的点,实现了鼠标拖动绘制的效果。 ### 回答2: 在使用OpenGL进行鼠标拖动绘制点的过程中,我们可以通过鼠标事件来获取鼠标的位置信息,并将该位置转换为OpenGL坐标系中的点。 首先,我们需要注册鼠标事件的回调函数,以便在鼠标移动时获取到鼠标的位置。在鼠标移动事件中,可以获取到当前鼠标的位置坐标。通过OpenGL的视口转换函数,将该坐标转换为OpenGL坐标系中的点。 在绘制函数中,我们可以通过存储鼠标移动事件时获取到的点位置,并调用OpenGL的绘制点函数完成绘制。可以使用glPointSize函数设置点的大小,使用glBegin(GL_POINTS)和glVertex2f函数绘制点。 当鼠标拖动时,通过判断鼠标左键是否按下,并将鼠标移动事件的点位置添加到绘制点的数组中。在绘制函数中,通过遍历数组中存储的点位置,调用OpenGL的绘制点函数完成所有点的绘制。 最后,在主函数中,设置OpenGL的绘制模式和窗口大小,并初始化OpenGL的窗口。注册鼠标事件回调函数并进入主循环,等待鼠标事件的触发。 总结起来,通过监听鼠标事件,获取鼠标的位置信息并转换为OpenGL坐标系中的点,再通过绘制函数将这些点绘制出来,即可完成鼠标拖动绘制点的功能。 ### 回答3: 首先,要实现在OpenGL中通过鼠标拖动绘制点,我们需要考虑以下几个方面。 首先,我们需要捕捉鼠标事件以获取鼠标位置。在OpenGL中,可以通过注册回调函数来捕捉鼠标事件,如鼠标按下、移动和释放。在注册回调函数时,我们可以获取鼠标的当前坐标。 接下来,我们需要在OpenGL的绘制函数中根据鼠标位置绘制点。在绘制函数中,我们根据鼠标位置计算点的坐标,并使用OpenGL提供的绘制函数(如glPointSize和glBegin/glEnd等)来绘制这些点。 具体实现的步骤如下: 1. 注册鼠标事件回调函数,捕捉鼠标按下、移动和释放事件。可以使用GLUT库提供的glutMouseFuncglutMotionFunc函数。 2. 在鼠标移动事件回调函数中,获取当前鼠标位置。可以使用glutMotionFunc函数实现。 3. 在OpenGL的绘制函数中,根据鼠标位置计算要绘制点的坐标,并使用glBegin/glEnd函数绘制这些点。可以使用glPointSize函数设置点的大小。 4. 运行OpenGL程序,通过鼠标拖动来绘制点。 需要注意的是,在使用OpenGL绘制点的过程中,我们还可以考虑使用顶点缓冲对象(VBO)来提高性能,而不是每次都重新计算点的坐标。 总结起来,实现在OpenGL中通过鼠标拖动绘制点的步骤包括捕捉鼠标事件、获取鼠标位置、计算点的坐标以及绘制点。通过这些步骤,我们可以实现简单的鼠标交互绘制点的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值