Классификация тел: динамические, статические, кинематические

В физическом движке Oimo.js объекты сцены классифицируются по типу тел, что определяет их поведение при взаимодействии с силами, столкновениями и другими объектами. Основное различие проводится по способу движения и взаимодействия с физическим миром.


Динамические тела (Dynamic Bodies)

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

Основные характеристики:

  • Масса: Динамическое тело имеет массу, которая учитывается при расчётах движения и столкновений. Масса может быть указана через свойство mass.
  • Силы и импульсы: К телу можно применять силы (applyForce) и импульсы (applyImpulse), что изменяет его скорость и направление движения.
  • Взаимодействие с другими объектами: При столкновении динамическое тело изменяет своё положение и может передавать импульс другим телам.
  • Примеры использования: Шары, ящики, персонажи в игре, любые объекты, которые должны двигаться естественным образом под действием гравитации.

Пример создания динамического тела:

let box = world.add({
    type: 'box',
    size: [1, 1, 1],
    pos: [0, 10, 0],
    move: true,  // тело динамическое
    mass: 2
});

Ключевой момент: свойство move: true делает тело динамическим, и движок автоматически применяет к нему физические законы.


Статические тела (Static Bodies)

Статические тела остаются неподвижными вне зависимости от сил и столкновений. Они создают «окружение» для динамических объектов.

Основные характеристики:

  • Не подвержены гравитации: Статическое тело не реагирует на гравитацию и внешние силы.
  • Взаимодействие с динамическими объектами: Динамические тела сталкиваются со статическими, но статические не изменяют своего положения.
  • Примеры использования: Пол, стены, платформы, стационарные препятствия.

Пример создания статического тела:

let ground = world.add({
    type: 'box',
    size: [50, 1, 50],
    pos: [0, 0, 0],
    move: false  // тело статическое
});

В Oimo.js статическое тело обозначается move: false. Оно идеально подходит для создания сцены, где динамические объекты могут взаимодействовать с окружающей средой.


Кинематические тела (Kinematic Bodies)

Кинематические тела занимают промежуточное положение между динамическими и статическими. Они могут двигаться по заданной траектории, но не подчиняются физическим силам, и при столкновениях не изменяют своего положения.

Основные характеристики:

  • Управление движением: Положение кинематического тела задаётся напрямую через методы установки позиции или скорости (setPosition, setLinearVelocity).
  • Взаимодействие с динамическими телами: Динамические объекты реагируют на столкновения с кинематическими телами, но сами кинематические тела не смещаются.
  • Примеры использования: Подвижные платформы, конвейеры, объекты с анимацией движения, которые должны воздействовать на динамику, но оставаться предсказуемыми.

Пример создания кинематического тела:

let movingPlatform = world.add({
    type: 'box',
    size: [5, 1, 5],
    pos: [0, 5, 0],
    move: true,
    noSleep: true, // обязательно для кинематики
    mass: 0       // масса игнорируется
});

// задаём движение платформы вручную
movingPlatform.setLinearVelocity({x: 1, y: 0, z: 0});

Особое внимание: кинематическое тело требует явного управления скоростью или положением. Если не обновлять их каждый кадр, объект останется на месте.


Отличия между типами тел

Характеристика Динамическое тело Статическое тело Кинематическое тело
Подвержено гравитации Да Нет Нет
Реакция на силы Да Нет Нет
Реакция на столкновения Да Нет Нет (только влияет на динамику)
Управление положением вручную Не требуется Не требуется Обязательно
Масса Да Нет Игнорируется

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

  1. Выбор типа тела зависит от задачи: движущиеся объекты, реагирующие на физику, делают динамическими. Постоянные элементы сцены — статическими. Объекты с заранее заданным движением — кинематическими.
  2. Комбинирование тел: Сцены с правильной классификацией тел работают быстрее, потому что движок не тратит ресурсы на расчёт силы и реакции для статических объектов.
  3. Использование кинематики: Кинематические тела удобны для платформеров или симуляций, где движение должно быть точным, но взаимодействие с динамикой необходимо.

Классификация тел в Oimo.js — ключевой инструмент для эффективного моделирования физики. Правильное понимание различий между динамическими, статическими и кинематическими телами позволяет строить реалистичные сцены с управляемой производительностью и предсказуемым поведением объектов.