CubeMap — это текстура, которая состоит из шести изображений, расположенных по шести граням куба. Такая текстура используется для создания реалистичных отражений и окружения сцены, в том числе для скайбоксов, которые имитируют небо, горизонты и дальний фон.
В Three.js CubeMap создаётся с помощью объекта THREE.CubeTexture. Каждое изображение соответствует одной из сторон куба: положительной и отрицательной оси X, Y, Z.
const loader = new THREE.CubeTextureLoader();
const textureCube = loader.load([
'px.jpg', // +X
'nx.jpg', // -X
'py.jpg', // +Y
'ny.jpg', // -Y
'pz.jpg', // +Z
'nz.jpg' // -Z
]);
scene.background = textureCube;
Ключевые моменты:
material.envMap.Скайбокс — это визуальный приём, когда на внутренние грани большого куба проецируются изображения, создавая иллюзию окружающего мира. В Three.js существует два основных подхода:
Через сцену и background: Используется
scene.background = textureCube. В этом случае CubeMap
автоматически растягивается на фон сцены, экономя ресурсы, так как не
требуется отдельная геометрия.
Через геометрию куба: Создаётся большой куб с
материалом THREE.ShaderMaterial или
THREE.MeshBasicMaterial с параметром
side: THREE.BackSide. Этот метод позволяет дополнительно
применять эффекты на скайбокс, например анимацию или смешивание
текстур.
const geometry = new THREE.BoxGeometry(1000, 1000, 1000);
const material = new THREE.MeshBasicMaterial({
envMap: textureCube,
side: THREE.BackSide
});
const skybox = new THREE.Mesh(geometry, material);
scene.add(skybox);
Особенности метода с геометрией:
BackSide), чтобы
текстура была видна изнутри.CubeMap можно применять как источник для отражений на
материалах объектов. В Three.js это делается через
material.envMap. Например:
const reflectiveMaterial = new THREE.MeshStandardMaterial({
color: 0xffffff,
metalness: 1,
roughness: 0,
envMap: textureCube
});
const sphere = new THREE.Mesh(new THREE.SphereGeometry(5, 32, 32), reflectiveMaterial);
scene.add(sphere);
Ключевые моменты:
metalness и roughness управляют
интенсивностью и чёткостью отражения.const pmremGenerator = new THREE.PMREMGenerator(renderer);
const envMap = pmremGenerator.fromCubemap(textureCube).texture;
reflectiveMaterial.envMap = envMap;
Three.js позволяет создавать динамические CubeMap, например, для смены времени суток или эффекта движения облаков:
envMap или фон.const cubeCamera = new THREE.CubeCamera(1, 1000, 256);
scene.add(cubeCamera);
cubeCamera.update(renderer, scene);
scene.background = cubeCamera.renderTarget.texture;
Преимущества динамического CubeMap:
THREE.LinearFilter или
THREE.LinearMipmapLinearFilter для плавного отображения без
пикселизации.RGBELoader и
PMREMGenerator.CubeMap и скайбоксы в Three.js обеспечивают визуальную глубину сцены и реалистичные отражения. Правильная организация текстур, фильтрация и возможность динамического обновления позволяют создавать сложные 3D-сцены с минимальной нагрузкой на производительность.