OpenGL GLUT鼠标移动

时间:2013-02-19 12:21:35

标签: opengl mousemove

我为相机写了一个鼠标功能。 它运作良好。但唯一的问题是在开始时,当我第一次用鼠标移动它向上跳跃然后它运作良好。我不明白为什么会这样。

这里是鼠标功能。

float lastx = 0.0;
float lasty = 0.0;

void mouseMovement(int x, int y) 
{
    lastx = (float)x - lastx;
    lasty = (float)y - lasty;

    if((float)x > lastx)
        Camera.RotateY((-lastx)*0.01);
    else
        Camera.RotateY(lastx*0.01);
    if((float)y > lasty)
        Camera.RotateX(lasty*0.01);
    else 
        Camera.RotateX(-lasty*0.01); 
    lastx = (float)x;
    lasty = (float)y;
    Display();
}

2 个答案:

答案 0 :(得分:1)

在开始接受数据之前,将光标移动到屏幕中间。并确保lastxlasty已正确初始化。

我90%肯定它的FPP相机,你手动将光标移动到屏幕中间。所以它发生在窗口的右下角,然后移动,报告为delta。也可能是lastxlasty在第一次读取时被初始化,在此之前它们包含垃圾。

答案 1 :(得分:1)

我猜,如果你跟踪所有鼠标移动,你需要在鼠标进入或离开窗口时捕获,或者只是丢弃任何大于一定数量的跳跃。

假设鼠标离开窗口的右边缘,然后重新进入窗口的左边缘。你所展示的代码将会跳跃。

除非有理由不这样做,否则我会将最后一个变量设为静态并添加一个类似于此的if语句(未经测试:) ...

void mouseMovement(int x, int y) 
{
    static float lastx = 0.0;
    static float lasty = 0.0;

    lastx = (float)x - lastx;
    lasty = (float)y - lasty;

    if((abs((int)lastx)>10)||(abs((int)lasty)>10)
    {
        lastx = (float)x;
        lasty = (float)y;
        return;
    }

   //the rest remains the same

逻辑是...... 它看到的任何事件都不在它看到的最后一个事件附近,只是重置变量并等待另一个事件。

这对于鼠标控制来说真的不是一个优雅的解决方案,但是在编码的这一点上它可能是可以理解的,并且会做你想要的。