Pointer Lock API в PlayCanvas

Pointer Lock API представляет собой механизм, который позволяет приложениям захватывать указатель мыши (курсор), скрывая его и позволяя ему свободно перемещаться по экрану. Это особенно полезно для создания приложений, таких как игры или 3D-сценарии, где требуется точное управление камерой или объектами в пространстве, не ограничивая пользователя границами экрана. В PlayCanvas использование Pointer Lock API открывает новые возможности для взаимодействия с пользователем, особенно в контексте виртуальной реальности или игровых проектов.

Основы работы с Pointer Lock API

Когда приложение захватывает указатель мыши, стандартный курсор скрывается, а движение мыши отслеживается без ограничений. Для того чтобы инициировать захват указателя, необходимо выполнить несколько шагов:

  1. Включить захват указателя с помощью метода requestPointerLock() объекта document.
  2. Отслеживать события, связанные с изменением состояния указателя, используя слушатели событий.
  3. Выходить из режима захвата указателя с помощью метода exitPointerLock().

В контексте PlayCanvas, этот процесс может быть интегрирован с другими элементами управления, такими как камеры, для создания более интуитивно понятного взаимодействия с виртуальными мирами.

Включение Pointer Lock в PlayCanvas

Для того чтобы начать использовать Pointer Lock API в PlayCanvas, необходимо выполнить несколько действий:

Шаг 1: Запрос на захват указателя

Чтобы захватить указатель, нужно инициировать событие, которое будет вызывать захват мыши. Обычно это происходит по событию, например, при нажатии кнопки мыши. Пример:

var app = pc.Application.getApplication();
var element = app.graphicsDevice.canvas;

element.addEventListener('click', function () {
    // Запрашиваем захват указателя
    element.requestPointerLock();
});

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

Шаг 2: Обработка захваченного указателя

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

document.addEventListener('mousemove', function (event) {
    var deltaX = event.movementX;
    var deltaY = event.movementY;

    // Перемещаем камеру в зависимости от движения мыши
    camera.rotateLocal(deltaY * 0.1, deltaX * 0.1, 0);
});

В этом примере используются значения movementX и movementY, которые представляют собой изменения положения указателя по осям X и Y, соответственно. Эти значения могут быть использованы для управления объектами или камерой в 3D-пространстве.

Шаг 3: Выход из режима Pointer Lock

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

document.addEventListener('keydown', function (event) {
    if (event.key === 'Escape') {
        document.exitPointerLock();
    }
});

Здесь с помощью события клавиши Escape приложение выходит из режима захвата указателя, восстанавливая обычное отображение курсора.

Работа с камерами и контроллерами

Одним из самых распространенных применений Pointer Lock API в PlayCanvas является управление камерой. В 3D-играх или приложениях с виртуальной реальностью камера может быть связана с движением указателя мыши, чтобы дать пользователю свободное управление. Например, можно использовать движение мыши для изменения угла обзора:

var CameraControl = pc.createScript('cameraControl');

// Инициализация скрипта
CameraControl.prototype.initialize = function () {
    this.sensitivity = 0.1; // Чувствительность движения мыши
};

// Обновление на каждом кадре
CameraControl.prototype.update = function (dt) {
    if (document.pointerLockElement === this.app.graphicsDevice.canvas) {
        var movementX = this.app.mouse.dx;
        var movementY = this.app.mouse.dy;

        // Обновление углов камеры
        this.entity.rotateLocal(movementY * this.sensitivity, movementX * this.sensitivity, 0);
    }
};

В данном примере скрипт управляет вращением камеры в зависимости от движений мыши. Чувствительность задается через переменную sensitivity, и вращение камеры происходит по осям X и Y в зависимости от изменений положения мыши.

Обработка ошибок и исключений

Важно учесть, что захват указателя может не всегда работать, если пользователи не выполнили необходимые действия или если браузер не поддерживает Pointer Lock API. Например, в некоторых браузерах или на мобильных устройствах этот функционал может быть ограничен. Чтобы обработать такие ситуации, можно использовать событие pointerlockerror:

element.addEventListener('pointerlockerror', function () {
    console.error('Не удалось захватить указатель.');
});

Это событие срабатывает, если захват указателя не удался. Например, это может происходить, если пользователь не имеет прав для захвата указателя или если захват был отклонен системой.

Совместимость с браузерами

Pointer Lock API поддерживается большинством современных браузеров, таких как Google Chrome, Firefox, Safari и Edge. Однако стоит помнить, что старые версии браузеров могут не поддерживать этот функционал. В таких случаях для пользователей может быть предусмотрено альтернативное решение или сообщение о том, что их браузер не поддерживает захват указателя.

Безопасность и UX

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

Заключение

Использование Pointer Lock API в PlayCanvas позволяет значительно улучшить взаимодействие пользователя с 3D-сценами, предоставляя ему возможность свободно управлять камерой или объектами в пространстве без ограничений на движении мыши. Это открывает новые горизонты для создания увлекательных и интуитивно понятных пользовательских интерфейсов в играх и других приложениях.