Для работы с OrbitControls необходимо подключить модуль отдельно, так
как он не входит в основной пакет three.js:
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
После создания сцены, камеры и рендера создаётся контроллер:
const controls = new OrbitControls(camera, renderer.domElement);
Ключевой момент: OrbitControls
привязывается к элементу DOM, через который будет происходить
взаимодействие с пользователем. Обычно это
renderer.domElement.
Вращение позволяет осматривать объекты вокруг целевой точки
(target), которая по умолчанию находится в начале координат
(0, 0, 0):
controls.target.set(0, 1, 0); // смещение центра вращения
controls.update();
controls.enableRotate — включение или отключение
вращения.controls.rotateSpeed — скорость вращения сцены.
Значения >1 ускоряют, <1 замедляют вращение.Особенности:
controls.target.controls.maxPolarAngle и
controls.minPolarAngle:controls.minPolarAngle = Math.PI / 4; // минимальный угол от вертикали
controls.maxPolarAngle = Math.PI / 2; // максимум
Это предотвращает переворот камеры под сценой.
Zoom позволяет приближать и удалять камеру относительно целевой точки:
controls.enableZoom = true;
controls.zoomSpeed = 1.2; // чувствительность колёсика мыши
Для перспективной камеры (THREE.PerspectiveCamera) зум
реализуется как изменение позиции камеры. Для ортографической
(THREE.OrthographicCamera) — изменение масштаба
zoom.
Можно ограничить диапазон приближения:
controls.minDistance = 5;
controls.maxDistance = 50;
Это важно для предотвращения пересечения камеры с объектами или слишком большого удаления.
Панорамирование перемещает камеру параллельно плоскости экрана, сохраняя ориентацию:
controls.enablePan = true;
controls.panSpeed = 0.8;
controls.target. Например:const panLimit = 10;
controls.target.clamp(
new THREE.Vector3(-panLimit, -panLimit, -panLimit),
new THREE.Vector3(panLimit, panLimit, panLimit)
);
Для плавного взаимодействия с камерой необходимо вызывать
controls.update() на каждом кадре:
function animate() {
requestAnimationFrame(animate);
controls.update(); // синхронизация при инерции
renderer.render(scene, camera);
}
animate();
Если включена инерция (controls.enableDamping = true),
нужно настроить коэффициент демпфирования:
controls.enableDamping = true;
controls.dampingFactor = 0.05; // значение от 0 до 1, влияет на "торможение"
OrbitControls поддерживает различные режимы мыши:
controls.mouseButtons.LEFT = THREE.MOUSE.ROTATE — левый
крутит.controls.mouseButtons.MIDDLE = THREE.MOUSE.DOLLY —
средняя кнопка для зума.controls.mouseButtons.RIGHT = THREE.MOUSE.PAN — правая
кнопка для панорамирования.Можно полностью переназначить действия или отключить ненужные:
controls.enableRotate = false; // отключение вращения
controls.enableZoom = true; // включение зума
controls.enablePan = true; // включение панорамирования
controls.autoRotate = true; и
controls.autoRotateSpeed = 2.0;. Камера вращается без
участия пользователя.controls.minDistance и controls.maxDistance
предотвращают выход за пределы сцены.minPolarAngle и
maxPolarAngle регулируют вертикальное вращение,
minAzimuthAngle и maxAzimuthAngle —
горизонтальное.controls.update() в анимационном цикле,
особенно при включенной инерции.target для удобного вращения вокруг объекта
сцены.touch
события, которые поддерживаются OrbitControls автоматически
(pinch для зума, one finger drag для
вращения).Эти методы делают OrbitControls универсальным
инструментом для интерактивного осмотра 3D-сцен в Three.js,
обеспечивая полное управление камерой с гибкой настройкой.