用Glut/OpenGL检测鼠标水平运动

用Glut/OpenGL检测鼠标水平运动,opengl,mouse,glut,motion,Opengl,Mouse,Glut,Motion,我试图用OpenGL检测鼠标的水平运动,因此,当检测到时,执行GLUTPOSTREDIDISPLAY()。问题是,在垂直移动鼠标时,场景也会重新绘制 这是已注册回调的代码(注意,mouse_inix和mouse_iniy是全局(双)变量): 你确定吗?从您发布的代码来看,垂直移动鼠标不会触发glutPostRedisplay()调用 但是,您在这里对“水平鼠标移动”的定义非常狭窄。如果你上下移动鼠标,你几乎肯定会得到几像素的水平移动。也许你可以在鼠标周围设置一个死区,防止它在每个像素上移动。比如

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

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


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

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

void motion(int x, int y)
{
    if ((abs(x - (int)mouse_inix) > 10) {
        angle += 20.0;
        glutPostRedisplay();
    } 
}
这是这里发生的一件事。另一个是“double”的用法。因为glut将鼠标坐标返回为int,所以最好还是坚持使用它。尝试比较“(double)x!=mouse_inix)”几乎肯定是正确的,因为double存在精度问题。您通常不希望使用浮点数来比较是否完全等于。死区的使用将否定这个问题,但是,如果你不需要双倍,为什么还要转换成双倍呢

我不知道“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”符号,则可以根据移动鼠标的方式双向旋转

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();
    } 
}