如何确定(对于我来说,这不是正确的用语),对于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
来告诉程序,该算法生成的值(未被跟踪)已经被鼠标划过。我会为此添加另一个循环以步进所有这些位置吗? 最佳答案
这是不可能的,因为在理论上以无限精确度进行跟踪时,无法让操作系统为鼠标移动经过的每个点生成鼠标事件。
确保这一点的唯一方法是自己填补两个鼠标位置(可能很远)之间的缺失点。如果您只是想为mosue移过的每个位置绘制一个点(也许使用OpenGL),请改画一条线。
另一方面,如果您需要自己定位这些中间鼠标以进行进一步的计算,则您将无法使用一些常见的线光栅化算法(例如Bresenham Algorithm,即用于线光栅化的教科书算法)来自行计算它们。这基本上是在计算离散点网格上从点到另一点的线所要经过的每个点(类似于将线转换为离散像素时图形卡所执行的操作),因此这将生成虚拟鼠标的每个离散点位置鼠标路径已交叉(忽略测量点之间的任何非线性鼠标移动)。
编辑:如果您不需要具有适当等宽特征的离散线,那么比弄乱线栅格化要容易得多的方法还包括处理浮点位置并对端点进行简单的线性插值,例如datenwolf在评论中写道。与离散的鼠标位置相比,这也将为您提供更好的计时精度。但这一切都取决于您实际想要对这些鼠标位置进行什么操作(现在这是告诉我们的好方法)。
编辑:从更新后的问题来看,您似乎需要高粒度的鼠标位置才能计算鼠标与某些对象的碰撞。在这种情况下,您实际上根本不需要中间点。只需将直线从当前鼠标位置移至上一个鼠标位置(表示为一对点,或任何理论上的直线表示),然后计算该直线而不是单个点与对象的碰撞。
关于c++ - Windows鼠标坐标VS OpenGL鼠标坐标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16395510/