В Three.js освещение играет ключевую роль в создании реалистичных 3D-сцен. Библиотека предоставляет несколько типов источников света, каждый из которых моделирует различные физические свойства света. Правильный выбор освещения напрямую влияет на восприятие объектов, глубину сцены и визуальное качество рендеринга.
AmbientLight Обеспечивает равномерное, рассеянное освещение всех объектов сцены. Не создаёт теней и не зависит от положения объектов. Используется для общей подсветки, чтобы избежать полностью тёмных областей.
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);DirectionalLight Имитирует параллельные лучи света, как от солнца. Направление света задаётся вектором, а интенсивность постоянна по всей сцене. Может создавать тени.
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(10, 10, 10);
directionalLight.castShadow = true;
scene.add(directionalLight);PointLight Точечный источник света, излучающий
во все стороны. Эффект похож на лампу накаливания. Для реалистичных сцен
важно настроить параметры distance и
decay.
const pointLight = new THREE.PointLight(0xff0000, 1, 50, 2);
pointLight.position.set(5, 5, 5);
scene.add(pointLight);SpotLight Направленный световой конус, похожий
на прожектор. Позволяет управлять углом конуса (angle) и
резкостью границ (penumbra). Используется для акцентной
подсветки.
const spotLight = new THREE.SpotLight(0xffffff, 1);
spotLight.position.set(15, 40, 35);
spotLight.angle = Math.PI / 6;
spotLight.penumbra = 0.2;
spotLight.castShadow = true;
scene.add(spotLight);HemisphereLight Симулирует свет от неба и отражённого света от земли. Верхняя часть света окрашена в один цвет, нижняя — в другой. Отлично подходит для дневных сцен на открытом воздухе.
const hemiLight = new THREE.HemisphereLight(0xffffbb, 0x080820, 1);
scene.add(hemiLight);Материалы определяют, как объекты взаимодействуют со светом. В Three.js реализованы как физически корректные, так и **упрощённые модели.
Материал без влияния света. Используется для объектов, которые должны иметь постоянный цвет независимо от источников света.
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
Использует модель Ламберта для рассеянного отражения. Свет влияет на материал, создавая мягкие тени и реалистичное освещение без бликов. Оптимален для объектов без глянцевых поверхностей.
const material = new THREE.MeshLambertMaterial({ color: 0x00ff00 });
Добавляет отражения и блики (specular highlights) с использованием
модели Фонга. Позволяет задавать shininess для контроля
блеска поверхности.
const material = new THREE.MeshPhongMaterial({
color: 0x00ff00,
specular: 0x555555,
shininess: 30
});
Физически корректный материал, основанный на модели PBR
(Physically Based Rendering). Поддерживает металлические и
диэлектрические свойства через параметры metalness и
roughness. Подходит для реалистичных сцен с множеством
источников света.
const material = new THREE.MeshStandardMaterial({
color: 0x00ff00,
metalness: 0.5,
roughness: 0.4
});
Расширение MeshStandardMaterial с поддержкой прозрачности, отражений, тонкого слоя (clearcoat) и субповерхностного рассеяния. Используется для материалов, требующих сложного поведения света, таких как автомобильные покрытия или пластик.
const material = new THREE.MeshPhysicalMaterial({
color: 0x00ff00,
metalness: 0.5,
roughness: 0.3,
clearcoat: 1.0,
clearcoatRoughness: 0.1
});
Lambert,
Standard) реагируют на угол падения света, создавая плавные
тени.Phong,
Physical) формируют блики, изменяя интенсивность в
зависимости от позиции источника и угла обзора камеры.Правильное сочетание типа света и материала определяет качество визуализации. Например, точечный свет с Phong или Physical материалом создаёт выразительные блики, тогда как для Lambert лучи света дают только мягкие тени без блеска.
Для реалистичного освещения важно включить тени:
Разрешить объекту отбрасывать тени:
mesh.castShadow = true;Разрешить объекту принимать тени:
mesh.receiveShadow = true;Убедиться, что свет поддерживает тени:
directionalLight.castShadow = true;Настройки shadow.mapSize, shadow.bias и
shadow.camera позволяют контролировать качество и точность
теней, предотвращая артефакты и “зазубрины” на краях.
Цвет источника света задаёт атмосферу сцены. Например, тёплые оттенки
(желтые, оранжевые) создают ощущение заката, холодные (синие) — дневного
света. Интенсивность (intensity) регулирует яркость света,
а параметр distance у точечных источников ограничивает
радиус действия.
Three.js поддерживает HDR-текстуры и environment maps для имитации сложного освещения:
const hdrLoader = new THREE.RGBELoader();
hdrLoader.load('path/to/hdr.hdr', function(texture) {
texture.mapping = THREE.EquirectangularReflectionMapping;
scene.environment = texture;
});
Эти элементы совместно формируют реалистичное освещение и визуальное качество сцены, позволяя создавать сцены с глубиной, объемом и динамикой света.