Компонент Collision: примитивы, меши, триггеры

Компонент Collision в PlayCanvas используется для взаимодействия объектов с другими объектами в трехмерном пространстве, управляя их столкновениями. Он позволяет разработчикам задать различные типы столкновений для объектов, используя примитивы, меши или триггеры, которые реагируют на физические силы и взаимодействуют друг с другом. В данной статье рассматриваются основные типы столкновений, их использование и настройки в PlayCanvas.

Примитивы столкновения

Примитивы в PlayCanvas — это базовые геометрические формы, которые используются для определения области столкновения объектов. Эти формы просты в использовании и требуют минимальных вычислительных ресурсов, что делает их подходящими для большинства объектов в игре.

  1. Сфера (Sphere) Сфера является одним из самых популярных примитивов, который используется для определения области столкновения. Это идеальная форма для объектов, которые имеют округлую форму, например, шары или другие объекты с симметричной геометрией. Сфера имеет один параметр: радиус, который определяет её размер.

    var sphere = new pc.CollisionComponent();
    sphere.type = pc.CollisionComponent.TYPE_SPHERE;
    sphere.radius = 1;
  2. Коробка (Box) Коробка представляет собой прямоугольный параллелепипед и используется для объектов с угловатыми и прямыми гранями. Она полезна для столкновений с объектами, которые не имеют идеально круглой формы, например, здания, коробки или стенки. Размеры коробки задаются через её ширину, высоту и глубину.

    var box = new pc.CollisionComponent();
    box.type = pc.CollisionComponent.TYPE_BOX;
    box.halfExtents = new pc.Vec3(1, 1, 1);  // размеры половины коробки
  3. Цилиндр (Cylinder) Цилиндр — это форма, которая часто используется для объектов с круглым основанием и прямыми стенками. Он может быть полезен для описания объектов вроде труб, столбов, деревьев и других объектов, которые имеют форму цилиндра.

    var cylinder = new pc.CollisionComponent();
    cylinder.type = pc.CollisionComponent.TYPE_CYLINDER;
    cylinder.radius = 0.5;  // радиус основания
    cylinder.height = 2;    // высота цилиндра

Меши столкновения

Меши (Meshes) используются, когда необходимо задать столкновение для более сложных форм, не подходящих под стандартные примитивы. Меши — это сетки из треугольников, которые описывают геометрию объекта в пространстве. Использование мешей даёт точность в столкновениях, но требует больших вычислительных ресурсов, особенно для сложных объектов.

В PlayCanvas меши можно использовать, загрузив геометрию объекта в виде файла (например, .obj, .fbx) и затем применив её для компонента столкновения.

var meshCollider = new pc.CollisionComponent();
meshCollider.type = pc.CollisionComponent.TYPE_MESH;
meshCollider.asset = someMeshAsset;  // Загруженный меш

Меши обеспечивают точность, однако они более ресурсоемки, особенно если объект имеет большое количество полигонов. Поэтому их часто используют для статичных объектов, таких как стены, здания или сложные геометрические формы.

Триггеры

Триггеры — это особый тип столкновений, при которых объекты не взаимодействуют с физикой, но способны срабатывать на пересечение с другими объектами. В отличие от обычных столкновений, которые влияют на физику объектов, триггеры не вызывают изменение движения объекта при пересечении.

Триггеры обычно применяются для создания событий, таких как вход в зону действия, активация объектов или выполнение заданий. Они позволяют отслеживать, когда другой объект входит или покидает заданную область.

Чтобы сделать компонент столкновения триггером, необходимо установить флаг isTrigger в значение true:

var trigger = new pc.CollisionComponent();
trigger.type = pc.CollisionComponent.TYPE_BOX;
trigger.halfExtents = new pc.Vec3(1, 1, 1);  // размеры триггера
trigger.isTrigger = true;

Триггеры часто используются в механизмах, связанных с обнаружением взаимодействий, например, для обнаружения коллизий с невидимыми областями на карте или для определения входа персонажа в определённую зону.

Настройки и взаимодействие с физикой

Компонент Collision тесно интегрирован с системой физики PlayCanvas. Для того чтобы объекты не только реагировали на столкновения, но и подчинялись законам физики, необходимо добавить компонент RigidBody, который связывает объект с физическим движком.

Пример добавления компонентов столкновения и физического тела:

var entity = new pc.Entity();
entity.addComponent('collision', {
    type: pc.CollisionComponent.TYPE_BOX,
    halfExtents: new pc.Vec3(1, 1, 1)
});
entity.addComponent('rigidbody', {
    type: pc.RigidbodyComponent.TYPE_DYNAMIC,
    mass: 1
});

В этом примере объект добавляет компоненты столкновения и физического тела, что позволяет ему взаимодействовать с другими объектами в игровом мире с учётом физики. Если объект должен быть статичным, можно установить тип физического тела как STATIC:

entity.addComponent('rigidbody', {
    type: pc.RigidbodyComponent.TYPE_STATIC
});

Режимы столкновений

PlayCanvas позволяет настраивать режимы столкновений с использованием системы фильтров столкновений. Эти фильтры позволяют настраивать, какие объекты могут взаимодействовать друг с другом, а какие — нет. Это особенно полезно для управления сложными взаимодействиями в игре, например, для того, чтобы персонажи не сталкивались с определёнными объектами.

Можно настроить фильтры на основе групп объектов, используя collision groups и mask. Таким образом, можно настроить столкновения только между объектами, принадлежащими к определённым группам.

Пример настройки фильтров столкновений:

entity.collision.groups = pc.CollisionComponent.GROUP_1;
entity.collision.mask = pc.CollisionComponent.GROUP_2;

Этот код указывает, что объект с компонентом столкновения будет взаимодействовать только с объектами, которые принадлежат группе GROUP_2, и игнорировать все остальные.

Обработка событий столкновений

PlayCanvas позволяет обрабатывать события столкновений, такие как hit, enter и exit, с помощью системы событий. Эти события можно использовать для реализации игровой логики, например, активации эффектов при столкновении или изменении состояния объекта.

Пример обработки события столкновения:

entity.collision.on('collisionstart', function (otherEntity) {
    console.log('Объект столкнулся с:', otherEntity.name);
});

События также позволяют отслеживать, какие объекты взаимодействуют друг с другом, и на основе этого выполнять дополнительные действия, например, проигрывание анимаций или изменения в игровом процессе.

Заключение

Компонент Collision в PlayCanvas предоставляет множество возможностей для работы с физическими столкновениями и взаимодействиями объектов. Используя примитивы, меши и триггеры, можно создать как простые, так и сложные системы столкновений, а также интегрировать их с системой физики для более реалистичных взаимодействий. Эффективное использование этих компонентов позволяет значительно улучшить динамику и реализм игрового процесса.