PointLight: радиус и затухание

PointLight — это источник света, который излучает свет во всех направлениях от своей позиции в 3D-пространстве. Он моделирует точечные источники света, подобные лампочкам или свечам. Основные параметры PointLight включают цвет, интенсивность, позицию и свойства затухания света.

const light = new THREE.PointLight(0xffffff, 1);
light.position.set(10, 10, 10);
scene.add(light);
  • Цвет (color) — определяет оттенок излучаемого света.
  • Интенсивность (intensity) — мощность света, обычно от 0 до нескольких единиц.
  • Позиция (position) — координаты источника в сцене.

Радиус действия: distance

Радиус, на котором свет оказывает влияние, задаётся свойством distance. Это максимальное расстояние от источника, на котором свет ещё виден. Если distance установлен в 0, свет распространяется бесконечно.

const light = new THREE.PointLight(0xffaa00, 1, 50); // свет до 50 единиц
  • При больших значениях distance свет может освещать всю сцену, что иногда нежелательно из-за производительности.
  • Малые значения создают более локальное освещение, например, для создания эффекта лампы или свечи.

Затухание света: decay

Свойство decay определяет, как быстро уменьшается интенсивность света с расстоянием. Оно моделирует физический закон обратного квадрата:

[ I = ]

где (I) — интенсивность на расстоянии (d), (I_0) — исходная интенсивность.

const light = new THREE.PointLight(0xffffff, 2, 100, 2); // decay = 2 — физически корректное затухание
  • decay = 1 — линейное затухание, свет уменьшается медленно.
  • decay = 2 — реалистичное физическое затухание, интенсивность падает быстро с увеличением расстояния.
  • decay > 2 — усиленное затухание, полезно для драматических локальных эффектов.

Взаимодействие distance и decay

Для управления реалистичным освещением важно согласовывать distance и decay. Малый distance с высоким decay создаёт яркий локальный источник. Большой distance с низким decay делает свет более равномерным по сцене.

const light = new THREE.PointLight(0x00ffcc, 3, 30, 1.5);
light.position.set(5, 10, 5);
scene.add(light);
  • Для интерьеров и небольших сцен часто используют distance ≈ 20–50 и decay ≈ 1–2.
  • Для открытых пространств или эффектов солнца можно оставить distance = 0 и минимальный decay.

Тени PointLight

PointLight может отбрасывать тени, что добавляет глубины сцене. Тени вычисляются для каждой стороны кубической карты (shadow.map).

light.castShadow = true;
light.shadow.mapSize.width = 1024;
light.shadow.mapSize.height = 1024;
light.shadow.camera.near = 0.5;
light.shadow.camera.far = 500;
  • mapSize — разрешение карты теней, влияет на резкость.
  • near/far — границы камеры света, регулируют точность теней и предотвращают артефакты.
  • Использование decay влияет на распределение интенсивности теней: резкое затухание делает тени более контрастными ближе к источнику.

Примеры использования

  1. Лампа над столом: маленький distance и высокий decay создают уютное локальное освещение.
  2. Фонарь на улице: средний distance с умеренным decay позволяет свету распространяться на несколько метров вокруг.
  3. Магический эффект или свеча: малый distance, высокий decay и тёплый цвет создают ощущение интимного света.

Визуализация радиуса света

Для отладки удобно добавить вспомогательный объект PointLightHelper:

const helper = new THREE.PointLightHelper(light, 1);
scene.add(helper);

Он визуализирует положение источника и радиус его действия, что упрощает настройку distance и decay.

Практические рекомендации

  • Стараться использовать realistic decay (обычно 2) для физически корректного освещения.

  • Не ставить distance слишком большим без необходимости — это снижает производительность.

  • Для динамических сцен, где свет двигается, контролировать decay для предотвращения резких перепадов яркости объектов.

  • Совмещать несколько PointLight для сложных сцен, избегая одного слишком мощного источника, который делает освещение плоским.

  • Использовать shadow только там, где это критично для сцены, так как кубические карты теней для PointLight ресурсоёмки.

Эффективное сочетание distance и decay позволяет моделировать практически любой тип локального освещения, от ламп и свечей до фонарей и магических источников света, создавая богатую и реалистичную сцену в Three.js.