Типы тел: DYNAMIC, STATIC, KINEMATIC

Библиотека Cannon.js предоставляет мощный физический движок для симуляции реального мира в 3D на JavaScript. Основой физического мира в Cannon.js являются тела (Body), которые представляют объекты с массой, формой, положением и другими физическими свойствами. Для управления поведением тел в симуляции используются типы тел, определяющие, как объект взаимодействует с силами и другими телами. В Cannon.js выделяются три ключевых типа: DYNAMIC, STATIC, KINEMATIC.


DYNAMIC (Динамическое тело)

DYNAMIC — это тело, полностью подчинённое законам физики. Оно реагирует на силы, столкновения и гравитацию.

Ключевые особенности:

  • Масса > 0: Тело имеет массу, что позволяет силам изменять его движение.
  • Влияние гравитации: Объект автоматически реагирует на гравитацию, если она включена в мире.
  • Столкновения: DYNAMIC-тела участвуют во всех столкновениях и могут отталкивать другие тела.
  • Сила и импульс: Можно применять силу (applyForce), импульс (applyImpulse) или задавать скорость напрямую (velocity).

Пример создания DYNAMIC-тела:

const body = new CANNON.Body({
    mass: 5, // Масса > 0 делает тело динамическим
    shape: new CANNON.Sphere(1), // Форма объекта: сфера радиусом 1
    position: new CANNON.Vec3(0, 10, 0) // Начальная позиция
});
world.addBody(body);

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

  • Моделирование падающих объектов, автомобилей, мячей.
  • Реалистичные столкновения и реакции на силы.

STATIC (Статическое тело)

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

Ключевые особенности:

  • Масса = 0: Тело не двигается под воздействием силы или столкновений.
  • Участие в столкновениях: Может сталкиваться с другими телами, влияя на их траекторию.
  • Скорость и импульс игнорируются: Любые попытки задать velocity или применять силу не изменят положение тела.

Пример создания STATIC-тела:

const ground = new CANNON.Body({
    mass: 0, // Масса 0 делает тело статическим
    shape: new CANNON.Plane(), // Плоскость для пола
    position: new CANNON.Vec3(0, 0, 0)
});
world.addBody(ground);

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

  • Полы, стены, препятствия, сцена, объекты, которые должны оставаться неподвижными.
  • Оптимизация производительности — STATIC-тела не требуют расчёта динамики.

KINEMATIC (Кинематическое тело)

KINEMATIC — это промежуточный тип тела. Оно не подчиняется силам и гравитации, но может перемещаться по заданной траектории, влияя на динамические объекты.

Ключевые особенности:

  • Масса = 0, но движение задаётся вручную: Тело не двигается под воздействием физики, но можно управлять его положением и скоростью напрямую.
  • Влияние на динамические объекты: При столкновении KINEMATIC-тело изменяет движение DYNAMIC-тел, но само не смещается.
  • Обновление позиции вручную: Для анимации требуется прямое изменение position или velocity.

Пример создания KINEMATIC-тела:

const movingPlatform = new CANNON.Body({
    mass: 0,
    type: CANNON.Body.KINEMATIC,
    shape: new CANNON.Box(new CANNON.Vec3(5, 0.5, 5)),
    position: new CANNON.Vec3(0, 2, 0)
});
world.addBody(movingPlatform);

// Перемещение платформы вручную
movingPlatform.position.x += 0.1; // Обновление координаты x

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

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

Сравнительная таблица типов тел

Тип тела Масса Реакция на силы Участие в столкновениях Перемещение
DYNAMIC > 0 Да Да Под физикой
STATIC 0 Нет Да Нет
KINEMATIC 0 Нет Да Задаётся вручную

Рекомендации по использованию типов

  • DYNAMIC: Для всех объектов, поведение которых должно полностью моделироваться физикой.
  • STATIC: Для неподвижных элементов сцены, оптимизация производительности.
  • KINEMATIC: Для объектов с программным управлением движением, которые должны влиять на динамические тела, но не подчиняться физике.

Использование правильного типа тела позволяет создавать реалистичные сцены с точным контролем над поведением объектов, снижает нагрузку на движок и упрощает взаимодействие объектов друг с другом.