Oimo.js — физический движок для моделирования твёрдых тел, написанный на JavaScript и ориентированный на использование в браузере и в среде Node.js. Архитектура пакета построена по модульному принципу: каждая подсистема (математика, формы столкновений, динамика, ограничения и широкофазная проверка) выделена в отдельный набор модулей. Это упрощает сопровождение, оптимизацию и сборку под разные цели.
Структура дистрибутива обычно включает:
Пакет распространяется через npm под именем oimo, что
позволяет подключать его как зависимость в современных
фронтенд-проектах.
UMD-версия ориентирована на использование через
<script> в браузере. После подключения глобальная
переменная OIMO становится точкой доступа ко всем классам
движка.
Особенности:
В этом режиме структура пакета «сворачивается» в единый файл, где все модули объединены в один namespace.
Современные версии Oimo.js поддерживают модульную систему ES6. Это позволяет:
Пример точечного импорта:
import { World, RigidBody, Vec3 } from 'oimo';
В этом случае точкой входа становится основной экспорт пакета, который агрегирует ключевые классы.
В package.json определяется поле main и/или
module, указывающее на главный файл сборки. Именно этот
файл выполняет роль центральной точки входа.
Типичная схема:
main → UMD или CommonJS-сборка;module → ES-модульная версия;browser → оптимизированная сборка для браузера.Главный файл выполняет следующие задачи:
Таким образом, внешнее приложение взаимодействует не с внутренней структурой движка, а с агрегированным интерфейсом.
Логическая структура движка делится на несколько подсистем.
Каталог с математическими примитивами включает:
Эти модули независимы от динамики и используются всеми остальными подсистемами.
Основные задачи:
Подсистема shapes содержит реализации:
Каждая форма инкапсулирует:
Формы не обладают динамикой — они используются телами (RigidBody).
Каталог динамики включает:
RigidBody объединяет:
Именно здесь реализуется интеграция движения.
Класс World — центральный координационный элемент. Он
отвечает за:
Структурно World зависит от всех подсистем, но внешнему
коду достаточно работать только с ним.
Подсистема BroadPhase выполняет первичный отбор потенциально сталкивающихся тел.
Внутри пакета могут использоваться:
BroadPhase работает с bounding box’ами и передаёт кандидатов в узкофазный алгоритм.
NarrowPhase реализует:
Эти модули глубоко интегрированы с геометрией и математическим ядром.
Подсистема constraints реализует:
Каждое ограничение представлено отдельным классом, наследующим базовый тип Constraint.
Взаимодействие модулей строится по следующей схеме:
Math → Shapes → RigidBody → World
↘
BroadPhase → NarrowPhase → Solver
Такое разделение обеспечивает:
Главная точка входа формирует публичный интерфейс, экспортируя:
Публичный API скрывает:
Это снижает риск некорректного использования движка.
Типичная структура исходного кода может выглядеть так:
src/
├── core/
│ ├── World.js
│ ├── RigidBody.js
│
├── math/
│ ├── Vec3.js
│ ├── Mat3.js
│
├── collision/
│ ├── broadphase/
│ ├── narrowphase/
│
├── shape/
│ ├── Box.js
│ ├── Sphere.js
│
├── constraint/
│
└── utils/
Такое деление позволяет:
При использовании UMD-сборки:
<script src="oimo.min.js"></script>
<script>
const world = new OIMO.World();
</script>
В этом случае глобальный объект OIMO формируется главным
файлом сборки.
При использовании ES-модулей:
import { World } from 'oimo';
const world = new World();
Здесь точка входа определяется системой модулей и конфигурацией сборщика.
Oimo.js часто используется совместно с графическими библиотеками, например:
В таких проектах структура пакета и корректная точка входа особенно важны, поскольку физический движок интегрируется в уже существующую архитектуру рендеринга.
Благодаря модульной организации возможно:
Расширение осуществляется либо через форк проекта, либо через подключение пользовательских модулей поверх публичного API.
Oimo.js не имеет тяжёлых внешних зависимостей, что упрощает:
Весь функционал сосредоточен внутри пакета, а точка входа лишь агрегирует экспорт.
Структура пакета строится на следующих принципах:
Такая организация делает движок предсказуемым для разработчиков и удобным для анализа внутренней логики.
Главный файл сборки влияет на:
Грамотно организованная точка входа позволяет:
Структура пакета Oimo.js отражает баланс между низкоуровневой физической математикой и удобным публичным API. Чёткое разделение подсистем, продуманная точка входа и поддержка разных форматов сборки обеспечивают гибкость интеграции в современные JavaScript-проекты различной сложности.