首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL GLUT鼠标移动

OpenGL GLUT鼠标移动
EN

Stack Overflow用户
提问于 2013-02-19 20:21:35
回答 2查看 8.5K关注 0票数 1

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

这里是鼠标的功能。

代码语言:javascript
运行
复制
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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-19 21:13:00

我猜,如果你要跟踪所有鼠标的移动,你要么需要捕捉鼠标进入或离开窗口的时间,要么简单地丢弃任何超过一定数量的跳跃。

假设鼠标离开窗口的右边缘,并重新进入窗口的左边缘。您所展示的代码将会跳转。

除非有理由不这样做,否则我会将最后一个变量设为静态变量,并添加一个类似下面的if语句( not tested :) )……

代码语言:javascript
运行
复制
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

逻辑是这样的。它看到的任何事件,如果离它看到的最后一个事件不远,只需重置变量并等待另一个事件。

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

票数 1
EN

Stack Overflow用户

发布于 2013-02-19 20:24:52

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

我有90%的把握这是FPP摄像头,你可以手动将光标移动到屏幕中央。因此,它恰好从窗口的右下角开始,然后被移动,报告为增量。也可能是lastxlasty在第一次读取时被初始化,并且在此之前它们包含垃圾。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14957377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档