Библиотека Three.js предоставляет несколько систем управления камерой, позволяющих создавать интерактивные 3D-сцены. Среди них FlyControls и FirstPersonControls являются наиболее гибкими для перемещения по сцене с точки зрения наблюдателя.
FlyControls реализуют свободное движение камеры в трехмерном пространстве, напоминающее полет. Камера может двигаться во всех направлениях, включая вертикальную ось, а также вращаться вокруг всех трех осей.
movementSpeed — скорость перемещения камеры. Позволяет
регулировать, насколько быстро камера проходит через сцену.rollSpeed — скорость вращения камеры по оси z.
Позволяет имитировать «наклон» при маневрировании.dragToLook — булевое значение. Если true,
вращение камеры осуществляется только при зажатой кнопке мыши.autoForward — если установлено в true,
камера будет автоматически двигаться вперед.const controls = new THREE.FlyControls(camera, renderer.domElement);
controls.movementSpeed = 20;
controls.rollSpeed = Math.PI / 24;
controls.dragToLook = true;
controls.autoForward = false;
function animate() {
requestAnimationFrame(animate);
const delta = clock.getDelta();
controls.update(delta);
renderer.render(scene, camera);
}
animate();
Особенности:
FirstPersonControls предназначены для эмуляции перемещения с точки зрения человека, находящегося внутри сцены. В отличие от FlyControls, движение камеры обычно ограничено горизонтальной плоскостью, что приближает поведение к реальному передвижению человека.
movementSpeed — скорость перемещения.lookSpeed — чувствительность вращения камеры при
движении мышью.lookVertical — разрешает или запрещает вертикальное
вращение.constrainVertical — ограничивает вращение по вертикали
в пределах verticalMin и verticalMax.verticalMin и verticalMax — минимальный и
максимальный угол вертикального обзора.const controls = new THREE.FirstPersonControls(camera, renderer.domElement);
controls.movementSpeed = 10;
controls.lookSpeed = 0.1;
controls.lookVertical = true;
controls.constrainVertical = true;
controls.verticalMin = 1.0;
controls.verticalMax = 2.0;
function animate() {
requestAnimationFrame(animate);
const delta = clock.getDelta();
controls.update(delta);
renderer.render(scene, camera);
}
animate();
Особенности:
| Свойство | FlyControls | FirstPersonControls |
|---|---|---|
| Полное 3D движение | Да | Нет (обычно ограничено горизонтально) |
| Вращение вокруг всех осей | Да | Обычно только yaw/pitch |
| Эмуляция человека | Нет | Да |
| Использование в играх | Симуляторы полета | FPS и виртуальные туры |
| Настройка скорости | movementSpeed, rollSpeed | movementSpeed, lookSpeed |
| Ограничение вертикали | Нет | Да (constrainVertical) |
| Движение вперед без ввода | autoForward | Нет |
Обновление контролов через delta
Оба контроллера требуют передачи времени между кадрами
(clock.getDelta()) в метод update(), чтобы
движение оставалось плавным при изменении частоты кадров.
События мыши и клавиатуры Контролы автоматически обрабатывают ввод мыши и клавиатуры, но могут конфликтовать с другими библиотеками событий. В таких случаях нужно использовать отдельные обработчики событий и передавать их контролам.
Совмещение с анимацией сцены Контролы не
блокируют основную функцию animate(), поэтому их легко
интегрировать с объектами, анимациями и постэффектами. Обновление камеры
должно выполняться перед рендерингом.
Ограничение движения Для FlyControls можно реализовать зоны или границы движения через проверку координат камеры. Для FirstPersonControls часто используются коллайдеры, чтобы предотвратить прохождение через объекты.
Производительность Частое обновление матриц
камеры и обработка ввода может влиять на FPS в больших сценах.
Оптимизация заключается в минимизации числа объектов и включении
frustum culling.
Эти контролы являются базой для интерактивных 3D-приложений, обеспечивая свободу перемещения и реалистичное ощущение присутствия в виртуальной среде.