This page has been translated automatically.
Основы UNIGINE
1. Введение
2. Виртуальные миры и работа с ними
3. Подготовка 3D моделей
4. Материалы
5. Камеры и освещение
6. Реализация логики приложения
7. Создание кат-сцен и запись видео
8. Подготовка проекта к релизу
10. Основы оптимизации
11. ПРОЕКТ2: Шутер от первого лица
12. ПРОЕКТ3: Аркадная гонка по пересеченной местности от 3-го лица
13. ПРОЕКТ4: VR приложение с простым взаимодействием

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

In the real world, bodies usually don't move without constraints and obstacles, and the same goes for virtual worlds. For correct processing of the situation when the body meets an obstacle, collision detection is used.Когда физический объект перемещается в сцене, он нередко сталкивается с какими-то препятствиями. Для обработки таких ситуаций используются алгоритмы обнаружения столкновений.

Regardless of their implementation, collision detection algorithms usually operate with collision shapes that we have been talking about recently.Работа этих алгоритмов основана на использовании коллизионных форм (Collision shapes), о которых мы уже говорили ранее.

There are two types of collisions implemented in UNIGINE depending on the types of colliding objects:В UNIGINE есть 2 типа столкновений, которые зависят от типа объектов, участвующих в столкновении:

  • Shape — Shape collision between two objects with physical properties assigned (having a body and at least one shape, both enabled). In this case, the contact points between the shapes are found.Столкновение формы с формой (Shape — Shape) определяет столкновения между двумя физическими объектами (то есть, объектами, у которых есть физическое тело и как минимум одна коллизионная форма). При таком типе столкновения результатом являются точки контакта между формами.
  • Shape — Surface collision between an object with physical properties assigned and a non-physical object (without physical representation). If the surface has the Collision flag set, it can also passively participate in physical interaction and prevent the physical object from going through. In this case, contact points between the shape and surface polygons are computed.Столкновение формы с поверхностью (Shape — Surface) определяет столкновение физического объекта с поверхностью (surface), у которой включен флаг Collision. Этот флаг позволяет объектам без физических свойств пассивно взаимодействовать с физическими объектам. При таком типе столкновения результатом являются точки контакта между формой и поверхностью.
Примечание
Scaling of meshes that participate in collision detection is not supported. So, when you assign a physical body to an object, make sure that its scale is default. Otherwise, the scale will be reset automatically.Масштабирование мешей, которые участвуют в определении коллизий, не поддерживается. Поэтому перед назначением физического тела необходимо убедиться, что масштаб объекта не менялся после его создания. В противном случае, его значение станет дефолтным, как только начнется симуляция физики.

So, collision detection is enabled automatically for an object with a body and a collision shape, or when at least one of its surfaces has the Collision flag set.Таким образом, в обнаружении столкновений может участвовать только объект, у которого есть физическое тело и коллизионная форма или хотя бы для одной из его поверхностей установлен флаг Collision.

The algorithm for enabling/disabling collision detection is illustrated below:Алгоритм срабатывания обнаружения столкновений показан на рисунке ниже:

Примечание
  • Disabling physics simulation globally does not turn off collision detection.Disabling physics simulation globally does not turn off collision detection.
  • If the object has the body and shape assigned and enabled, the collision detection algorithms will use only the shape parameters, while the parameters of its surfaces will be ignored.If the object has the body and shape assigned and enabled, the collision detection algorithms will use only the shape parameters, while the parameters of its surfaces will be ignored.
Disabling physics simulation globally does not turn off collision detection.If the object has the body and shape assigned and enabled, the collision detection algorithms will use only the shape parameters, while the parameters of its surfaces will be ignored.
  • Disabling physics simulation globally does not turn off collision detection.Если вы отключите физическую симуляцию для всего мира, вычисление столкновений все равно продолжится.
  • If the object has the body and shape assigned and enabled, the collision detection algorithms will use only the shape parameters, while the parameters of its surfaces will be ignored.Если у объекта есть активное физическое тело и коллизионная форма, алгоритмы обнаружения столкновений будут использовать только параметры формы, игнорируя параметры поверхности, с которой произошло столкновение.

Complex scenes may contain a lot of objects for which physics simulation is enabled, but not all of them need to interact with each other.Сложные сцены могут содержать множество объектов, для которых включена симуляция физики, но не все они должны взаимодействовать между собой.

For optimization purposes, you can use the Collision mask. It allows you to limit the number of objects that a physical object can collide with. Only surfaces and collision shapes with matching masks will collide.Для оптимизации процесса обнаружения столкновений можно использовать маску Collision. Она позволяет ограничить число объектов, с которыми может сталкиваться определенный физический объект. Сталкиваться будут только поверхности и коллизионные формы с совпадающими масками.

The Exclusion mask can be used to define shapes that should ignore each other.А чтобы определить, какие коллизионные формы должны игнорировать друг друга, необходимо настроить для них маску Exclusion.

The whole process is divided into the following stages and phases:Весь процесс обнаружения столкновений включает в себя следующие этапы:

  1. Collision DetectionОбнаружение столкновений
  2. Collision ResponseРеакция на столкновение
  3. Callbacks ExecutionВыполнение обратных вызовов (callbacks)

Phases: (a) — collision detection, (b) — collision responseЭтапы: (a) — обнаружение столкновений, (b) — отклик на столкновение

Collision Detection
Обнаружение столкновений
#

During this phase, we find all collisions with all contact points and collect all necessary information. First, our pairs of objects that are positioned too far to collide are filtered. Then, all collisions along with contact points for all colliding bodies are found.На этом этапе происходит поиск всех столкновений: сначала отсеиваются те объекты, которые расположены далеко друг от друга и точно не столкнутся, а затем уже вычисляются все столкновения и точки контакта физических тел.

So, here we collect all the data required to resolve collisions later — contact points coordinates, normals, depth of shapes penetration, relative velocity (between two bodies), relative friction and restitution.Таким образом, на этом этапе происходит сбор всех данных, необходимых для вычислений на последующих этапах: координаты точек контакта, их нормали, глубина проникновения коллизионных форм, коэффициенты трения и восстановления.

Collision Response
Реакция на столкновения
#

So, we've got all the necessary information about collisions. Now we need to process this information to provide a realistic reaction. Collision response stands for simulation of the changes in the motion of two solid bodies after collision. UNIGINE uses an impulse-based reaction model. During response calculation, two parameters — the restitution and friction coefficients — are taken into account. These coefficients can be set for a shape as well as for a surface.После того, как все столкновения обнаружены, необходимо их обработать, то есть обеспечить на них реакцию – изменение в движении тел после столкновения. UNIGINE использует импульсную модель. При вычислении реакции на столкновение во внимание принимаются коэффициенты трения и восстановления, заданные для формы или поверхности.

Collision responseРеакция на столкновение

Callbacks Execution
Выполнение обратных вызовов
#

At this stage, all user-defined physics callbacks are called. They are executed in certain physics-related events. These callbacks are mainly used for creation, destruction, or modification of other objects, such operations can only be performed in the main thread.На этом этапе выполняются все функции обратного вызова (колбэки) для физических объектов, заданные пользовательской логикой. Они выполняются при возникновении определенных событий при взаимодействии физических объектов. В основном обратные вызовы используются для создания, изменения или удаления других объектов.

Discrete and Continuous Collision Detection
Дискретное и непрерывное обнаружение столкновений
#

In UNIGINE, physics is simulated at its own frame rate that doesn’t depend on the rendering frame rate. As we discussed earlier, you can specify the number of cycles of physics simulation during one physics tick in the global settings.В UNIGINE физика симулируется со своей собственной фиксированной частотой кадров, которая не зависит от частоты кадров отрисовки. Как мы уже говорили ранее, вы можете задать количество циклов расчета физики в секунду в глобальных настройках.

Basically, collisions are calculated each physics tick. This approach is called discrete collision detection. Such discretization improves performance and is accurate enough. However, when the frame rate is low, small, fast-moving objects are likely to teleport from one point to another instead of moving smoothly, so collisions are not detected.Обычно столкновения рассчитываются каждый физический цикл. Такой подход называется дискретным обнаружением столкновений, так как выполняется через определенные промежутки времени. Он позволяет повысить производительность, но у него есть один недостаток, который проявляется при низкой частоте кадров – небольшой объект, движущийся на высокой скорости, будто телепортируется из одной точки в другую вместо плавного перемещения, и столкновение не будет обнаружено.

In continuous collision detection, the Engine calculates contact points the body will have (in the current physical frame) if it continues its current trajectory. These calculations are based on the velocity of the body and the radius of the collision shape. In other words, moving bodies are extruded along their trajectory, forming a volume used for collision detection at higher speeds.При непрерывном обнаружении столкновений движок на основании скорости тела и радиуса коллизионной формы вычисляет, какие контакты будут у этого тела (в текущем физическом кадре), если оно продолжит свою текущую траекторию. То есть, тело как бы вытягивается вдоль своей траектории, и формируется объем, который используется для обнаружения столкновений на высокой скорости.

Thus, contacts are checked not just once per frame but during the entire frame. This approach excludes missed collisions.Таким образом, контакты анализируются не дискретно (один раз за кадр), а на протяжении всего кадра. Такой подход позволяет исключить ситуации с пропуском столкновений.

Примечание
Continuous collision detections are only available for the Capsule and Sphere shapes.Непрерывное обнаружение столкновений доступно только для сферических и капсульных форм.

Physics Intersections
Использование рейкастов в физике (Physics Intersections)
#

In some cases, you can use physics intersections for collision detection. Intersection detection lies at the heart of collision detection, but it is a particular case of ray intersection (ray casting).Иногда вместо обнаружения столкновений для коллизионных форм можно использовать механизм обнаружения пересечений. Он лежит в основе обнаружения столкновений, но является частным случаем испускания лучей (ray casting).

Intersection calculation is less expensive than collision calculation — a ray is cast from a certain point in a certain direction to find the first intersection with a surface or a collision shape.На вычисление пересечений тратится меньше ресурсов, чем на вычисление столкновений: из некоторой точки в определенном направлении пускается луч и ищется первое пересечение этого луча с коллизионной формой или поверхностью.

For example, calculation of collisions of car wheels with the ground takes time and decreases the frame rate. Instead, you can use the intersection of rays cast from the bottom of the car with the ground.Например, определение коллизий всех колес автомобиля с дорогой может снизить производительность, поэтому иногда может быть проще вычислить пересечение одного луча, выпущенного из нижней части автомобиля, с дорогой, или пустить 4 луча из колесных арок.

Ray castingИспускание луча (ray casting)

And if you want to exclude some obstacles, you can use the Physics Intersection mask. Physics intersection is detected only if the Physics Intersection mask of the surface or shape matches the Intersection mask defined for the ray.Для того, чтобы отфильтровать пересечения с некоторыми объектами, можно использовать маску Physics Intersection: пересечение будет обнаруживаться только если Physics Intersection mask формы или поверхности совпадает с маской, заданной для луча.

Последнее обновление: 06.02.2024
Build: ()