Как я могу определить (это неправильный термин для использования, я знаю), что для каждый положение мыши в window space
, он преобразуется в OGL space
(-1, 1). В этом случае пользователь перемещает мышь очень быстро, что я предполагаю все из его предыдущих позиций преобразуются в координаты OGL. Я пытаюсь сказать, что … это обычный процессор, достаточно быстрый, чтобы сделать это (чтобы отследить все предыдущие события), даже если мой C++ OGL coordinates converter
это очень дорого? допустим, я поставил там очень трудоемкие циклы? или .. очень быстро 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). В одном выполнении цикла положение мыши изменилось очень далеко от того, что было раньше. Теперь, как я могу сказать своей программе, реализуя Bresenham's line algorithm
как упоминал Кристиан Рау, эти значения, сгенерированные этим алгоритмом (не отслеживаемые), были пересечены мышью. Буду ли я добавить еще один цикл для этого для всех этих позиций?
Как я могу убедиться, что координаты OGL не будут пропущены, если я
мышь достаточно быстрая?
Это невозможно, поскольку нет никакой возможности позволить ОС генерировать события мыши для каждой точки, которую движение мыши могло бы пересечь, если бы оно отслеживалось с теоретически бесконечной точностью.
Единственный способ убедиться в этом — заполнить недостающие точки между двумя (возможно, далеко) позициями мыши самостоятельно. Если вы просто хотите нарисовать точку для каждой позиции, над которой перемещался мосхей (возможно, с использованием OpenGL), вместо этого нарисуйте линию.
С другой стороны, если вам понадобятся эти промежуточные позиции мыши для дальнейших вычислений, вы сами не сможете их вычислить, используя какой-либо общий алгоритм растеризации линии (например, Алгоритм Брезенхема, Алгоритм школьной книги для растеризации линий). По сути, это вычисляет каждую точку на дискретной сетке, которую пересекла бы линия от одной точки к другой (аналогично тому, что делает ваша видеокарта при преобразовании линии в дискретные пиксели), так что это будет генерировать каждую дискретную позицию мыши в вашем виртуальном путь мыши пересек (игнорируя любые нелинейные движения мыши между точками измерения).
РЕДАКТИРОВАТЬ: Если вам не нужна дискретная линия с надлежащими характеристиками равной ширины, гораздо более простой способ, чем возиться с растеризацией линии, — это просто работать с позициями с плавающей запятой и выполнять простую линейную интерполяцию конечных точек, например datenwolf пишет в своем комментарии. Это также даст вам лучшую точность синхронизации, чем дискретные позиции мыши. Но все зависит от того, что вы на самом деле хотите сделать с этими позициями мыши (и теперь это был бы хороший способ сообщить нам).
РЕДАКТИРОВАТЬ: Из вашего обновленного вопроса выглядит так, как будто вам нужны позиции мыши с высокой степенью детализации, чтобы вычислить столкновение мыши с некоторыми объектами. В этом случае вам вообще не нужны промежуточные точки. Просто возьмите линию от текущей позиции мыши до предыдущей (представленной в виде пары точек или любого теоретического линейного представления) и вычислите столкновение объектов с этой линией вместо отдельных точек.
Других решений пока нет …