Библиотека Ammo.js предоставляет мощный инструмент для работы с физическими симуляциями в браузере на базе движка Bullet Physics. Одной из ключевых возможностей для сложных проектов является использование btSerializer — механизма сохранения и загрузки состояния физического мира. Это позволяет сохранять сцену, пересоздавать объекты и восстанавливать их состояние без повторного вычисления начальных условий.
btSerializer работает с внутренним форматом Bullet Physics, поддерживая сохранение:
Файл, созданный btSerializer, можно рассматривать как «снимок» текущей физической сцены, который может быть сериализован в массив байт или строку для последующей загрузки.
Для сериализации требуется экземпляр btDefaultSerializer:
const serializer = new Ammo.btDefaultSerializer();
Этот объект накапливает данные о физическом мире при вызове метода serialize. Важный момент: перед сериализацией необходимо добавить все объекты в мир и убедиться, что динамический шаг симуляции уже выполнен, если нужно зафиксировать текущее состояние скоростей и позиций.
Сохранение состояния мира осуществляется через
serialize объекта
btDiscreteDynamicsWorld:
const world = new Ammo.btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
// заполнение мира rigid bodies и collision shapes
world.serialize(serializer);
После этого сериализатор содержит бинарное представление мира. Для дальнейшего использования данные можно получить через:
const bufferPointer = serializer.getBufferPointer();
const bufferSize = serializer.getCurrentBufferSize();
const arrayBuffer = new Uint8Array(bufferPointer, bufferSize);
Эти данные можно сохранять в IndexedDB, LocalStorage, или отправлять на сервер для долговременного хранения.
Для восстановления физического мира из сериализованных данных используется btDefaultSerializer вместе с функцией десериализации:
const arrayBuffer = /* данные из сохранения */;
const data = Ammo._malloc(arrayBuffer.length);
Ammo.HEAPU8.set(arrayBuffer, data);
const world = new Ammo.btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
const serializer = new Ammo.btDefaultSerializer();
serializer.setBufferPointer(data, arrayBuffer.length);
Ammo.deserializeBullet(serializer, world);
В результате восстанавливаются все rigid bodies, collision shapes и constraints, а также их позиции и скорости. Это позволяет мгновенно возобновить симуляцию с точностью до миллисекунды.
collisionConfiguration,
dispatcher и solver, иначе восстановление
будет некорректным.В игровых проектах btSerializer используется для:
Прямое использование бинарных данных позволяет минимизировать трафик и ускоряет загрузку сложных сцен по сравнению с динамическим созданием объектов через API Ammo.js.
Использование btSerializer в связке с этими объектами позволяет полностью повторить состояние сложной физической симуляции без потери данных о движении или столкновениях.
Функции сериализации и десериализации в Ammo.js через btSerializer создают надежный и гибкий механизм для управления физическим миром, позволяя хранить, переносить и восстанавливать сцены любой сложности, от отдельных объектов до полных динамических сцен с сотнями тел и constraints.