【问题标题】:OpenGL GLUT mouse movementOpenGL GLUT 鼠标移动
【发布时间】:2013-02-19 12:21:35
【问题描述】:

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

这里是鼠标功能。

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

【问题讨论】:

  • 只是猜测...lastx 和 lasty 没有初始化为任何有意义的值,因此第一次调用 mouseMovement 时会以两个随机减法开始。

标签: opengl mousemove


【解决方案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

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

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

【讨论】:

  • 它有效,但我仍然不明白其中的逻辑。一开始我的光标不在窗口之外。那它为什么会跳呢?
  • 因为它还没有看到鼠标移动,并且它有记录它最后一次出现在(0,0)。从控制器的角度来看,它开始认为鼠标位于窗口的左上角。
【解决方案2】:

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

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

【讨论】:

  • 我将它们初始化为 0.0。
  • 那么lastx和lasy应该初始化什么?
  • 如果你可以在移动相机之前将光标移动到屏幕中间,0.0应该没问题
  • 屏幕中间的x, y 坐标是多少?您是否使用 FPP 相机,因为您尚未确认?
  • 我不知道什么是FPP相机,我在网上搜索过,但我找不到任何东西?你是说FPS相机吗?对于中间屏幕: cout
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多