A-Frame — это фреймворк на базе WebVR, построенный поверх HTML и JavaScript, позволяющий создавать 3D-сцены с использованием декларативного подхода. В сочетании с Svelte, который компилирует компоненты в оптимизированный JavaScript, появляется возможность создавать интерактивные VR/AR-приложения с высокой производительностью и чистым кодом.
В Svelte компоненты управляют состоянием и реактивностью через
переменные и реактивные выражения. A-Frame сцены при этом могут быть
внедрены как часть DOM-компонента, а отдельные сущности
(<a-entity>, <a-box>,
<a-sphere> и т.д.) становятся реактивными благодаря
биндингу данных Svelte.
<script>
import { onMount } from 'svelte';
let boxColor = 'red';
</script>
<a-scene>
<a-box position="0 1 -3" color={boxColor}></a-box>
<a-sky color="#ECECEC"></a-sky>
</a-scene>
<button on:click={() => boxColor = boxColor === 'red' ? 'blue' : 'red'}>
Изменить цвет куба
</button>
В этом примере переменная boxColor управляет цветом
объекта в 3D-сцене. Реактивность Svelte обеспечивает мгновенное
обновление цвета при изменении переменной.
A-Frame поддерживает создание пользовательских компонентов, которые
расширяют функциональность сущностей. В Svelte это делается с
использованием метода AFRAME.registerComponent, который
можно вызывать внутри блока onMount для гарантии наличия
DOM перед регистрацией.
<script>
import { onMount } from 'svelte';
onMount(() => {
AFRAME.registerComponent('spin', {
schema: { speed: { type: 'number', default: 1 } },
tick: function (time, timeDelta) {
this.el.object3D.rotation.y += this.data.speed * timeDelta / 1000;
}
});
});
</script>
<a-scene>
<a-box position="0 1 -5" spin="speed: 2" color="green"></a-box>
</a-scene>
Компонент spin обеспечивает вращение объекта с заданной
скоростью. Использование Svelte позволяет динамически менять свойства
компонента через реактивные переменные, например speed.
Интерактивность VR-сцены усиливается с помощью реактивных выражений Svelte. Любое свойство сущности A-Frame можно связать с переменной, что позволяет создавать сложные анимации и изменения состояния без прямого обращения к DOM.
<script>
let posX = 0;
function moveRight() {
posX += 0.1;
}
</script>
<a-scene>
<a-sphere position="{posX} 1 -3" radius="1.25" color="purple"></a-sphere>
</a-scene>
<button on:click={moveRight}>Вправо</button>
Здесь позиция сферы плавно изменяется при каждом нажатии кнопки. Можно масштабировать этот подход до множественных сущностей и сложных взаимодействий с событиями.
A-Frame предоставляет богатый набор событий (click,
mouseenter, mouseleave и т.д.), которые можно
обрабатывать напрямую в Svelte с помощью директив
on:event.
<script>
let message = "Наведите на куб";
function handleHover() {
message = "Куб активен!";
}
function handleLeave() {
message = "Наведите на куб";
}
</script>
<a-scene>
<a-box position="0 1 -3" color="orange"
on:mouseenter={handleHover}
on:mouseleave={handleLeave}></a-box>
</a-scene>
<p>{message}</p>
Реактивность позволяет мгновенно отображать состояние взаимодействия, интегрируя VR-объекты с интерфейсом страницы.
A-Frame поддерживает анимацию через компонент
<a-animation> и свойство animation. В
Svelte можно управлять параметрами анимации динамически.
<script>
let rotation = 0;
function rotateCube() {
rotation += 45;
}
</script>
<a-scene>
<a-box position="0 1 -3" color="yellow"
rotation="0 {rotation} 0"
animation="property: rotation; to: 0 360 0; loop: true; dur: 2000">
</a-box>
</a-scene>
<button on:click={rotateCube}>Повернуть куб</button>
Изменение переменной rotation через Svelte обновляет
сцену, а встроенные анимации обеспечивают плавное движение.
При работе с A-Frame в Svelte важно минимизировать прямые манипуляции с DOM. Использование реактивных переменных и компонентов позволяет:
document.querySelector и
setAttribute.Для крупных сцен рекомендуется разбивать объекты на отдельные Svelte-компоненты, каждый из которых управляет своей сущностью, что облегчает масштабирование и поддержку кода.
Svelte позволяет легко интегрировать сторонние компоненты A-Frame,
например aframe-extras или
aframe-particle-system-component. Подключение
осуществляется через импорт JS или <script> в
index.html. Динамическое создание сущностей и установка их
свойств может выполняться через реактивные блоки Svelte.
<script>
import 'aframe-particle-system-component';
</script>
<a-scene>
<a-entity particle-system="preset: snow; particleCount: 5000"></a-entity>
</a-scene>
Такой подход позволяет сочетать мощные возможности A-Frame с реактивным и декларативным стилем Svelte, создавая современные интерактивные 3D-приложения.