Масштабирование: компонент scale

В A-Frame масштабирование объектов осуществляется через компонент scale. Этот компонент определяет размеры объекта вдоль трёх осей: X, Y и Z. Масштаб влияет не только на визуальное представление объекта, но и на взаимодействие с ним, включая коллизии и положение дочерних элементов в иерархии сцены.


Формат значения

Компонент scale принимает объект в формате вектора или строку с тремя числами:

<a-box position="0 1 -3" scale="1 2 1" color="#4CC3D9"></a-box>
  • X — ширина объекта
  • Y — высота объекта
  • Z — глубина объекта

Можно использовать запись через объект Jav * aScript:

document.querySelector('a-box').setAttribute('scale', {x: 1, y: 2, z: 1});

Пропорциональное масштабирование

Для равномерного изменения размера объекта по всем осям достаточно использовать одно значение для каждой координаты:

<a-sphere radius="1.25" scale="2 2 2" color="#EF2D5E"></a-sphere>

При этом объект увеличится в два раза по всем направлениям относительно исходного размера.

Использование единичного масштаба (1 1 1) означает исходные размеры объекта, меньше 1 уменьшает объект, больше 1 — увеличивает.


Динамическое изменение масштаба

Компонент scale можно изменять во время выполнения с помощью JavaScript. Это позволяет создавать анимации роста или уменьшения объектов:

const box = document.querySelector('a-box');
box.addEventListener('click', () => {
  box.setAttribute('scale', {x: 1.5, y: 1.5, z: 1.5});
});

Также можно использовать компонент анимации animation для плавного изменения масштаба:

<a-box color="#4CC3D9" position="0 1 -3" scale="1 1 1"
       animation="property: scale; to: 2 2 2; dur: 1000; easing: easeInOutQuad">
</a-box>
  • property: scale — объект, который будет анимироваться
  • to: 2 2 2 — конечный масштаб
  • dur: 1000 — длительность анимации в миллисекундах
  • easing — функция плавности

Масштабирование дочерних объектов

Если объект является родителем других элементов, их размер масштабируется пропорционально родительскому. Например:

<a-entity scale="2 2 2">
  <a-box position="0 0 0" color="red"></a-box>
  <a-sphere position="1 1 0" color="blue"></a-sphere>
</a-entity>

В этом случае и a-box, и a-sphere будут отображаться в два раза больше исходного размера, несмотря на их локальные scale.


Комбинация с другими трансформациями

Масштабирование работает совместно с позиционированием (position) и вращением (rotation). Порядок применения трансформаций следующий:

  1. Масштабирование
  2. Вращение
  3. Позиция

Это важно учитывать при создании сложных сцен, где объект нужно масштабировать относительно определённой оси или центра.


Ограничения и особенности

  • Масштаб не может быть отрицательным, иначе объект инвертируется (отражается).
  • Очень малые значения (< 0.01) могут привести к визуальным артефактам из-за округления координат в рендеринге.
  • Масштабирование влияет на физические компоненты, такие как collision и dynamic-body (если используется ammo.js или cannon.js).

Масштабирование и анимация событий

С помощью animation__ можно создавать несколько анимаций одновременно, включая масштаб:

<a-box color="#7BC8A4" position="0 1 -5" scale="1 1 1"
       animation__scale="property: scale; to: 2 2 2; dur: 1000; loop: true; dir: alternate"
       animation__rotation="property: rotation; to: 0 360 0; dur: 2000; loop: true">
</a-box>
  • animation__scale — анимация масштаба
  • animation__rotation — анимация вращения
  • loop: true и dir: alternate создают циклическую анимацию увеличения и уменьшения объекта

Практическое применение

  • Создание интерактивных объектов, которые реагируют на действия пользователя.
  • Настройка масштаба элементов интерфейса VR, таких как панели и кнопки.
  • Реализация эффектов появления и исчезновения с плавным увеличением/уменьшением.
  • Масштабирование моделей при импорте из внешних форматов (.glTF, .obj) для корректного отображения в сцене.

Использование компонента scale является ключевым элементом при работе с 3D-объектами в A-Frame. Его возможности позволяют гибко управлять размером объектов, создавать анимации, и обеспечивать согласованность визуального представления в сложных сценах.