В библиотеке Oimo.js физические объекты сцены не существуют изолированно. Каждый объект может быть связан с другими через контакты, ограничения и взаимодействия, формируя внутренний граф зависимостей. Этот граф определяет порядок обновления физических состояний, расчёт сил и столкновений. Узлы графа соответствуют телам (RigidBody), а рёбра — связям через контакты или джойнты (Joint).
Ключевой принцип: при симуляции каждый узел должен быть обработан после всех узлов, от которых зависит его состояние. Нарушение порядка приводит к нестабильности, «пробиваниям» тел и неверным результатам столкновений. Oimo.js строит граф зависимостей автоматически, основываясь на текущих контактах и ограничениях.
RigidBody является основным узлом. Важные параметры:
position и rotation — определяют положение
и ориентацию тела в пространстве.velocity и angularVelocity — линейная и
угловая скорость.mass — масса тела, критичная для расчёта
импульсов.forces и torques — накопленные силы и
моменты на шаг симуляции.Каждое тело отслеживает входящие и исходящие связи, чтобы корректно распределять импульсы при контакте с другими телами.
Joint (например, DistanceJoint,
HingeJoint) формирует рёбра графа. Joint хранит:
bodyA и bodyB).stiffness,
damping).Joint гарантирует, что физические расчёты будут учитывать взаимное влияние тел, предотвращая проникновение друг в друга или нарушения заданного расстояния.
Граф зависимостей обновляется каждый кадр. Процесс включает:
Contact.Эта структура обеспечивает корректное взаимодействие объектов, даже при сложных системах с множеством пересекающихся тел и ограничений.
Граф зависимостей напрямую влияет на эффективность симуляции. Основные аспекты:
Oimo.js оптимизирует граф с помощью группировки независимых подграфов, что позволяет интегрировать части сцены параллельно, снижая вычислительную нагрузку.
При добавлении или удалении тел и джойнтов граф перестраивается:
Важно понимать, что Oimo.js использует ленивое обновление графа: изменения применяются при следующем шаге симуляции, что позволяет минимизировать излишние пересчёты.
Для контроля над зависимостями полезно:
isStatic для неподвижных тел, чтобы
исключить их из динамического графа.Эти методы помогают сохранить стабильность симуляции и позволяют Oimo.js эффективно обрабатывать даже большие системы с десятками и сотнями тел.
Внутренний граф зависимостей в Oimo.js — это динамическая направленная структура, где:
RigidBodyContact и JointПонимание этой структуры критично для точного моделирования физики и оптимизации производительности сложных 3D сцен.