Этот свет излучается из одной точки в одном направлении, вдоль конуса, размер которого увеличивается тем больше, чем дальше от света он находится.
Этот свет может отбрасывать тени - подробности смотрите на странице SpotLightShadow.
В «Вердж3Д» направленные источники света могут работать в двух различных режимах в зависимости от значения флага .isFreeLight. Если isFreeLight=true, SpotLight эквивалентен тому, что часто называют "Target Directional Light" в «3дс Максе». Если isFreeLight=true, источник света эквивалентен "Free Directional Light" в «3дс Максе», "Sun" в «Блендере» или просто "Directional Light" в «Майе».
В любом случае направление света рассчитывается как направление от Object3D.position источника света к target. В первом режиме target указывается явно, а во втором режиме target рассчитывается движком на основе поворота Object3D.quaternion источника освещения.
// белый прожектор, светящий сбоку и отбрасывающий тени
const spotLight = new v3d.SpotLight(0xffffff);
spotLight.position.set(100, 1000, 100);
spotLight.castShadow = true;
spotLight.shadow.mapSize.width = 1024;
spotLight.shadow.mapSize.height = 1024;
spotLight.shadow.camera.near = 500;
spotLight.shadow.camera.far = 4000;
spotLight.shadow.camera.fov = 30;
app.scene.add(spotLight);
0xffffff (белый).1.0 (без ограничения).0 до 1. По умолчанию 0.Создает новый SpotLight.
Общие свойства смотрите в базовом классе Light.
Максимальный размах прожектора, в радианах, от его направления. Должно быть не более Math.PI/2. По умолчанию Math.PI/3.
Если установить значение true, свет будет отбрасывать динамические тени. Предупреждение: это дорого и требует настройки, чтобы тени выглядели правильно. Подробности смотрите в SpotLightShadow. По умолчанию используется значение false.
Величина ослабления света в зависимости от расстояния до него. По умолчанию 2. Для физически корректного освещения вам не следует менять этот параметр.
Когда расстояние равно нулю, свет будет ослабевать по закону обратного квадрата до бесконечного расстояния. Когда расстояние ненулевое, свет будет ослабевать по обратно-квадратичному закону до тех пор, пока не приблизится к отсечке расстояния, где он будет быстро и плавно ослабевать до 0. Подобная отсечка не является физически корректной.
По умолчанию 0.0.
Интенсивность источника освещения. По умолчанию 1. Интенсивность это сила света, измеряемая в канделах (кд).
Изменение этого параметра также изменяет мощность.
Флаг, используемый для определения источников освещения без явной цели. Для таких источников виртуальный target рассчитывается на основе поворота, применённого к объекту источника освещения.
Указывает, что данный объект является экземпляром класса SpotLight. Только для чтения.
Процент конуса прожектора, который ослаблен из-за полутени. Принимает значения от нуля до 1. По умолчанию 0.0.
Он устанавливается равным Object3D.DefaultUp (0, 1, 0), чтобы свет светил сверху вниз.
Мощность источника. Мощность это световой поток источника освещения, измеряемый в люменах (лм).
Изменение этого параметра также изменяет интенсивность.
SpotLightShadow используется для расчета теней для этого света.
Прожектор указывает из своего положения position на target.position. По умолчанию позиция целевого объекта равна (0, 0, 0)
Чтобы положение целевого объекта можно было изменить на любое другое, отличное от значения по умолчанию, его необходимо добавить в сцену с помощью функции
app.scene.add(light.target);
Это делается для того, чтобы matrixWorld целевого объекта автоматически обновлялся каждый кадр.
Если isFreeLight=false, также можно установить цель на другой объект в сцене (все, что имеет свойство position):
const targetObject = new v3d.Object3D();
app.scene.add(targetObject);
light.target = targetObject;
После этого прожектор будет отслеживать целевой объект.
Общие методы смотрите в базовом классе Light.
Копирует значения всех свойств из source в данный SpotLight.
Освобождает все связанные с GPU ресурсы, используемые экземпляром SpotLight. Этот метод следует вызвать, если SpotLight больше не используется в приложении.
Следующие пазлы могут работать с прожекторами:
О том как получить исходный код этого модуля читайте тут.