Контактные многообразия в Oimo.js представляют собой структуры, описывающие взаимодействие между телами в физическом мире. Каждое столкновение формируется как набор контактных точек, объединённых в контактное многообразие (contact manifold). Это позволяет физическому движку корректно рассчитывать силы реакции, предотвращать проникновение тел друг в друга и обеспечивать реалистичное поведение объектов при столкновениях.
Contact manifold — это объект, который агрегирует все контактные точки между двумя телами на одном шаге симуляции. В Oimo.js такие многообразия управляются через внутренние структуры движка, но могут быть изучены и использованы при расширении физической симуляции.
Основные свойства контактного многообразия:
bodyA и bodyB — ссылки на тела,
участвующие в столкновении.points — массив точек контакта (ContactPoint).numPoints — текущее количество активных точек
контакта.friction и restitution — коэффициенты
трения и упругости для данной пары тел.update() — метод обновления многообразия, который
пересчитывает контактные точки и их свойства на основе текущих позиций
тел.Контактное многообразие может включать одну или несколько контактных точек, в зависимости от формы объектов и характера столкновения. Например, при столкновении двух кубов может возникнуть до 4–8 контактных точек, каждая из которых влияет на результат симуляции.
Каждая точка контакта описывает конкретное место соприкосновения двух тел и хранит информацию, необходимую для расчета сил и импульсов.
Ключевые параметры ContactPoint:
position — вектор мировой координаты точки
контакта.normal — нормаль поверхности в точке контакта,
направленная от первого тела к второму.penetration — глубина проникновения тел друг в друга.
Используется для вычисления силы коррекции.impulse — накопленный импульс для устранения
проникновения.tangentImpulse — импульс трения по касательной к
поверхности контакта.warmStarted — флаг, указывающий на использование
предыдущих значений импульсов для ускорения сходимости метода
итераций.Каждая контактная точка создается динамически при пересечении тел и удаляется, когда тела больше не пересекаются. Oimo.js оптимизирует хранение контактных точек, чтобы уменьшить количество вычислений при больших сценах.
Процесс симуляции в Oimo.js включает следующие шаги для работы с контактными многообразиями:
Контактное многообразие является основой для моделирования трения и упругости между телами:
Эти параметры задаются как на уровне тела, так и на уровне конкретного многообразия, что позволяет гибко управлять поведением объектов.
Для повышения производительности 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
};
Каждая контактная точка тесно связана с расчетом импульсов и коррекцией позиций, обеспечивая стабильность симуляции даже при сложных взаимодействиях.
Контактные многообразия являются центральным элементом механизма столкновений:
Эффективное управление контактными многообразиями позволяет создавать реалистичные физические сцены с множеством тел и сложными столкновениями без потери производительности.