Контактные многообразия и точки контакта

Контактные многообразия в Oimo.js представляют собой структуры, описывающие взаимодействие между телами в физическом мире. Каждое столкновение формируется как набор контактных точек, объединённых в контактное многообразие (contact manifold). Это позволяет физическому движку корректно рассчитывать силы реакции, предотвращать проникновение тел друг в друга и обеспечивать реалистичное поведение объектов при столкновениях.


Контактные многообразия (Contact Manifolds)

Contact manifold — это объект, который агрегирует все контактные точки между двумя телами на одном шаге симуляции. В Oimo.js такие многообразия управляются через внутренние структуры движка, но могут быть изучены и использованы при расширении физической симуляции.

Основные свойства контактного многообразия:

  • bodyA и bodyB — ссылки на тела, участвующие в столкновении.
  • points — массив точек контакта (ContactPoint).
  • numPoints — текущее количество активных точек контакта.
  • friction и restitution — коэффициенты трения и упругости для данной пары тел.
  • update() — метод обновления многообразия, который пересчитывает контактные точки и их свойства на основе текущих позиций тел.

Контактное многообразие может включать одну или несколько контактных точек, в зависимости от формы объектов и характера столкновения. Например, при столкновении двух кубов может возникнуть до 4–8 контактных точек, каждая из которых влияет на результат симуляции.


Точки контакта (Contact Points)

Каждая точка контакта описывает конкретное место соприкосновения двух тел и хранит информацию, необходимую для расчета сил и импульсов.

Ключевые параметры ContactPoint:

  • position — вектор мировой координаты точки контакта.
  • normal — нормаль поверхности в точке контакта, направленная от первого тела к второму.
  • penetration — глубина проникновения тел друг в друга. Используется для вычисления силы коррекции.
  • impulse — накопленный импульс для устранения проникновения.
  • tangentImpulse — импульс трения по касательной к поверхности контакта.
  • warmStarted — флаг, указывающий на использование предыдущих значений импульсов для ускорения сходимости метода итераций.

Каждая контактная точка создается динамически при пересечении тел и удаляется, когда тела больше не пересекаются. Oimo.js оптимизирует хранение контактных точек, чтобы уменьшить количество вычислений при больших сценах.


Обновление контактных многообразий

Процесс симуляции в Oimo.js включает следующие шаги для работы с контактными многообразиями:

  1. Детектирование столкновений: на основе геометрии тел определяется, пересекаются ли объекты.
  2. Генерация новых точек контакта: если пересечение обнаружено, создаются новые контактные точки с вычисленными положением, нормалью и глубиной проникновения.
  3. Сопоставление с предыдущими точками (Persistent Contact): движок пытается сохранить предыдущие контактные точки для уменьшения дрожания и повышения стабильности.
  4. Рассчет импульсов: каждая точка контакта участвует в решении системы уравнений для корректного расчета сил реакции.
  5. Обновление многообразия: после вычислений точки контакта обновляются и передаются на следующий шаг симуляции.

Взаимодействие трения и упругости

Контактное многообразие является основой для моделирования трения и упругости между телами:

  • Упругость (Restitution): коэффициент, определяющий, насколько энергия сохраняется после столкновения. Используется для расчета нормального импульса вдоль нормали контакта.
  • Трение (Friction): реализуется через касательные импульсы для каждой контактной точки. В Oimo.js используется модель Coulomb, где величина трения пропорциональна нормальной силе контакта.

Эти параметры задаются как на уровне тела, так и на уровне конкретного многообразия, что позволяет гибко управлять поведением объектов.


Оптимизация и сохранение контактных данных

Для повышения производительности Oimo.js использует несколько техник:

  • Постоянные контактные точки: стараются сохранять предыдущие точки при малых перемещениях, чтобы уменьшить колебания и “дрожание” объектов.
  • Лимитирование количества точек: при сложных столкновениях количество активных точек ограничено, например до 4–8, чтобы избежать излишней нагрузки на процессор.
  • Разделение коллизий по паре тел: каждое многообразие обрабатывается отдельно, что позволяет эффективно вычислять силы в многотельных системах.

Пример структуры ContactPoint в Oimo.js

let contactPoint = {
    position: new OIMO.Vec3(1, 2, 3),
    normal: new OIMO.Vec3(0, 1, 0),
    penetration: 0.05,
    impulse: 0,
    tangentImpulse: [0, 0],
    warmStarted: false
};

Каждая контактная точка тесно связана с расчетом импульсов и коррекцией позиций, обеспечивая стабильность симуляции даже при сложных взаимодействиях.


Роль контактных многообразий в физической симуляции

Контактные многообразия являются центральным элементом механизма столкновений:

  • Объединяют все контактные точки между двумя телами.
  • Обеспечивают корректное взаимодействие упругости и трения.
  • Служат основой для решения систем уравнений импульсов.
  • Улучшают стабильность симуляции за счет сохранения предыдущих контактных данных.

Эффективное управление контактными многообразиями позволяет создавать реалистичные физические сцены с множеством тел и сложными столкновениями без потери производительности.