【问题标题】:Detecting horizontal mouse motion with Glut/OpenGL使用 Glut/OpenGL 检测水平鼠标运动
【发布时间】:2012-11-08 17:53:28
【问题描述】:

我正在尝试使用 OpenGL 检测水平鼠标运动,因此,当检测到时,执行 glutPostRedisplay()。问题是场景也会在鼠标垂直移动时重绘。

这是注册回调的代码(注意 mouse_inix 和 mouse_iniy 是全局(双)变量):

void mouse(int button, int state, int x, int y)
{
    if (state == GLUT_DOWN)  {
            mouse_inix = (double)x;
            mouse_iniy = (double)y;
    }
}

void motion(int x, int y)
{

    if (((double)x) != mouse_inix) {
            angle += 20.0;
            glutPostRedisplay();
    } 
}

【问题讨论】:

    标签: opengl mouse glut motion


    【解决方案1】:

    你确定吗?从您发布的代码看来,垂直鼠标移动不会触发 glutPostRedisplay() 调用。

    但是,您在这里非常狭义地定义了“水平鼠标移动”。如果你上下移动鼠标,你几乎肯定会得到几个像素的水平移动。也许您可以在鼠标周围设置一个死区,以防止它在每个像素上移动。比如:

    void motion(int x, int y)
    {
        if ((abs(x - (int)mouse_inix) > 10) {
            angle += 20.0;
            glutPostRedisplay();
        } 
    }
    

    这是这里正在发生的一件事。另一个是使用“双”。由于 glut 将鼠标坐标作为整数返回,因此您最好坚持使用它。由于双精度问题,尝试比较 "(double)x != mouse_inix" 几乎可以肯定是正确的。您通常不想比较 完全 等于或不等于使用浮点数。使用死区可以解决这个问题,但是,如果你不需要它们,为什么要转换为双打呢?

    我不知道“20”是度数还是弧度,但无论哪种方式,它都可能导致一些非常跳跃的动作。考虑将移动的大小缩放为鼠标移动的大小:

    void motion(int x, int y)
    {
        int deltaX = (abs(x - (int)mouse_inix);
        if (deltaX > 10) {
            angle += (double)deltaX;  // or "deltaX/scaleFactor" to make it move more/less
            glutPostRedisplay();
        } 
    }
    

    它仍然只会旋转一种方式。如果您使用“deltaX”的符号,您将能够根据您移动鼠标的方式来旋转两个方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多