ArcRotateCamera — это камера, которая позволяет пользователю вращать и перемещать точку обзора вокруг объекта. В отличие от стандартной камеры, которая фиксирует точку зрения, ArcRotateCamera позволяет создавать интерактивные сцены с динамическим управлением углами обзора.
Для реализации орбитального вращения ArcRotateCamera используется система координат, в которой можно задать начальную позицию камеры, центр вращения и ограничения по углам поворота.
Пример инициализации камеры:
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.
Пример:
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 поддерживает управление как с помощью мыши, так и с помощью сенсорных экранов. В случае работы с мышью, камера позволяет:
Для сенсорных экранов используются аналогичные жесты:
Все эти элементы управления можно настроить или отключить, если требуется специфическое поведение сцены.
Для более тонкой настройки взаимодействия с пользователем можно подписаться на события камеры. Например, можно отследить момент, когда камера достигает минимального или максимального угла:
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-сцен, позволяя пользователю вращать камеру вокруг объекта и настраивать пределы для более точного и ограниченного взаимодействия. С помощью правильной настройки углов и радиусов можно контролировать, какие части сцены доступны для просмотра, а какие — нет.