Компонент dynamic-body является частью интеграции
физического движка Cannon.js с A-Frame и позволяет
создавать объекты с динамическим поведением в 3D-сцене. Он отвечает за
физическое моделирование: силы, столкновения, гравитацию и инерцию.
dynamic-body делает объект подвижным и
подверженным физическим законам. В отличие от статических тел
(static-body), динамическое тело:
Каждое динамическое тело имеет массу, форму коллайдера и физические свойства поверхности (трение, упругость). Эти параметры влияют на поведение объекта в сцене.
Чтобы использовать dynamic-body, необходимо подключить
компонент aframe-physics-system:
<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>
Простейший пример:
<a-scene physics="gravity: -9.8">
<a-box position="0 5 -5" dynamic-body color="red" width="1" height="1" depth="1"></a-box>
<a-plane static-body rotation="-90 0 0" width="10" height="10" color="gray"></a-plane>
</a-scene>
В этом примере куб с компонентом dynamic-body падает под
действием гравитации и сталкивается с плоскостью.
Компонент dynamic-body поддерживает ряд параметров для
точного управления физикой:
1.box,
sphere, cylinder, cone,
plane, trimesh, compound.Пример с расширенными настройками:
<a-sphere position="0 10 -5" radius="1" color="blue"
dynamic-body="mass: 2; shape: sphere; linearDamping: 0.1; angularDamping: 0.2">
</a-sphere>
Выбор формы влияет на точность столкновений и производительность:
dynamic-body поддерживает столкновения и реакции
на силу. Для обработки событий используются стандартные события
A-Frame:
collide — возникает при столкновении с другим
телом.collidestart — начало контакта.collideend — конец контакта.Пример прослушивания события:
AFRAME.registerComponent('collision-listener', {
init: function () {
this.el.addEventListener('collide', function (e) {
console.log('Столкновение с:', e.detail.body.el);
});
}
});
<a-box position="0 5 -5" dynamic-body collision-listener></a-box>
Динамическое тело можно программно перемещать с
помощью методов Cannon.js через компонент dynamic-body:
applyForce(forceVec3, worldPoint) — применение
силы.applyImpulse(impulseVec3, worldPoint) — мгновенный
импульс.applyLocalForce(forceVec3, localPoint) — сила
относительно локальной системы координат.applyLocalImpulse(impulseVec3, localPoint) — импульс
относительно локальной системы.Пример импульса при клике:
document.querySelector('a-box').addEventListener('click', function () {
const body = this.body;
body.applyImpulse(new CANNON.Vec3(0, 5, 0), body.position);
});
Для сложных сцен важно учитывать производительность:
trimesh и
compound только там, где необходимо.linearDamping и
angularDamping для уменьшения дрожания при падении.allowSleep: true для объектов, которые могут
долго находиться в покое, чтобы экономить вычисления.static-body) или kinematic
(kinematic-body).static-body и kinematic-bodydynamic-body хорошо комбинируется с другими типами
тел:
Эта комбинация позволяет создавать полноценные физические сцены: падающие предметы, катящиеся шары, интерактивные платформы и симуляцию среды.
trimesh для всех объектов сильно
замедляет рендеринг.physics="true")
dynamic-body не работает.Эффективное использование dynamic-body требует понимания
как массы, силы и формы влияют на поведение объектов и
взаимодействие с другими телами в физической сцене.