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