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);
При удалении тела необходимо учитывать:
Часто возникает необходимость управлять группами объектов: добавлять и удалять их пакетами. Для этого можно использовать массивы и циклы:
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 = [];
Такой подход упрощает управление большим количеством объектов и позволяет создавать сложные динамические сцены без потери контроля над физикой.
Частое создание и уничтожение тел может быть ресурсозатратным. Для оптимизации используют:
move: false и оно перемещается за пределы видимой сцены,
сохраняя ресурс для последующего использования.Пример простого пула объектов:
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;
}
}
}
Добавление и удаление тел в реальном времени напрямую влияет на производительность симуляции:
Использование механизмов динамического добавления и удаления тел позволяет создавать более живые, интерактивные и оптимизированные физические сцены, полностью используя возможности Oimo.js.