Источники света
Без света физический материал чёрный. Разбираем четыре типа источников и как их сочетать.
Свет в Three.js бывает четырёх основных видов; их комбинируют, чтобы получить и общую подсветку, и направленные тени.
Четыре типа
| Свет | Аналогия | Особенность |
AmbientLight | рассеянный свет дня | освещает всё одинаково, без теней |
DirectionalLight | солнце | параллельные лучи, даёт тени |
PointLight | лампочка | из точки во все стороны, слабеет с расстоянием |
SpotLight | прожектор | конус света в заданном направлении |
Ambient — общая подсветка
AmbientLight добавляет одинаковый свет ко всем поверхностям. Сам по себе он делает картинку плоской (нет теней, нет объёма), но в паре с направленным светом убирает «угольно-чёрные» тени и оживляет сцену.
const ambient = new THREE.AmbientLight(0xffffff, 0.4); // цвет, интенсивность
scene.add(ambient);
Directional — солнце
DirectionalLight светит параллельными лучами из направления — как далёкое солнце. У него есть позиция, задающая направление, и именно он обычно отбрасывает тени.
const sun = new THREE.DirectionalLight(0xffffff, 1);
sun.position.set(5, 10, 7); // лучи идут из этой точки в начало координат
scene.add(sun);
Point и Spot
PointLight — лампочка: светит во все стороны из точки и затухает с расстоянием (параметры distance и decay). SpotLight — прожектор: узкий конус с регулируемым углом. Их ставят для локальных акцентов: свет фонаря, лампа на столе, луч прожектора на сцене.
Рецепт «хорошего» освещения
Классический рабочий набор для начала — один Ambient послабее + один Directional посильнее. Ambient гарантирует, что ничего не утонет в черноте, а Directional даёт объём и тени. Дальше добавляйте Point/Spot для акцентов.
Почему именно так, а не «один яркий Ambient на всё»? Потому что Ambient светит со всех сторон одинаково и убивает объём: при нём шар выглядит как плоский круг — нет ни светлой, ни теневой стороны. Объём рождается из разницы освещённости граней, а её даёт только направленный свет. Поэтому Ambient держат слабым (роль «подсветки теней»), а форму лепит Directional.
Интенсивность и цвет
У каждого света два главных параметра: цвет и интенсивность. Цветом света легко задать настроение — тёплый желтоватый 0xffeecc для уюта, холодный голубоватый 0xcce6ff для ночи. Интенсивность — это яркость; в современных версиях Three.js свет считается физически, поэтому значения у разных типов света могут заметно отличаться, и их подбирают на глаз под конкретную сцену. Не бойтесь экспериментировать: освещение — это половина того, как сцена «читается» зрителем.
scene.add(new THREE.AmbientLight(0xffffff, 0.3));
const key = new THREE.DirectionalLight(0xffffff, 1);
key.position.set(4, 8, 6);
scene.add(key);
Итог
- Ambient — ровная подсветка без теней; Directional — солнце с тенями.
- Point — лампочка из точки; Spot — конус-прожектор.
- Базовый рецепт: слабый Ambient + сильный Directional.