ArcRotateCamera: орбитальное вращение и настройка пределов

ArcRotateCamera — это камера, которая позволяет пользователю вращать и перемещать точку обзора вокруг объекта. В отличие от стандартной камеры, которая фиксирует точку зрения, ArcRotateCamera позволяет создавать интерактивные сцены с динамическим управлением углами обзора.

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

Основные параметры ArcRotateCamera

  1. alpha — угол вращения вокруг оси Y (горизонтальный угол).
  2. beta — угол вращения вокруг оси X (вертикальный угол).
  3. radius — расстояние от камеры до точки вращения.
  4. target — точка, вокруг которой происходит вращение.

Пример инициализации камеры:

const camera = new BABYLON.ArcRotateCamera("camera1", Math.PI / 2, Math.PI / 4, 10, BABYLON.Vector3.Zero(), scene);

Здесь:

  • "camera1" — уникальный идентификатор камеры.
  • Math.PI / 2 — угол alpha.
  • Math.PI / 4 — угол beta.
  • 10 — расстояние до центра сцены.
  • BABYLON.Vector3.Zero() — точка вращения (в данном случае центр сцены).

Углы вращения: настройка пределов

По умолчанию ArcRotateCamera позволяет вращать сцену без ограничений, однако часто возникает необходимость ограничить углы вращения камеры. Это полезно, например, когда нужно избежать просмотра объектов “снизу” или “сверху”, или чтобы предотвратить выход за пределы определённых углов обзора.

Для ограничения углов вращения используются параметры lowerAlpha, upperAlpha, lowerBeta и upperBeta.

  • lowerAlpha и upperAlpha — минимальный и максимальный углы вращения вокруг оси Y (горизонтальная ось).
  • lowerBeta и upperBeta — минимальный и максимальный углы вращения вокруг оси X (вертикальная ось).

Пример:

camera.lowerBetaLimit = Math.PI / 8;    // Минимальный угол beta (верх-низ)
camera.upperBetaLimit = Math.PI / 2;    // Максимальный угол beta
camera.lowerAlphaLimit = Math.PI / 4;   // Минимальный угол alpha (влево-вправ)
camera.upperAlphaLimit = Math.PI * 1.5; // Максимальный угол alpha

Эти настройки ограничивают камеру так, чтобы она не могла выходить за указанные углы вращения. Это особенно полезно при визуализации объектов, где важно не выходить за границы.

Пример работы с ограничениями

Чтобы понять, как работают эти ограничения, рассмотрим следующий пример, где камера будет вращаться вокруг 3D-модели, но не сможет выйти за установленные пределы:

const camera = new BABYLON.ArcRotateCamera("camera1", Math.PI / 2, Math.PI / 4, 10, BABYLON.Vector3.Zero(), scene);

camera.lowerBetaLimit = Math.PI / 6;
camera.upperBetaLimit = Math.PI / 2.5;
camera.lowerAlphaLimit = Math.PI / 4;
camera.upperAlphaLimit = Math.PI * 1.5;

Теперь камера ограничена углами вращения. Например, вращение по оси X (beta) будет ограничено диапазоном от π/6 до π/2.5, а по оси Y (alpha) — от π/4 до 3π/2.

Ограничение расстояния: минимальный и максимальный радиус

Кроме углов, важно настроить расстояние от камеры до объекта. Для этого используется параметр radius.

С помощью свойств lowerRadiusLimit и upperRadiusLimit можно задать минимальное и максимальное расстояние от камеры до объекта.

Пример:

camera.lowerRadiusLimit = 5;    // Минимальное расстояние
camera.upperRadiusLimit = 20;   // Максимальное расстояние

Теперь камера не сможет приблизиться к объекту ближе, чем на 5 единиц, и не удалиться от него дальше, чем на 20 единиц.

Взаимодействие с мышью и сенсорными экранами

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

  • Левый клик — вращение по осям X и Y.
  • Правый клик — изменение радиуса (отдаление/приближение).
  • Скролл мыши — увеличение или уменьшение расстояния.

Для сенсорных экранов используются аналогичные жесты:

  • Прокачка двумя пальцами — изменение радиуса.
  • Перетаскивание двумя пальцами — вращение сцены.

Все эти элементы управления можно настроить или отключить, если требуется специфическое поведение сцены.

Использование событий

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

camera.onBeforeRenderObservable.add(() => {
    if (camera.beta < camera.lowerBetaLimit) {
        camera.beta = camera.lowerBetaLimit;
    }
    if (camera.beta > camera.upperBetaLimit) {
        camera.beta = camera.upperBetaLimit;
    }
});

Такой код позволяет гарантировать, что камера всегда будет находиться в допустимых пределах. Он выполняется на каждом кадре перед рендерингом.

Переключение между видами

Одной из полезных возможностей ArcRotateCamera является возможность переключать виды и фокусировать камеру на различных объектах сцены. Для этого используется метод setTarget, который позволяет изменять точку вращения камеры:

camera.setTarget(new BABYLON.Vector3(10, 0, 0));

Это полезно, например, когда нужно переключаться между несколькими объектами или сценами.

Заключение

ArcRotateCamera является мощным инструментом для создания интерактивных 3D-сцен, позволяя пользователю вращать камеру вокруг объекта и настраивать пределы для более точного и ограниченного взаимодействия. С помощью правильной настройки углов и радиусов можно контролировать, какие части сцены доступны для просмотра, а какие — нет.