1

我如何确定(我知道这不是正确使用的术语)对于a 中鼠标的每个window space位置,它都会转换为OGL space(-1, 1)。在这种情况下,用户移动鼠标非常快,我假设它之前的所有位置都转换为 OGL 坐标。我想说的是......即使我C++ OGL coordinates converter的计算成本非常高,普通 CPU 是否足够快来做到这一点(跟踪所有以前的事件)?可以说我在那里放了非常耗时的循环?或者..非常快method()。如果我移动鼠标足够快,如何确保不会跳过任何 OGL 坐标?我不会在这里草率下任何结论或假设您可能会想到其他东西。

编辑:

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

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由该算法生成的那些值(未被跟踪)已被鼠标越过。我会为所有这些职位添加另一个循环吗?

4

1 回答 1

4

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

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

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

另一方面,如果您自己需要这些中间鼠标位置进行进一步计算,您将无法使用一些常见的线光栅化算法(如Bresenham 算法,用于线光栅化教科书算法)自己计算它们。这基本上是计算离散网格上的每个点,从一个点到另一个点的线会交叉(类似于将一条线转换为离散像素时您的显卡所做的),因此这将生成您的虚拟的每个离散鼠标位置鼠标路径已交叉(忽略测量点之间的任何非线性鼠标移动)。

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

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

于 2013-05-06T10:01:18.400 回答