MeshPhongMaterial — это материал в библиотеке Three.js,
предназначенный для создания объектов с гладкими поверхностями и
реалистичными бликами. Он основан на модели освещения Фонга (Phong),
которая учитывает диффузное отражение,
зеркальные блики и окружающее
освещение. В отличие от MeshBasicMaterial, который
не реагирует на свет, MeshPhongMaterial делает объекты
чувствительными к источникам света в сцене.
Основные свойства материала:
MeshPhongMaterial разделяет освещение на два основных
компонента:
Диффузное отражение Отвечает за равномерное распространение света по поверхности. Основной цвет объекта умножается на интенсивность падающего света. Свойство color задает этот базовый тон.
Зеркальные блики (Specular Highlights) Создают эффект блеска на поверхности, отражая источник света в направлении камеры. Цвет блика задается через specular, а размер и резкость — через shininess.
Пример настройки материала:
const material = new THREE.MeshPhongMaterial({
color: 0x156289,
specular: 0xaaaaaa,
shininess: 100,
emissive: 0x072534
});
specularMap позволяет детализировать, где на поверхности
появляются блики. Белые области карты отражают свет максимально, черные
– не отражают.
const textureLoader = new THREE.TextureLoader();
const specMap = textureLoader.load('textures/specularMap.png');
const material = new THREE.MeshPhongMaterial({
color: 0x156289,
specular: 0xffffff,
shininess: 50,
specularMap: specMap
});
normalMap изменяет направление нормалей на поверхности
для создания иллюзии деталей без увеличения числа полигонов. Комбинация
normalMap и specularMap позволяет добиться реалистичного рельефного
блеска.
const normalTexture = textureLoader.load('textures/normalMap.png');
material.normalMap = normalTexture;
Для корректного отображения бликов необходимо использовать точечные (PointLight), направленные (DirectionalLight) или спотовые (SpotLight) источники света. AmbientLight влияет только на диффузное освещение, но не создает зеркальных бликов.
const pointLight = new THREE.PointLight(0xffffff, 1);
pointLight.position.set(10, 10, 10);
scene.add(pointLight);
const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
| Эффект | Свойства MeshPhongMaterial |
|---|---|
| Мягкий блеск | shininess: 10-30, specular: светло-серый |
| Металлическая поверхность | shininess: 100-300, specular: белый или цвет металла |
| Полупрозрачный объект | transparent: true, opacity: 0.5, color + specular |
| Свечение | emissive: цвет свечения, можно усилить с emissiveIntensity |
MeshLambertMaterial, который менее ресурсоёмкий.MeshPhongMaterial — ключевой инструмент для создания
реалистичных объектов с зеркальными бликами в Three.js. Грамотное
использование свойств specular, shininess,
specularMap и normalMap позволяет достигать
эффекта, близкого к физической реалистичности, без необходимости сложных
вычислений глобального освещения.