Windows鼠标坐标VS OpenGL鼠标坐标

问题描述:

我如何确定(这不是我知道的正确用语):window space中鼠标的位置,它被转换为OGL space(-1,1 )。在这种情况下,用户非常快速地移动鼠标,我假设其所有其以前的位置都转换为OGL坐标。我想说的是......即使我的C++ OGL coordinates converter的计算量非常大,它也是一个普通的CPU,能够快速完成这个任务(跟踪所有以前的事件)。可以说我在那里放了非常耗时的循环?或..非常快method()。如果我足够快地移动鼠标,我如何确保不会跳出OGL坐标? 我不想在这里得出任何结论或假设别人会想。Windows鼠标坐标VS OpenGL鼠标坐标

编辑:

我的程序主循环是这样的(伪):

void Pollevents() 
{ 
    for everyt_obj in this 
    { 
     if Not Collide() 
     { 

      Move(x, y) // 

     } 
    } 
} 

void MousePos() 
{ 
    mouse.pos = To_OGL_Coord2f() 
} 

这些都是单独的线程中执行(但实际上没有真正的线程) 假设mouse.pos = (0, 0)然后我移动鼠标足够快,使新的mouse.pos到(10,10)。在循环的单次执行中,鼠标位置与之前的位置相差甚远。现在,我怎么能告诉我的程序,通过执行Christian Rau提到的Bresenham's line algorithm,那个算法产生的那些值(没有被跟踪)已经被鼠标穿过。我会添加另一个循环来为所有这些职位提供帮助吗?

+1

如果您的计算机在* 13年前被认为是很慢*,那么它仍然可以执行每秒超过100亿次计算。将一对数字转换成另一对数字会使你认为你的电脑无法处理它吗? – 2013-05-06 09:24:09

+0

我的意思是,该程序正在运行。不是由处理器计算的操作系统。看看[this](http://s23.postimg.org/uoyhevx2z/pos.png) – mr5 2013-05-06 09:37:05

+0

@NicolBolas你可以看到鼠标位置在我将鼠标悬停在窗口。除非这是打印到bash的问题 – mr5 2013-05-06 09:43:05

我怎样才能确保没有OGL坐标跳过,如果我移动鼠标 足够快?

这是不可能的,因为没有办法让操作系统生成鼠标事件时,鼠标移动在理论无限精度跟踪时会越过每个点。

确保这一点的唯一方法是自己填充两个(可能很远的)鼠标位置之间的缺失点。如果你只是想为每个位置绘制一个点,那么可以使用OpenGL绘制一条线。

如果您在另一方面需要那些中介鼠标位置为自己进一步的计算,你就不会得到解决使用一些常见的线光栅化算法计算自己他们(像Bresenham Algorithm线路光栅化校书算法) 。这基本上做的是计算离散网格上的每个点,从一点到另一点的线会越过(类似于将图形卡转换为离散像素时的图形卡),因此这会生成每个离散的鼠标位置鼠标路径已经越过(忽略测量点之间的任何非线性鼠标移动)。

编辑:如果你不需要用适当的等宽特性的离散线比线光栅化搞乱一个更简单的方法也将是只是浮点位置工作,做的一个简单的线性插值终点,如datenwolf在他的评论中写道。这也会为您提供比分立鼠标位置更好的定时精度。但这一切都取决于你真正想要用鼠标位置做什么(现在将是一个很好的方式告诉我们)。

编辑:从您更新的问题,它看起来像你需要在高粒度的鼠标位置,以计算鼠标与一些对象的碰撞。在这种情况下,你根本不需要中介点。只需从当前鼠标位置到前一个点(表示为一对点或任何理论线表示)之间的线,并计算物体与该线的碰撞,而不是单个点。

+0

非常好的答案。 – 2013-05-06 10:08:31

+0

在指定的时间内,我该怎么做?让我们说毫秒。 Ahm,我的意思是我的程序主要由鼠标驱动。我怎么能告诉我的程序,这个位置已被鼠标穿过。另外请注意,这不仅仅是一次执行刷新。 – mr5 2013-05-06 10:17:45

+1

@ mr5没有时间(如果你自己不需要某个特定的时间)。如果您获得鼠标事件,只需计算您获得的鼠标位置与最后一个事件(您存储在某个位置)的鼠标位置之间的所有点。如果你正在谈论自己为这些中间点生成虚拟鼠标事件,那么我认为这不是一个好主意。 – 2013-05-06 10:44:44