Cubemap-текстуры представляют собой набор из шести изображений, объединённых в куб, где каждая грань соответствует одной из сторон куба: передняя (front), задняя (back), левая (left), правая (right), верхняя (top), нижняя (bottom). В A-Frame такие текстуры применяются для создания реалистичных фонов, скайбоксов и отражающих поверхностей.
В A-Frame cubemap обычно задаётся через компонент sky
или с помощью материалов, поддерживающих отражения
(envMap). Основное преимущество cubemap — это возможность
создавать панорамные сцены с эффектом полного окружения
без искажений перспективы.
<a-scene>
<a-assets>
<img id="px" src="px.jpg">
<img id="nx" src="nx.jpg">
<img id="py" src="py.jpg">
<img id="ny" src="ny.jpg">
<img id="pz" src="pz.jpg">
<img id="nz" src="nz.jpg">
</a-assets>
<a-sky id="sky" cubemap="px: #px; nx: #nx; py: #py; ny: #ny; pz: #pz; nz: #nz"></a-sky>
</a-scene>
Ключевые моменты:
px, nx, py, ny, pz, nz).a-assets позволяет заранее загружать
текстуры, предотвращая мерцания при инициализации сцены.Cubemap-текстуры могут применяться не только для фона, но и для
материалов с отражением, например для создания
зеркальных или металлических поверхностей. Для этого используется
компонент material с параметром envMap.
<a-entity geometry="primitive: sphere; radius: 1.5"
material="color: white; metalness: 1; roughness: 0; envMap: #cubemap"></a-entity>
Особенности:
metalness: 1 и roughness: 0 делают
поверхность максимально отражающей.envMap принимает ссылку на заранее загруженную
cubemap-текстуру.sky, что обеспечивает консистентность освещения и
отражений.Для упрощения работы можно использовать атласные изображения, где все шесть граней объединены в одну текстуру. A-Frame позволяет разбивать такое изображение на отдельные стороны через custom shader или внешние утилиты, создавая cubemap динамически.
Пример генерации через Three.js, интегрируемый в A-Frame:
const loader = new THREE.TextureLoader();
const texture = loader.load('cubemap_atlas.jpg', () => {
const cubemap = new THREE.CubeTexture();
cubemap.images = splitAtlas(texture); // функция splitAtlas разбивает изображение на 6 граней
cubemap.needsUpdate = true;
scene.background = cubemap;
});
A-Frame и Three.js поддерживают HDR-карты и equirectangular-текстуры, которые можно конвертировать в cubemap:
new THREE.PMREMGenerator(renderer).fromEquirectangular(textureEquirectangular);
sky или
envMap.Cubemap может обновляться во время работы сцены, что позволяет создавать динамические отражения:
const newCubemap = new THREE.CubeTextureLoader().load([
'new_px.jpg', 'new_nx.jpg',
'new_py.jpg', 'new_ny.jpg',
'new_pz.jpg', 'new_nz.jpg'
]);
mesh.material.envMap = newCubemap;
mesh.material.needsUpdate = true;
needsUpdate = true, иначе изменения
не применятся.Cubemap-текстуры могут быть тяжёлыми, поэтому рекомендуется:
a-assets и
повторно использовать одну и ту же cubemap для нескольких объектов.Cubemap идеально подходит для VR-сцен в A-Frame:
a-sky обеспечивает 360-градусное
окружение, корректно реагируя на поворот головы.Cubemap остаётся ключевым инструментом для реалистичных 3D-сцен, обеспечивая как визуальные эффекты окружения, так и точные отражения на объектах.