A-Frame — это фреймворк для создания VR-приложений на основе веб-технологий, который позволяет работать с 3D-сценами через HTML-подобный синтаксис. Важной частью расширяемости A-Frame является возможность наследования от существующих примитивов для создания собственных, более сложных или специализированных объектов. Этот подход упрощает повторное использование кода и стандартизирует поведение компонентов сцены.
Примитивы в A-Frame — это специальные HTML-теги, которые представляют базовые 3D-объекты. Например:
<a-box> — куб с заданными размерами и
материалом.<a-sphere> — сфера с радиусом и
детализацией.<a-plane> — плоскость.<a-cylinder> — цилиндр.Каждый примитив является синтаксическим сахаром для сущностей с компонентами. Например:
<a-box color="red" depth="2" height="2" width="2"></a-box>
эквивалентно:
<a-entity geometry="primitive: box; width: 2; height: 2; depth: 2" material="color: red"></a-entity>
Эта абстракция позволяет использовать удобные теги и одновременно расширять их возможности через наследование.
Для создания нового примитива используется метод
AFRAME.registerPrimitive(). Он принимает два параметра:
Имя нового примитива — строка, начинающаяся с
a-.
Объект конфигурации, включающий:
defaultComponents — компоненты, которые будут
автоматически применяться.mappings — сопоставления атрибутов нового примитива с
параметрами компонентов.Пример создания примитива, наследующего
<a-box>:
AFRAME.registerPrimitive('a-glowing-box', {
defaultComponents: {
geometry: { primitive: 'box' },
material: { color: 'blue', emissive: '#00f', emissiveIntensity: 0.5 }
},
mappings: {
color: 'material.color',
glow: 'material.emissiveIntensity'
}
});
В этом примере:
a-glowing-box наследует базовую геометрию куба.color автоматически сопоставляется с
material.color.glow, контролирующий
интенсивность свечения материала.Использование примитива в HTML:
<a-glowing-box color="red" glow="1"></a-glowing-box>
Результат — красный куб с ярким свечением, без необходимости вручную прописывать каждый компонент.
Ключевой механизм наследования — mappings. Он позволяет переопределять или добавлять атрибуты:
mappings: {
size: 'geometry.width', // атрибут size будет управлять шириной
height: 'geometry.height',
depth: 'geometry.depth'
}
Так можно создавать удобные пользовательские интерфейсы для примитивов, объединяя несколько компонентов под один атрибут.
Помимо геометрии и материала, можно наследовать компоненты логики: анимацию, физику, взаимодействие с пользователем. Пример примитива с анимацией движения:
AFRAME.registerPrimitive('a-bouncing-box', {
defaultComponents: {
geometry: { primitive: 'box' },
material: { color: 'green' },
animation: { property: 'position', to: '0 2 0', dir: 'alternate', dur: 1000, loop: true }
},
mappings: {
color: 'material.color',
height: 'geometry.height'
}
});
Теперь <a-bouncing-box> автоматически получает
анимацию подпрыгивания, наследуя геометрию куба.
Наследуемый примитив позволяет не только добавлять новые атрибуты, но и переопределять существующие компоненты. Например:
AFRAME.registerPrimitive('a-custom-box', {
defaultComponents: {
geometry: { primitive: 'box', height: 3 }, // изменяем стандартную высоту
material: { color: 'orange' }
},
mappings: {
color: 'material.color'
}
});
Даже если <a-box> по умолчанию имеет высоту 1,
новый примитив автоматически наследует геометрию куба, но с изменённой
высотой.
AFRAME.registerPrimitive('a-my-primitive', {
defaultComponents: {
geometry: { primitive: 'box', width: 1, height: 1, depth: 1 },
material: { color: 'white', opacity: 0.8 },
myCustomComponent: { speed: 1 }
},
mappings: {
color: 'material.color',
speed: 'myCustomComponent.speed'
}
});
Такой подход обеспечивает модульность, повторное использование и гибкость при построении больших VR-сцен, сохраняя преимущества HTML-подобного синтаксиса A-Frame.