Событие Body: collide, sleep, wakeup

В библиотеке Cannon.js каждый объект физического мира представлен классом Body. Эти объекты обладают собственной физической динамикой: положением, скоростью, массой и инерцией. Для эффективного управления взаимодействиями и состояниями тел используются события, которые позволяют отслеживать столкновения, переход в покой и пробуждение объектов.


Событие collide

Событие collide возникает каждый раз, когда тело сталкивается с другим объектом в мире. Оно позволяет реагировать на физические контакты и вычислять силы удара, угол столкновения и другие параметры взаимодействия.

bodyA.addEventListener("collide", function(event) {
    const bodyB = event.body; // тело, с которым произошло столкновение
    const contact = event.contact; // объект ContactEquation
    console.log("Столкновение с телом:", bodyB.id);
    console.log("Точка контакта:", contact.rj);
    console.log("Нормаль контакта:", contact.ni);
});

Основные свойства события collide:

  • body — второе тело, участвующее в столкновении.
  • contact — объект ContactEquation, содержащий информацию о точке контакта, нормали и импульсе.
  • target — тело, на котором зарегистрирован слушатель (обычно это bodyA в примере выше).

collide полезно использовать для:

  • запуска эффектов при ударе (звук, частицы);
  • вычисления повреждений или очков при взаимодействиях;
  • анализа поведения тел в симуляциях.

Событие sleep

Cannon.js реализует пассивное управление телами, позволяя отключать их динамику при достижении состояния покоя для повышения производительности. Когда тело прекращает движение и его скорость становится меньше определенного порога, оно входит в состояние сна. Это событие фиксируется через sleep.

body.addEventListener("sleep", function(event) {
    console.log("Тело ушло в сон:", body.id);
});

Ключевые моменты:

  • Тело должно иметь включенный механизм сна: body.allowSleep = true.
  • Порог скорости, при котором тело может уснуть, задается через body.sleepSpeedLimit.
  • Время, через которое тело засыпает после достижения порога скорости, задается body.sleepTimeLimit.

Событие sleep позволяет:

  • оптимизировать производительность, исключая вычисления для неподвижных объектов;
  • менять визуальные эффекты для спящих тел (например, затемнение или уменьшение анимации);
  • запускать игровую логику, реагирующую на прекращение движения объекта.

Событие wakeup

Когда тело, находящееся в состоянии сна, получает внешнее воздействие (удар, сила, столкновение), оно “пробуждается”. Событие wakeup уведомляет об этом изменение состояния.

body.addEventListener("wakeup", function(event) {
    console.log("Тело пробуждено:", body.id);
});

Особенности работы wakeup:

  • Пробуждение может происходить при прикладывании силы (body.applyForce), при столкновении с другим телом или при прямом изменении скорости.

  • После пробуждения тело вновь участвует в полной динамике симуляции.

  • Событие wakeup можно использовать для:

    • активации анимаций или эффектов движения;
    • запуска логики игрового взаимодействия после длительного покоя;
    • синхронизации с внешними системами, которые зависят от активности тела.

Настройка событий и производительность

Для всех типов событий рекомендуется:

  1. Регистрация только необходимых слушателей. Избыточные обработчики collide или wakeup на большом количестве тел могут снизить производительность.
  2. Использование once для одноразовых действий. Если интересует только первое столкновение или первое пробуждение.
  3. Фильтрация столкновений. Проверка свойств event.body позволяет реагировать только на определенные типы объектов.
body.addEventListener("collide", function(event) {
    if (event.body.type === Body.STATIC) {
        console.log("Столкновение с неподвижным объектом");
    }
});

Практические советы

  • Для симуляций с множеством объектов важно комбинировать sleep и wakeup с отключением расчета столкновений для спящих тел.
  • collide часто используется совместно с ContactMaterial для контроля коэффициентов трения и упругости при столкновениях.
  • Можно программно инициировать wakeup, если требуется включить динамику тел без внешних воздействий:
body.wakeUp();

События collide, sleep и wakeup являются фундаментальными инструментами Cannon.js для контроля физического поведения объектов, оптимизации симуляции и интеграции логики взаимодействия тел с игровой или визуальной системой. Они позволяют создавать реалистичные и отзывчивые физические миры, управляя состояниями объектов в динамическом времени.