В библиотеке Oimo.js для физического моделирования
взаимодействия объектов используется система контактов.
Контакты представляют собой столкновения между телами, которые
отслеживаются физическим движком для расчета сил, импульсов и
последующего обновления состояния объектов. Методы
beginContact, persistContact и
endContact позволяют реагировать на изменение состояния
контакта на уровне событий.
beginContactМетод beginContact вызывается один раз в момент
начала столкновения двух тел. Основная задача —
определить момент, когда два объекта впервые входят в контакт, чтобы
можно было:
Пример использования:
world.addContactListener({
beginContact: function(contact) {
const bodyA = contact.bodyA;
const bodyB = contact.bodyB;
console.log("Столкновение началось между:", bodyA.name, "и", bodyB.name);
}
});
Ключевые моменты:
contact содержит ссылки на объекты bodyA и
bodyB, а также на контактные точки.persistContactМетод persistContact срабатывает каждый физический шаг,
пока контакт сохраняется. Это позволяет отслеживать
постоянное взаимодействие объектов, например:
Пример использования:
world.addContactListener({
persistContact: function(contact) {
const bodyA = contact.bodyA;
const bodyB = contact.bodyB;
console.log("Контакт продолжается между:", bodyA.name, "и", bodyB.name);
}
});
Особенности метода:
endContactМетод endContact вызывается в момент разрыва
контакта двух тел. Он необходим для завершения всех эффектов,
связанных с взаимодействием объектов:
Пример:
world.addContactListener({
endContact: function(contact) {
const bodyA = contact.bodyA;
const bodyB = contact.bodyB;
console.log("Контакт завершен между:", bodyA.name, "и", bodyB.name);
}
});
Особенности метода:
beginContact для полного
цикла обработки столкновения.contactВнутри всех трёх методов объект contact содержит важные
данные для управления столкновениями:
bodyA и bodyB — ссылки на столкнувшиеся
тела.manifold — информация о контактных точках (позиция,
нормаль, глубина проникновения).getWorldPoint() для вычисления координат точки контакта в
мировой системе координат.Использование этих данных позволяет реализовать сложную физическую логику, включая:
persistContact, так как он вызывается на каждом шаге
симуляции.beginContact для инициализации эффектов,
persistContact для постоянного обновления,
endContact для очистки.if(bodyA.type === "player" && bodyB.type === "enemy") {
// обработка столкновения игрока и врага
}
contact можно менять коэффициенты трения, упругости или
другие параметры динамически в процессе симуляции.Эти три метода образуют полный цикл обработки контактов в Oimo.js, обеспечивая гибкий и точный контроль над физическим взаимодействием объектов на сцене.