В библиотеке Cannon.js класс
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, который решает
линейную систему уравнений, чтобы определить:
Силы контакта рассчитываются по формуле:
[ F = -k - v_{rel}]
где:
stiffness),relaxation),computeB(h) – основной метод,
вызываемый solver’ом. Рассчитывает правую часть уравнения (B) для
интегратора, используя текущие позиции и скорости тел. Параметр
h задает шаг интегрирования.
getImpactVelocityAlongNormal() –
возвращает скорость сближения тел вдоль нормали контакта. Используется
для определения силы столкновения и коэффициента восстановления.
addToSolver() – вспомогательный метод,
который добавляет уравнение в solver. Обычно вызывается автоматически
движком при формировании системы столкновений.
ContactEquation тесно взаимодействует с:
ContactEquation.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 является основой узкофазового
обнаружения и расчета столкновений в Cannon.js. Понимание его структуры
и работы позволяет точно управлять физикой объектов, настраивать
поведение столкновений и интегрировать трение и другие физические
эффекты. В сочетании с Narrowphase и
Solver он обеспечивает стабильное и реалистичное
моделирование динамики твердых тел.