Карта окружения (envMap) представляет собой текстуру, которая используется для имитации отражений окружающей среды на поверхности объекта. В Three.js карты окружения позволяют добиться реалистичного отражающего эффекта без необходимости рендерить всю сцену для каждого отражающего объекта. Наиболее часто применяются кубические карты (CubeTexture) и сферические карты (EquirectangularTexture).
Типы карт окружения:
PMREMGenerator для корректного отображения
отражений.import * as THREE from 'three';
// Загрузка шести текстур для граней куба
const loader = new THREE.CubeTextureLoader();
const envMap = loader.load([
'px.jpg', 'nx.jpg',
'py.jpg', 'ny.jpg',
'pz.jpg', 'nz.jpg'
]);
scene.background = envMap; // Используется как фон сцены
Особенности:
В Three.js большинство материалов поддерживают свойство
envMap. Наиболее заметный эффект проявляется на материалах
с высокой отражательной способностью:
const material = new THREE.MeshStandardMaterial({
color: 0xffffff,
metalness: 1,
roughness: 0,
envMap: envMap
});
const sphere = new THREE.Mesh(
new THREE.SphereGeometry(1, 64, 64),
material
);
scene.add(sphere);
Пояснение параметров:
Для физически корректного рендеринга (PBR) необходимо преобразовать
исходную карту окружения с помощью PMREMGenerator:
const pmremGenerator = new THREE.PMREMGenerator(renderer);
pmremGenerator.compileEquirectangularShader();
const envMapTexture = pmremGenerator.fromEquirectangular(texture).texture;
material.envMap = envMapTexture;
texture.dispose();
pmremGenerator.dispose();
Ключевые моменты:
PMREMGenerator создаёт предвычисленные радиационные
карты (Pre-Filtered Mipmapped Radiance Environment Map), что
обеспечивает плавные и реалистичные отражения при изменении угла
взгляда.PMREMGenerator исходная текстура может
быть удалена, чтобы сэкономить память.Для материалов с прозрачностью можно сочетать envMap с
opacity и transparent:
const glassMaterial = new THREE.MeshPhysicalMaterial({
color: 0xffffff,
metalness: 0,
roughness: 0,
transmission: 1, // Полностью прозрачное стекло
envMap: envMap,
transparent: true
});
Примечания:
transmission обеспечивает преломление света
внутри прозрачных объектов.roughness и
clearcoat для реалистичного блика.material.envMapIntensity = 1.5; // Усиление отражений
rotation
CubeTexture для симуляции движения солнца или изменения окружения.Для создания отражений движущихся объектов можно использовать WebGLRenderTarget с камерой, которая рендерит сцену с позиции объекта:
const cubeRenderTarget = new THREE.WebGLCubeRenderTarget(256);
const cubeCamera = new THREE.CubeCamera(0.1, 1000, cubeRenderTarget);
sphere.material.envMap = cubeRenderTarget.texture;
function animate() {
cubeCamera.update(renderer, scene); // Обновление карты окружения
renderer.render(scene, camera);
}
Преимущества:
PMREMGenerator только один раз для
статических карт окружения.WebGLCubeRenderTarget и частоту обновления.metalness = 1 и roughness в диапазоне
0–0.2.MeshPhysicalMaterial с transmission и
envMap.Использование карт окружения в Three.js позволяет создавать визуально сложные сцены с реалистичными отражениями без дорогостоящего рендеринга каждой детали, сочетая производительность и визуальное качество.