В Oimo.js взаимодействие физических объектов между
собой определяется коллизиями, которые регистрируются на уровне тел
(RigidBody) и форм (Shape). Для более детального контроля коллизий
используется механизм contact callbacks. Хотя коллбэки
можно назначать на уровне тела, настройка их на уровне отдельной формы
(Shape) предоставляет возможность реагировать только на
конкретные компоненты тела, что особенно важно для сложных составных
объектов.
Каждая форма (Shape) в Oimo.js может иметь собственный
contact callback. Это функция, вызываемая при
столкновении данной формы с другой формой. Сигнатура функции имеет
следующий вид:
function callback(contactPoint, otherShape, thisShape) {
// contactPoint — объект с информацией о точке контакта
// otherShape — форма, с которой произошло столкновение
// thisShape — текущая форма, на которой установлен callback
}
Для назначения коллбэка используется свойство
contactCallback формы:
let shape = body.addShape(new OIMO.Shape({
type: 'box',
size: [1, 1, 1],
pos: [0, 0, 0],
density: 1
}));
shape.contactCallback = function(contactPoint, otherShape, thisShape) {
console.log('Столкновение формы', thisShape, 'с формой', otherShape);
};
Здесь коллбэк будет срабатывать только при контакте этой конкретной формы, независимо от остальных форм тела.
Для оптимизации и предотвращения лишних вызовов коллбэка используется фильтрация по маске групп и категорий:
shape.filterGroup = 1; // группа формы
shape.filterMask = 2; // с какими группами разрешено взаимодействие
Коллбэк будет вызван только если другой объект принадлежит разрешённой группе.
Составные тела (Compound Bodies) содержат несколько форм. Каждая
форма может иметь свой contactCallback. Это позволяет:
Пример:
let compoundBody = world.add({
type: 'rigidBody',
shapes: [
{ type: 'box', size: [2, 1, 1], pos: [0, 0, 0] },
{ type: 'sphere', size: [0.5], pos: [0, 1, 0] }
]
});
compoundBody.shapes[0].contactCallback = (cp, other, self) => {
console.log('Контакт с нижней коробкой');
};
compoundBody.shapes[1].contactCallback = (cp, other, self) => {
console.log('Контакт с верхним шаром');
};
Объект contactPoint предоставляет следующие ключевые
свойства:
Эта информация позволяет рассчитывать реакцию, например, изменение цвета объекта, проигрывание анимации или вычисление повреждений в игровом движке.
Назначение contactCallback на уровне форм незначительно
увеличивает нагрузку при большом количестве объектов. Чтобы снизить
влияние на производительность:
filterGroup и
filterMask.contactPoint позволяет реализовать
сложную логику взаимодействия.Настройка contactCallback на уровне формы в Oimo.js
обеспечивает гибкий и точный контроль за столкновениями, позволяя
создавать сложные физические реакции без необходимости дробить объекты
на отдельные тела.