Windows鼠标坐标VS OpenGL鼠标坐标

时间:2013-05-06 09:14:19

标签: c++ opengl mouse-coordinates

我如何确定(这不是我知道的正确术语),对于window space中鼠标的每个位置,它会转换为{{1} }( - 1,1)。在这种情况下,用户非常快地移动鼠标,我假设其先前位置的全部被转换为OGL坐标。我想说的是......即使我的OGL space计算成本非常高,......也是一个常见的CPU,足以做到这一点(跟踪所有先前的事件)?假设我把非常耗时的循环放在那里?或者......非常快C++ OGL coordinates converter。如果我足够快地移动鼠标,我如何确保不会跳过任何OGL坐标? 我不是在这里得出任何结论或者你可能会想到别的东西。

修改

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

method()

这些是要执行的单独线程(但实际上并不是真正的线程) 假设void Pollevents() { for everyt_obj in this { if Not Collide() { Move(x, y) // } } } void MousePos() { mouse.pos = To_OGL_Coord2f() } 然后我快速移动鼠标以使新mouse.pos = (0, 0)为(10,10)。在循环的单次执行中,鼠标位置与之前的位置相差很远。现在,我如何通过实施Christian Rau所提到的mouse.pos来告诉我的程序,该算法生成的那些值(未被跟踪)已被鼠标划过。我是否会为所有这些职位添加另一个循环?

1 个答案:

答案 0 :(得分:4)

  

如果我移动,我怎么能确保不会跳过任何OGL坐标   鼠标足够快?

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

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

另一方面,如果你需要那些中间鼠标定位自己进行进一步的计算,你将无法使用一些常见的行光栅化算法(如Bresenham Algorithm 线光栅化的校本算法)。这基本上做的是计算离散网格上的每个点,从一个点到另一个点的线将交叉(类似于图形卡在将线转换为离散像素时所执行的操作),因此这将生成虚拟的每个离散鼠标位置鼠标路径已越过(忽略测量点之间的任何非线性鼠标移动)。

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

编辑:根据您更新的问题,您似乎需要高粒度的鼠标位置才能计算鼠标与某些对象的碰撞。在这种情况下,您根本不需要中间点。只需从当前鼠标位置到前一个位置(仅表示为一对点,或任何理论线表示),并计算对象与该行的碰撞,而不是单个点。