В Three.js для генерации теней используется система
рендеринга теней, в которой ключевую роль играет камера света,
называемая shadow.camera. Понимание и правильная настройка
этой камеры критично для получения качественных и корректных теней в
сцене.
В зависимости от типа источника света в Three.js,
shadow.camera может иметь разные формы:
THREE.OrthographicCamera). Тени генерируются как
параллельные лучи, что идеально для имитации солнечного света.THREE.PerspectiveCamera). Тени
направленные, с перспективным сжатием, подходящие для точечных
источников света.THREE.CubeCamera). Позволяет создавать
тени во всех направлениях вокруг точки.Для контроля качества и размеров теней у камеры света есть несколько ключевых свойств:
near и far – определяют минимальную и максимальную дистанцию от источника света, на которой будут отбрасываться тени. Установка слишком большого диапазона снижает точность теней из-за дискретизации карты теней.
light.shadow.camera.near = 1;
light.shadow.camera.far = 100;left, right, top, bottom – применяются для ортографических камер (DirectionalLight). Эти параметры задают границы камеры, определяя область сцены, где будут видны тени. Если тени обрезаются, необходимо увеличить эти значения:
light.shadow.camera.left = -10;
light.shadow.camera.right = 10;
light.shadow.camera.top = 10;
light.shadow.camera.bottom = -10;fov – угол обзора для перспективных камер (SpotLight). От него зависит, насколько широкая область освещается источником света и, соответственно, тени охватывают сцену:
light.shadow.camera.fov = 45;radius – управляет размытие краев тени (soft shadows) в некоторых типах источников света, улучшая реализм теней.
shadow.mapSize определяет разрешение текстуры, на
которую проецируются тени. Низкое разрешение приводит к зернистым или
пиксельным теням. Для повышения качества используют значения от 1024 до
4096 пикселей:
light.shadow.mapSize.width = 2048;
light.shadow.mapSize.height = 2048;
Для отладки удобно отображать камеру теней в сцене с помощью
CameraHelper:
const helper = new THREE.CameraHelper(light.shadow.camera);
scene.add(helper);
Это позволяет увидеть границы зоны, где рассчитываются тени, и
скорректировать left, right, top,
bottom, near и far без проб и
ошибок.
Качество теней зависит от нескольких факторов:
mapSize). Чем выше разрешение, тем
точнее, но выше нагрузка на GPU.shadow.camera). Слишком большая
зона уменьшает точность, слишком маленькая обрезает тени.near и far. Оптимальный
диапазон минимизирует артефакты, такие как «плавающие» или «ломаные»
тени.fov), чтобы улучшить детализацию тени.radius и проверьте фильтрацию карты теней через
THREE.PCFSoftShadowMap.mapSize, чтобы не перегружать
рендеринг.shadow.camera определяет видимую область для
теней.near, far, left,
right, top, bottom и
fov критична для точности теней.CameraHelper облегчает отладку и
настройку.Правильная конфигурация shadow.camera позволяет
создавать реалистичные и управляемые тени, существенно повышая
визуальное качество сцены в Three.js.