Узкофазовое обнаружение: ContactEquation

В библиотеке Cannon.js класс ContactEquation является ключевым элементом системы столкновений и узкофазового обнаружения. Он используется для описания физического контакта между двумя телами и формирует основу для расчета сил реакции и ограничения движения объектов при столкновении. Каждый экземпляр ContactEquation представляет одно контактное взаимодействие между двумя телами в конкретный момент времени.

Структура ContactEquation

ContactEquation наследуется от базового класса Equation, что обеспечивает интеграцию с системой solver в Cannon.js. Основные свойства объекта:

  • bi и bj – объекты типа Body, участвующие в контакте. bi обычно обозначает тело, с которым происходит столкновение, а bj – тело, с которым оно взаимодействует.
  • ri и rj – векторы (Vec3), указывающие точку приложения силы относительно центра масс тел bi и bj. Эти векторы определяют момент силы и помогают правильно вычислять вращательное воздействие.
  • ni – нормаль контакта, направленная от тела bi к bj. Она используется для расчета силы нормали, предотвращающей проникновение тел друг в друга.
  • penetrationVec – вектор, показывающий глубину проникновения тел. Обычно вычисляется узкофазовым коллайдером и используется для корректировки позиций при решении системы уравнений.
  • stiffness и relaxation – коэффициенты жесткости и демпфирования контакта, управляющие “жесткостью” отклика при столкновении и скоростью устранения ошибки проникновения.

Механизм работы

При обнаружении столкновения движок создает объект ContactEquation для каждой пары контактных точек. Этот объект затем передается в solver, который решает линейную систему уравнений, чтобы определить:

  1. Силу нормали, удерживающую тела от взаимного проникновения.
  2. Моменты сил, влияющие на вращение тел.
  3. Динамическое поведение при столкновении с учетом массы, инерции и коэффициентов демпфирования.

Силы контакта рассчитываются по формуле:

[ F = -k - v_{rel}]

где:

    1. — жесткость (stiffness),
  • () — глубина проникновения,
  • () — демпфирование (relaxation),
  • (v_{rel}) — относительная скорость тел вдоль нормали.

Методы ContactEquation

computeB(h) – основной метод, вызываемый solver’ом. Рассчитывает правую часть уравнения (B) для интегратора, используя текущие позиции и скорости тел. Параметр h задает шаг интегрирования.

getImpactVelocityAlongNormal() – возвращает скорость сближения тел вдоль нормали контакта. Используется для определения силы столкновения и коэффициента восстановления.

addToSolver() – вспомогательный метод, который добавляет уравнение в solver. Обычно вызывается автоматически движком при формировании системы столкновений.

Связь с другими компонентами

ContactEquation тесно взаимодействует с:

  • Narrowphase – узкофазовый детектор столкновений. Именно он вычисляет контактные точки и нормали, создавая объекты ContactEquation.
  • Solver – решает систему ограничений для всех контактов и соединений, обеспечивая физически корректное поведение тел.
  • FrictionEquation – расширение для моделирования трения. Использует контактную нормаль ni из ContactEquation для расчета касательных сил.

Практические аспекты

  • Производительность: при большом числе тел создание слишком большого количества ContactEquation может замедлять симуляцию. Используется оптимизация через broadphase и ограничение числа контактных точек.
  • Настройка физики: изменение stiffness и relaxation позволяет моделировать от жестких твердых тел до мягких объектов с амортизацией.
  • Стабильность: малые значения stiffness могут привести к просачиванию тел через друг друга, слишком большие – к численной нестабильности solver’а.

Пример использования

const contact = new CANNON.ContactEquation(bodyA, bodyB);
contact.ri.copy(localPointA);
contact.rj.copy(localPointB);
contact.ni.copy(normal);
contact.stiffness = 1e7;
contact.relaxation = 3;

// Добавление в solver
world.solver.addEquation(contact);

В этом примере создается контакт между bodyA и bodyB, задаются точки приложения силы и нормаль контакта, а также параметры жесткости и демпфирования. После этого уравнение добавляется в solver для расчета силы реакции.

Выводы о ContactEquation

ContactEquation является основой узкофазового обнаружения и расчета столкновений в Cannon.js. Понимание его структуры и работы позволяет точно управлять физикой объектов, настраивать поведение столкновений и интегрировать трение и другие физические эффекты. В сочетании с Narrowphase и Solver он обеспечивает стабильное и реалистичное моделирование динамики твердых тел.