我正在尝试使用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();
}
}
答案 0 :(得分:0)
但是,你在这里非常狭窄地定义了“水平鼠标移动”。如果你上下移动鼠标,你几乎肯定会得到几个像素的水平移动。也许你可以在鼠标周围放置一个死区,以防止它在每个像素上移动。类似的东西:
void motion(int x, int y)
{
if ((abs(x - (int)mouse_inix) > 10) {
angle += 20.0;
glutPostRedisplay();
}
}
这是在这里发生的一件事。另一种是使用“双”。由于过剩是将鼠标坐标作为整数返回,因此最好坚持使用它。试图比较“(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”的符号,则可以根据移动鼠标的方式旋转两个方向。