Компонент static-body

Компонент static-body является частью системы физики в A-Frame и используется для создания объектов, которые взаимодействуют с физическим миром, но не подвержены динамическим силам, таким как гравитация или столкновения с другими телами в плане движения. Он часто применяется для построения земли, стен, платформ и любых неподвижных препятствий.

Компонент интегрируется с физическими движками, такими как Cannon.js или Ammo.js, через библиотеку aframe-physics-system. При применении static-body к сущности она становится частью физического мира, но не реагирует на силы: она только влияет на динамические тела, сталкиваясь с ними.


Синтаксис и подключение

Подключение static-body происходит через атрибут сущности:

<a-entity static-body></a-entity>

Простое использование:

<a-box position="0 0.5 -3" rotation="0 45 0" color="#4CC3D9" static-body></a-box>
  • position и rotation задают расположение и ориентацию объекта.
  • color — визуальное оформление.
  • static-body превращает объект в неподвижное физическое тело.

Если физическая система не подключена, компонент работать не будет. Подключение физической системы:

<script src="https://cdn.jsdelivr.net/npm/aframe@1.4.2/dist/aframe.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/aframe-physics-system@4.0.1/dist/aframe-physics-system.min.js"></script>

Ключевые свойства компонента

static-body поддерживает ряд параметров, позволяющих настроить физическое взаимодействие:

  • shape — определяет форму физического тела. Возможные значения:

    • box — прямоугольный параллелепипед (по умолчанию для <a-box>).
    • sphere — сфера (по умолчанию для <a-sphere>).
    • cylinder — цилиндр (по умолчанию для <a-cylinder>).
    • mesh — сложная форма, использующая геометрию меша.
  • mass — вес тела. Для static-body всегда 0.

  • collisionFilterGroup и collisionFilterMask — управляют группами столкновений.

  • interval — интервал обновления столкновений, может оптимизировать производительность для больших сцен.

Пример использования с параметром shape:

<a-sphere position="0 1 -5" radius="1.25" color="#EF2D5E" static-body="shape: sphere"></a-sphere>

Взаимодействие с динамическими объектами

Объекты с static-body не двигаются сами, но оказывают влияние на динамические тела (dynamic-body). Например, мяч, падающий на платформу с static-body, отскочит и изменит траекторию, но платформа останется неподвижной.

Пример сцены:

<a-scene physics="gravity: -9.8">
  <a-plane position="0 0 -5" rotation="-90 0 0" width="10" height="10" color="#7BC8A4" static-body></a-plane>
  <a-box position="0 2 -5" depth="1" height="1" width="1" color="#4CC3D9" dynamic-body></a-box>
</a-scene>

В данном примере <a-plane> является статическим телом, удерживающим падающий <a-box>.


Использование mesh для сложной геометрии

Иногда нужно, чтобы физическое тело точно соответствовало форме визуального объекта. Для этого используется shape: mesh:

<a-entity gltf-model="#treeModel" static-body="shape: mesh"></a-entity>

Особенности:

  • Производительность при сложных мешах снижается.
  • Для оптимизации рекомендуется разбивать сложные меши на несколько простых box, sphere или cylinder.

Оптимизация и производительность

  1. Использование простых формbox, sphere, cylinder потребляют меньше ресурсов.
  2. Разделение сложных объектов — вместо одного сложного меша использовать несколько статических тел.
  3. Отключение ненужных коллизий через collisionFilterMask.
  4. Интервал обновления столкновений — уменьшение частоты расчёта улучшает FPS:
<a-box static-body="interval: 200"></a-box>

Особенности поведения

  • static-body не реагирует на силы и гравитацию.
  • Влияние на динамические тела происходит только через столкновения.
  • Повороты объекта после создания не всегда корректно обновляют физическую форму; рекомендуется задавать rotation при инициализации.

Интеграция с анимациями и событиями

Статические тела могут быть частью интерактивной сцены:

<a-box position="0 0.5 -3" color="#FFC65D" static-body
       animation="property: rotation; to: 0 360 0; loop: true; dur: 5000"></a-box>

Хотя объект вращается визуально, его физическая форма остаётся статичной и не влияет на динамику других тел в процессе анимации, если вращение не сопровождается обновлением физического состояния через body.sync().


Частые ошибки

  1. Забыт подключить aframe-physics-system.
  2. Использование dynamic-body вместо static-body для неподвижных объектов.
  3. Сложные меши без оптимизации вызывают падение производительности.
  4. Попытка изменить позицию статического тела в процессе сцены без синхронизации с физическим движком — объект останется на старом месте в физике.

Компонент static-body является фундаментальным элементом при построении реалистичных сцен с физикой. Он обеспечивает стабильность и контроль над объектами, которые должны оставаться неподвижными, но участвовать в коллизиях, создавая основу для динамических взаимодействий.