В Oimo.js физический мир представлен объектом
OIMO.World. Создание мира начинается с вызова
конструктора:
const world = new OIMO.World({
timestep: 1/60,
iterations: 8,
broadphase: 2,
worldscale: 1,
random: true,
info: false
});
timestep — шаг интеграции в секундах.
Стандартное значение 1/60 соответствует 60 кадрам в секунду.iterations — число итераций для
расчета столкновений. Увеличение повышает точность, но снижает
производительность.broadphase — алгоритм обнаружения
потенциальных столкновений (0 — brute-force, 1 — sweep and prune, 2 —
grid).worldscale — масштабирование мира.
Позволяет работать с объектами разных размеров, корректируя числовые
значения сил и масс.random — использование случайного
распределения для инициализации внутренней структуры.info — вывод дополнительной информации
для отладки.После создания мира добавляются тела и соединения, которые управляют физикой объектов.
Очистка мира в Oimo.js необходима для корректного завершения симуляции или подготовки к новой сцене. Важно различать удаление тел и уничтожение самого мира.
Каждое тело хранится в массиве world.bodies. Чтобы
удалить все тела, выполняется итерация:
for (let i = world.bodies.length - 1; i >= 0; i--) {
world.removeRigidBody(world.bodies[i]);
}
Особенности:
removeRigidBody корректно удаляет тело и все связанные
с ним соединения (joints).for (let joint of world.joints) {
world.removeJoint(joint);
}
После удаления тел и соединений стоит вызвать внутренние методы
очистки, если они доступны, или создать новый объект мира. В стандартной
версии Oimo.js явного метода world.clear() нет, поэтому
практика обычно следующая:
world = new OIMO.World({
timestep: 1/60,
iterations: 8,
broadphase: 2
});
Создание нового мира гарантирует полное освобождение памяти, удаление всех тел, соединений и оптимизационных структур broadphase.
Прямое уничтожение мира подразумевает освобождение всех ресурсов и
прекращение симуляции. Oimo.js не предоставляет метод
destroy() для объектов World, но можно
выполнить следующие действия:
world.bodies.length = 0;
world.joints.length = 0;
world = null;
mesh,
userdata), их также следует удалить, чтобы избежать утечек
памяти.RigidBody предотвратит
сборку мусора.world.bodies и world.joints перед и после
очистки, чтобы убедиться в полном удалении всех элементов.world.removeJoint(joint).world.removeRigidBody(body).world = null.Этот подход гарантирует корректное завершение симуляции, предотвращает утечки памяти и обеспечивает стабильность работы Oimo.js в сложных проектах с множеством объектов.