MeshLambertMaterial: диффузное освещение

MeshLambertMaterial — это материал в библиотеке Three.js, предназначенный для реализации диффузного освещения. Его ключевое отличие от MeshBasicMaterial заключается в том, что он учитывает источник света в сцене, создавая естественное затенение поверхностей без сложного расчёта отражений и бликов. Этот материал идеально подходит для объектов, где требуется реалистичное распределение света, но не критичны зеркальные отражения.

Основные свойства:

  • color — базовый цвет объекта. Может задаваться в формате 0xffffff или через строку 'red'.
  • map — текстура, применяемая к поверхности.
  • lightMap — текстура освещённости для имитации статического освещения.
  • emissive — цвет, который объект испускает независимо от освещения.
  • emissiveIntensity — интенсивность эмиссивного света.
  • vertexColors — если включено, цвет вершин будет учитываться при отрисовке.

Подключение и создание объекта

Для использования MeshLambertMaterial необходимо создать геометрию и указать материал:

const geometry = new THREE.BoxGeometry(2, 2, 2);
const material = new THREE.MeshLambertMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

Здесь cube реагирует на источники света в сцене. Без освещения объект будет выглядеть тёмным, так как диффузное затенение требует внешнего источника света.

Источники света

MeshLambertMaterial корректно отображает следующие типы света:

  • DirectionalLight — имитирует свет от далёкого источника, например, солнца. Создаёт параллельные лучи и чёткие тени.
  • PointLight — точечный источник света, распространяющийся во всех направлениях. Интенсивность затухает с расстоянием.
  • SpotLight — конус света с заданным углом падения. Удобно для фокусировки на отдельных объектах.
  • AmbientLight — равномерное фоновое освещение. Не создаёт затенения, только повышает общий уровень яркости сцены.

Пример подключения освещения:

const ambientLight = new THREE.AmbientLight(0x404040); 
scene.add(ambientLight);

const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(5, 10, 7.5);
scene.add(directionalLight);

Настройка диффузного освещения

  • Интенсивность света (intensity) напрямую влияет на яркость материала.
  • Цвет света (color) задаёт оттенок затенённых областей.
  • Для реалистичного эффекта рекомендуется комбинировать несколько источников с разными позициями и цветами.

Эмиссивный свет и текстуры

emissive позволяет материалу «светиться» независимо от внешнего освещения, что полезно для имитации экранов, ламп и декоративных элементов. Текстуры (map) накладываются на диффузный цвет и при необходимости комбинируются с lightMap для предрассчитанного освещения.

const texture = new THREE.TextureLoader().load('texture.jpg');
const material = new THREE.MeshLambertMaterial({
  map: texture,
  emissive: 0x111111,
  color: 0xffffff
});

Если включён vertexColors, то итоговый цвет рассчитывается как комбинация цвета вершин и освещения:

const geometry = new THREE.BoxGeometry(2, 2, 2);
geometry.setAttribute('color', new THREE.Float32BufferAttribute([
  1,0,0,  0,1,0,  0,0,1,  1,1,0,
  1,0,1,  0,1,1,  0.5,0.5,0.5,  1,1,1
], 3));

const material = new THREE.MeshLambertMaterial({ vertexColors: true });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

Ограничения

  • MeshLambertMaterial не поддерживает зеркальные отражения и блеск. Для них используется MeshPhongMaterial или MeshStandardMaterial.
  • Реалистичное затенение зависит от количества и расположения источников света.
  • Не подходит для объектов с высокой детализацией бликов и прозрачности.

Применение в сценах

Материал широко используется для:

  • Архитектурных сцен и интерьеров.
  • Игровых объектов с простым освещением.
  • Прототипирования и визуализации, где не требуется сложная физическая модель света.
  • Эффектов свечения и мягкого диффузного затенения, комбинируя emissive и ambientLight.

Советы по оптимизации

  • Для больших сцен с множеством объектов диффузный материал более производителен, чем MeshPhongMaterial или MeshStandardMaterial.
  • Использование lightMap позволяет уменьшить вычисления реального освещения.
  • Комбинация AmbientLight и DirectionalLight создаёт естественный баланс между общим светом и тенями.

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