【发布时间】:2013-04-30 00:25:09
【问题描述】:
我如何确定(我知道这不是正确使用的术语)对于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 告诉我的程序,由该算法生成的那些值(未被跟踪)已被鼠标越过。我会为所有这些位置添加另一个循环吗?
【问题讨论】:
-
如果您的计算机在 13 年前 之前被认为很慢,它仍然能够每秒执行超过 1 亿次 百万 次计算。将一对数字转换成另一对数字是否会让您认为您的计算机无法处理?
-
我的意思是,程序当前正在运行。不是处理器计算的操作系统。看看this
-
@NicolBolas 当我将鼠标悬停在窗口中时,您可以在我给出的链接中看到鼠标位置的巨大差异。除非这是将其打印到 bash 的问题
-
@mr5:能否请您向我们展示您的 GLFW 事件处理源代码? Nicol Bolas 是对的,即使是古代计算机也足够快,可以处理像将两个整数处理成两个浮点数这样简单的事情,甚至每秒一百万次,无论它实际执行的是哪个代码。请注意,如果您的鼠标输入分辨率跟不上您实际移动它的速度,您所看到的可能只是一个伪影(游戏玩家专用鼠标的存在是有原因的)。
-
@mr5:所以本质上你想存储鼠标指针在窗口中的路径。好吧,只需使用一个 std::vector 来添加
struct{float x, y; int timestamp};的元素。即使只有 1 MB 的数据,您也需要使用鼠标很长时间。在 60 Hz 的更新速率和 12 字节的结构大小下,将日志增长到 MB 需要 25 分钟。您可以使用此日志来插入其间的位置。大多数交互式应用程序实际上都会保留(短)鼠标移动日志,并使用它以完全这种方式平滑移动。
标签: c++ opengl mouse-coordinates