Обработка движения мыши в стиле камеры в Javascript (включение непрерывного движения мыши)

идея: Я создаю простой скрипт WebGL (используя замечательные три mrdoob.в JS), что позволяет пользователю управлять камерой в мире объектов. Камера должна имитировать традиционные камеры шутера от первого лица (например, ссылка Team Fortress 2). То есть камера движется только тогда, когда движется мышь.

вопрос: в Javascript единственный способ обнаружить движение мыши - это перемещение самого курсора. Для сравнения, FPS игры не показывайте курсор - они только основывают движение камеры от того, как движется сама мышь. Таким образом, вы можете перемещать мышь по всему коврику мыши в любом направлении, и он всегда работает.

в браузере, хотя, поскольку движение камеры основано на курсоре, вы не можете двигаться, но до сих пор. Когда курсор попадает на край экрана, пользователь не может смотреть дальше в этом направлении (например, вы перемещаете мышь к левому краю экрана, вы не можете смотреть влево более.)

решение: Я подумал о двух решениях, но ни одно из которых я не знаю, как реализовать. Либо

  1. после перемещения мыши javascript сбрасывает ее в центр экрана. Таким образом, после каждого движения мыши игрок волен двигаться в любом направлении. Проблема в том, что, основываясь на проведенных мной исследованиях, Javascript не может контролировать положение мыши пользователя (понятно, как это было бы быть несравненной помехой на злокачественных участках).

  2. или мышь "обертывается" вокруг экрана. Это означает, что когда пользователь достигает одного края экрана, мышь просто переходит на другую сторону экрана. (см.:http://www.digicowsoftware.com/detail?_app=Wraparound) однако, похоже, что это тоже не является неотъемлемой возможностью javascript, но вместо этого это только то, что сторонняя программа может решать.

Итак, проблема имеет смысла? Если да, то есть ли способ реализовать вышеуказанные решения, или есть еще один, которого мне не хватает?

4 ответов


для тех, кто все еще заинтересован в достижении этого, теперь он несколько доступен.

использование:

document.addEventListener('pointerlockchange', changeCallback, false);

см. пример http://www.html5rocks.com/en/tutorials/pointerlock/intro/


мировое сообщество в настоящее время работает над проектом спецификации для решения этой проблемы. То, что вы заявляете, называется "блокировкой мыши". Я немного поработал над первой фазой этого стандарта, чтобы помочь изложить то, что нужно. Пожалуйста, проголосуйте за эти вопросы и подпишитесь на указанные почтовые списки, чтобы все мы могли исправить эту проблему как можно скорее.

тем не менее, есть еще способ достичь своей цели (который я нашел другим способом): родной плагин, который контролирует мышь.

(Я тоже делаю игру, которая является FPS, но в настоящее время не будет выпущена из-за этого ограничения)


ты прав насчет всего этого. Основанная на стандартах веб-технология не даст вам захват мыши, как вы хотите.

это сказало: вы можете создать (или найти) специальный SWF, который может собирать данные о движении мыши и передавать их в javascript. Это не будет ограничивать движение курсора, хотя вы можете использовать CSS, чтобы скрыть курсор, пока захват мыши активен. Но он может быть в состоянии, например, продолжать стрелять" переместить мышь влево " события, даже когда курсор достиг левой край экрана.

любой такой SWF, вероятно, не сможет захватить движение, когда курсор находится вне окна просмотра, т. е. над браузером chrome.


учитывая, что это, по-видимому, невозможно сделать в HTML5/Javascript, как насчет этого варианта: лечить мышь позиция (не движение мыши) как представляющее скорость поворота.

таким образом, если мышь больше определенного порога слева от центра, камера поворачивается влево; чем левее мышь, тем быстрее камера поворачивается. Чтобы остановить поворот, игрок перемещает мышь обратно к центру.

для меня это раздражающий интерфейс, по крайней мере, сначала, но, возможно, игрок привыкнет к этому. Поскольку у нас нет идеальных решений, возможно, стоит попробовать. Вы можете уменьшить проблему, позволяя клавишам со стрелками работать так, как они работают во многих FPSes, вращая камеру при нажатии.