CubeTexture — это специализированный тип текстуры в Three.js, используемый для создания окружающей среды (environment mapping) и эффектов отражений и преломлений. В отличие от обычных 2D-текстур, CubeTexture содержит шесть изображений, соответствующих шести граням куба: передняя (positiveZ), задняя (negativeZ), левая (negativeX), правая (positiveX), верхняя (positiveY), нижняя (negativeY). Такая организация позволяет симулировать полное окружение сцены вокруг объекта.
CubeTexture создается с помощью конструктора
THREE.CubeTexture и массива текстур:
const loader = new THREE.TextureLoader();
const images = [
loader.load('px.jpg'), // правая грань
loader.load('nx.jpg'), // левая грань
loader.load('py.jpg'), // верхняя грань
loader.load('ny.jpg'), // нижняя грань
loader.load('pz.jpg'), // передняя грань
loader.load('nz.jpg') // задняя грань
];
const cubeTexture = new THREE.CubeTexture(images);
cubeTexture.needsUpdate = true;
Особенности:
cubeTexture.needsUpdate = true необходим, чтобы
текстура обновилась и корректно отображалась в сцене.Для упрощения загрузки шести изображений одновременно используется
класс THREE.CubeTextureLoader. Он
автоматически сопоставляет изображения с гранями куба и поддерживает
асинхронную загрузку:
const loader = new THREE.CubeTextureLoader();
const cubeTexture = loader.load([
'px.jpg', // positive X
'nx.jpg', // negative X
'py.jpg', // positive Y
'ny.jpg', // negative Y
'pz.jpg', // positive Z
'nz.jpg' // negative Z
]);
Важные моменты:
Метод load() может принимать дополнительные
колбэки:
onLoad — вызывается после успешной загрузки всех шести
изображений.onProgress — отслеживает прогресс загрузки.onError — обрабатывает ошибки загрузки.Пример с колбэками:
const loader = new THREE.CubeTextureLoader();
loader.load(
[
'px.jpg','nx.jpg','py.jpg','ny.jpg','pz.jpg','nz.jpg'
],
function(texture) {
console.log('CubeTexture успешно загружен');
scene.background = texture;
},
function(xhr) {
console.log(`Загружено ${xhr.loaded / xhr.total * 100}%`);
},
function(err) {
console.error('Ошибка загрузки CubeTexture', err);
}
);
scene.background = cubeTexture;
Это создаёт эффект полной окружающей среды, заменяя обычный цвет фона.
envMap:const material = new THREE.MeshStandardMaterial({
color: 0xffffff,
metalness: 1,
roughness: 0,
envMap: cubeTexture
});
Особенности работы envMap:
metalness = 1)
отражения становятся полностью видимыми.roughness управляет размытием отражений: чем выше, тем
менее чёткие отражения.CubeTexture поддерживает стандартные настройки текстур:
cubeTexture.mapping = THREE.CubeReflectionMapping;
cubeTexture.minFilter = THREE.LinearFilter;
cubeTexture.magFilter = THREE.LinearFilter;
cubeTexture.format = THREE.RGBFormat;
THREE.CubeReflectionMapping для отражений или
THREE.CubeRefractionMapping для преломлений.CubeTextureLoader предотвращает
зависание интерфейса при больших изображениях.MeshStandardMaterial и
MeshPhysicalMaterial).Three.js поддерживает CubeTexture и для HDR изображений с
использованием RGBELoader:
new THREE.RGBELoader()
.setDataType(THREE.UnsignedByteType)
.load('env.hdr', function(texture) {
const pmremGenerator = new THREE.PMREMGenerator(renderer);
const envMap = pmremGenerator.fromEquirectangular(texture).texture;
scene.background = envMap;
scene.environment = envMap;
texture.dispose();
pmremGenerator.dispose();
});
scene.environment автоматически применяется к
PBR-материалам для отражений.CubeTexture можно обновлять динамически, меняя отдельные грани или полностью заменяя текстуру:
const loader = new THREE.CubeTextureLoader();
loader.load(['new_px.jpg','new_nx.jpg','new_py.jpg','new_ny.jpg','new_pz.jpg','new_nz.jpg'], function(newTexture){
scene.background = newTexture;
});
Это позволяет создавать смену времени суток, динамические эффекты отражений и имитацию окружения в реальном времени.
CubeTexture и CubeTextureLoader обеспечивают мощный инструмент для создания реалистичного окружения, отражений и освещения в Three.js, делая сцены визуально насыщенными и динамичными.