Как увеличить расстояние, на которое мышь может перемещаться в окне OpenGL?
Чего я хочу добиться, так это интерфейса, похожего на fps, в котором курсор скрыт, а повороты камеры не ограничены тем, что мышь должна оставаться внутри границ окна.
Как увеличить расстояние, на которое мышь может перемещаться в окне OpenGL?
Чего я хочу добиться, так это интерфейса, похожего на fps, в котором курсор скрыт, а повороты камеры не ограничены тем, что мышь должна оставаться внутри границ окна.
Это часто реализуется путем «деформирования» мыши обратно в центр экрана в Linux. Вот ветка форума по этому вопросу с использованием популярного SDL библиотека для фактического чтения мышью.
В Windows рассмотрите возможность использования API ввода более низкого уровня, например XInput.
Используйте glutWarpPointer для перемещения мыши обратно в середину экрана после каждого движения мыши (это будет в glutMotionFunc, glutPassiveMotionFunc). Используйте glutsetcursor, чтобы изменить или скрыть внешний вид курсора.
Часть кода для этого, вероятно, должна быть специфичной для платформы. Например, в Windows вы обычно вращаете камеру, когда пользователь перетаскивает мышь. Вы бы справились с этим, захватив мышь и отвечая на WM_MOUSEMOVE
сообщений, пока она захвачена. Пока мышь захвачена, вы будете продолжать получать сообщения о перемещении мыши, даже если позиция курсора выходит за границы вашего окна.
Похоже, что unwind уже довольно хорошо рассмотрел X, поэтому я не буду повторяться здесь.
В зависимости от того, какую платформу и инструменты вы используете, вы можете просто позволить мыши двигаться, затем рассчитать расстояние, а затем переместить ее обратно в центр экрана (или окна OpenGl).
int x,y;
GetMousePosition(&x,&y);
int deltaX = x-SCREEN_WIDTH/2;
int deltaY = y-SCREEN_WIDTH/2;
MoveMouse(SCREEN_WIDTH/2,SCREEN_HEIGHT/2);
Таким образом, вы легко получаете движение мыши, удерживая мышь в одном и том же месте и, таким образом, избегая проблемы. Обратите внимание, что GetMousePosition
и MoveMouse
являются общими именами функций, так как это зависит от используемой ОС и/или библиотек.