Windows鼠标坐标VS OpenGL鼠标坐标

Windows mouse coordinates VS OpenGL mouse coordinates

本文关键字:鼠标 坐标 OpenGL VS Windows      更新时间:2023-10-16

我如何确定(我知道这不是正确的术语(对于鼠标在window space中的每个位置,它都会转换为OGL space(-1,1(。在这种情况下,用户移动鼠标的速度非常快,我假设它以前的所有位置都转换为OGL坐标。我想说的是。。。即使我的C++ OGL coordinates converter计算成本很高,一个普通的CPU是否足够快(跟踪所有以前的事件(?比方说我在里面放了非常耗时的循环?或非常快的CCD_ 4。如果我移动鼠标足够快,我如何确保不会跳过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来告诉我的程序,该算法生成的值(未被跟踪(已被鼠标交叉。我会为所有这些位置添加另一个循环吗?

如果我移动鼠标够快吗?

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

确保这一点的唯一方法是自己填补两个(可能很远(鼠标位置之间的缺失点。如果你只想为鼠标移动的每个位置画一个点(可能使用OpenGL(,那就画一条线。

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

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

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