Добавление и удаление тел в реальном времени

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


Создание тел в процессе работы симуляции

Для создания нового тела используется конструктор OIMO.Body с последующим добавлением его в мир через world.addBody(body). Основные параметры тела включают форму, массу, позицию и ориентацию.

let box = new OIMO.Body({
    type: 'box',
    size: [1, 1, 1],
    pos: [0, 5, 0],
    move: true,
    density: 1
});
world.addBody(box);
  • type — определяет форму тела (box, sphere, cylinder, plane).
  • size — размеры тела. Для сферы достаточно одного значения диаметра.
  • pos — начальная позиция в мировых координатах.
  • move — указывает, подвижное тело или статическое.
  • density — плотность, влияющая на массу и реакции тела на силы.

Созданные тела сразу участвуют в расчётах столкновений и интеграции движений. Можно создавать их в любом месте кода, например, при наступлении определённых событий.


Удаление тел из мира

Удаление тела осуществляется методом world.removeBody(body). Это освобождает ресурсы и исключает объект из расчётов физики.

world.removeBody(box);

При удалении тела необходимо учитывать:

  1. Если тело активно взаимодействует с другими объектами, его удаление может вызвать резкое изменение динамики сцены.
  2. Ссылки на удалённое тело в коде должны быть очищены, иначе возможны ошибки доступа к объекту.
  3. Если тело участвует в коллбэках или событиях столкновений, нужно предварительно отписаться от этих обработчиков.

Динамическое управление массивами тел

Часто возникает необходимость управлять группами объектов: добавлять и удалять их пакетами. Для этого можно использовать массивы и циклы:

let boxes = [];

for (let i = 0; i < 10; i++) {
    let box = new OIMO.Body({
        type: 'box',
        size: [1, 1, 1],
        pos: [i, 5, 0],
        move: true,
        density: 1
    });
    world.addBody(box);
    boxes.push(box);
}

// Удаление всех созданных объектов
for (let i = 0; i < boxes.length; i++) {
    world.removeBody(boxes[i]);
}
boxes = [];

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


Оптимизация добавления и удаления

Частое создание и уничтожение тел может быть ресурсозатратным. Для оптимизации используют:

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

Пример простого пула объектов:

let pool = [];
for (let i = 0; i < 20; i++) {
    let box = new OIMO.Body({ type: 'box', size: [1,1,1], pos: [0,-100,0], move: false, density: 1 });
    world.addBody(box);
    pool.push(box);
}

// Активация объекта из пула
function spawnBox(x, y, z) {
    for (let i = 0; i < pool.length; i++) {
        if (!pool[i].move) {
            pool[i].move = true;
            pool[i].position.set(x, y, z);
            break;
        }
    }
}

Влияние на производительность

Добавление и удаление тел в реальном времени напрямую влияет на производительность симуляции:

  • Количество активных тел определяет сложность расчёта столкновений.
  • Частое удаление и создание генерирует нагрузку на сборщик мусора JavaScript.
  • Оптимальный подход — комбинировать пул объектов с активной деактивацией неиспользуемых тел.

Практические сценарии применения

  • Динамическая генерация препятствий — в играх или симуляциях физики платформ можно создавать объекты по мере движения камеры.
  • Эффекты разрушения — отдельные фрагменты объекта создаются и удаляются по мере разрушения.
  • Интерактивные объекты — например, подбрасываемые игроком предметы, которые исчезают при падении за пределы сцены.

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