В Three.js класс PerspectiveCamera
предназначен для создания перспективной камеры, имитирующей человеческое
восприятие пространства. Она строит сцену так, что объекты уменьшаются в
размерах с увеличением расстояния до камеры, создавая ощущение
глубины.
Конструктор камеры имеет следующую сигнатуру:
const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
width / height).Поле зрения определяет, сколько пространства камера охватывает по вертикали.
В Three.js fov применяется только к вертикальному
измерению, горизонтальный угол вычисляется автоматически через
соотношение сторон aspect.
Соотношение сторон определяет пропорции изображения, чтобы оно не выглядело растянутым или сжатым.
const aspect = window.innerWidth / window.innerHeight;
При изменении размера окна важно обновлять aspect и
вызывать метод updateProjectionMatrix():
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
Это позволяет сохранять корректную перспективу при ресайзе.
near и far задают диапазон видимых объектов
относительно камеры.
Правильная установка этих значений критична для точности глубины и корректного рендеринга теней.
Рекомендации:
near не должно быть равно нулю (например,
0.1), иначе возникают артефакты глубины.far должно быть как можно меньше, но больше самой
дальней точки сцены.far / near влияет на точность буфера глубины,
особенно для теней и эффектов постобработки.После изменения любого из параметров камеры (fov,
aspect, near, far) необходимо
вызвать:
camera.updateProjectionMatrix();
Без этого изменения не вступят в силу, и сцена будет рендериться с предыдущими настройками.
Классическая камера для сцены:
const camera = new THREE.PerspectiveCamera(
75, // fov
window.innerWidth / window.innerHeight, // aspect
0.1, // near
1000 // far
);
camera.position.set(0, 2, 5); // установка позиции
camera.lookAt(0, 0, 0); // направление взгляда
Динамическое изменение при ресайзе:
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
Неправильная настройка этих параметров приводит к искажениям, исчезновению объектов и артефактам теней. Оптимальный выбор значений зависит от размеров сцены, расстояния до объектов и требуемого эффекта перспективы.
camera.position.set(x, y, z) — установка позиции
камеры.camera.lookAt(x, y, z) — направление взгляда на
точку.camera.updateProjectionMatrix() — пересчет матрицы
проекции после изменения параметров.Эти методы в сочетании с корректно подобранными fov,
aspect, near и far обеспечивают
реалистичную и управляемую перспективу сцены.