Класс pc.BoundingBox и pc.BoundingSphere

В PlayCanvas классы pc.BoundingBox и pc.BoundingSphere представляют собой геометрические объекты, которые используются для определения ограничивающих объемов, облегчающих обработку столкновений и оптимизацию рендеринга в 3D-сценах. Эти классы помогают вычислять минимальные и максимальные размеры объектов, упрощая взаимодействие с ними в физическом мире игры или приложения. Разберем их подробнее.

Класс pc.BoundingBox

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

Основные свойства
  1. center — вектор, который указывает на центр ограничивающего объема. Этот вектор хранит координаты центра коробки.
  2. halfExtents — вектор, определяющий половину длины, ширины и высоты коробки вдоль каждой оси. Этот вектор указывает на половину размера коробки по осям X, Y и Z.
Основные методы
  • containsPoint — метод, проверяющий, находится ли точка внутри ограничивающего объема. Он принимает объект pc.Vec3 и возвращает true, если точка внутри, и false в противном случае.

    let box = new pc.BoundingBox();
    box.center = new pc.Vec3(0, 0, 0);
    box.halfExtents = new pc.Vec3(1, 1, 1);
    
    let point = new pc.Vec3(0.5, 0.5, 0.5);
    console.log(box.containsPoint(point)); // true
  • intersectsBoundingBox — метод, который проверяет, пересекаются ли два pc.BoundingBox. Он возвращает true, если два ограничивающих объема пересекаются, и false, если они не пересекаются.

    let box1 = new pc.BoundingBox();
    box1.center = new pc.Vec3(0, 0, 0);
    box1.halfExtents = new pc.Vec3(1, 1, 1);
    
    let box2 = new pc.BoundingBox();
    box2.center = new pc.Vec3(0.5, 0.5, 0.5);
    box2.halfExtents = new pc.Vec3(1, 1, 1);
    
    console.log(box1.intersectsBoundingBox(box2)); // true
  • getCorners — метод, который возвращает массив из 8 углов ограничивающего объема. Эти углы могут быть использованы для дальнейших вычислений или визуализации.

    let box = new pc.BoundingBox();
    box.center = new pc.Vec3(0, 0, 0);
    box.halfExtents = new pc.Vec3(1, 1, 1);
    
    let corners = box.getCorners();
    console.log(corners); // Массив с углами

Класс pc.BoundingSphere

pc.BoundingSphere представляет собой ограничивающую сферу, которая полностью охватывает объект в трехмерном пространстве. Сфера — более простой и часто используемый тип ограничивающего объема, так как ее проще вычислять, особенно в задачах, связанных с столкновениями и расстоянием между объектами. Это также делает pc.BoundingSphere идеальным выбором для быстрых операций проверки пересечений и видимости.

Основные свойства
  1. center — вектор, который указывает на центр сферы.
  2. radius — радиус сферы, определяющий ее размер.
Основные методы
  • containsPoint — метод, проверяющий, находится ли точка внутри сферы. Он принимает объект pc.Vec3 и возвращает true, если точка внутри сферы, и false, если она за пределами.

    let sphere = new pc.BoundingSphere();
    sphere.center = new pc.Vec3(0, 0, 0);
    sphere.radius = 1;
    
    let point = new pc.Vec3(0.5, 0.5, 0.5);
    console.log(sphere.containsPoint(point)); // true
  • intersectsBoundingSphere — метод, который проверяет, пересекаются ли две сферы. Он возвращает true, если две сферы пересекаются, и false, если не пересекаются.

    let sphere1 = new pc.BoundingSphere();
    sphere1.center = new pc.Vec3(0, 0, 0);
    sphere1.radius = 1;
    
    let sphere2 = new pc.BoundingSphere();
    sphere2.center = new pc.Vec3(1, 0, 0);
    sphere2.radius = 1;
    
    console.log(sphere1.intersectsBoundingSphere(sphere2)); // true
  • getDistanceToPoint — метод, который вычисляет минимальное расстояние от точки до сферы. Это полезно, например, при проверке, насколько близко находятся два объекта, не обязательно пересекаясь.

    let sphere = new pc.BoundingSphere();
    sphere.center = new pc.Vec3(0, 0, 0);
    sphere.radius = 1;
    
    let point = new pc.Vec3(2, 0, 0);
    console.log(sphere.getDistanceToPoint(point)); // 1

Сравнение pc.BoundingBox и pc.BoundingSphere

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

  1. Форма: pc.BoundingBox имеет прямоугольную форму и может быть использована для объектов с более сложной геометрией. pc.BoundingSphere, в свою очередь, представляет собой сферу и хорошо подходит для круглых или симметричных объектов.
  2. Производительность: Проверки столкновений с помощью pc.BoundingSphere зачастую выполняются быстрее, так как расчеты для сфер более просты, чем для прямоугольных объемов.
  3. Точность: В некоторых случаях ограничивающие прямоугольники могут точнее охватывать объект, особенно если его форма сильно отличается от сферы. Однако для сферических объектов использование pc.BoundingSphere будет предпочтительнее.

Применение в PlayCanvas

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

Использование pc.BoundingBox и pc.BoundingSphere помогает уменьшить вычислительную нагрузку, поскольку позволяет заменить сложные вычисления на более быстрые операции с ограничивающими объемами. Это особенно важно в 3D-графике и играх, где требуется высокая скорость обработки для обеспечения плавной работы.