Столкновение в игровом движке не требует пересечения видимых моделей: физический движок для игр проверяет специальные формы — коллайдеры — и определяет, соприкасаются ли они или пересекаются. Затем система физики в игровых движках может рассчитать реакцию: остановить объект, изменить его скорость, учесть трение или сообщить игре о контакте.
Что важно знать о расчёте столкновений
- Видимая модель и форма, используемая физикой, могут различаться.
- Движок сначала быстро отбирает вероятные пары объектов, затем проверяет их точнее.
- Результат зависит от настроек коллайдеров, режима объектов и шага симуляции.
- Обнаружение контакта и физическая реакция — связанные, но отдельные этапы.
- Если объект движется быстро и пропускает тонкое препятствие, то проверьте непрерывную проверку столкновений и настройки физического шага.
Миф: столкновение возникает только при пересечении моделей
Столкновение не обязательно означает, что видимые поверхности объектов пересеклись. Для физики важны заданные коллайдеры: они могут касаться друг друга, пересекаться или, в некоторых режимах, лишь сообщать о контакте без физического отталкивания.
Графическая модель показывает внешний вид объекта, а коллайдер задаёт его физическую форму. Например, персонаж может выглядеть как сложная модель, но перемещаться с простой капсулой. Поэтому визуально между персонажем и стеной может оставаться зазор — либо модели могут выглядеть пересекающимися, хотя их коллайдеры ещё не соприкоснулись.
Если контакт выглядит неверно, то сначала сравните положение и размеры коллайдеров, а не меняйте меш модели наугад. Это помогает отличить ошибку геометрии от особенностей физического шага или настроек взаимодействия.
Что движок считает столкновением и где проходит граница контакта
Движок использует формы коллайдеров и правила взаимодействия, чтобы обнаружить контакт и передать результат симуляции или игровому коду. Обычно процесс можно представить так:
- Выбор участвующих объектов. Движок учитывает, какие объекты имеют коллайдеры и должны ли они взаимодействовать согласно настройкам слоёв и типов тел.
- Поиск потенциальных пар. Система быстро отсекает объекты, которые находятся далеко друг от друга.
- Проверка форм. Для оставшихся пар уточняется, соприкасаются или пересекаются ли их коллайдеры.
- Определение контакта. Движок получает сведения о контакте, например его положение и направление, необходимые для дальнейшего расчёта.
- Обработка результата. В зависимости от режима объект может получить физическую реакцию или только событие для игрового кода.
Если нужно, чтобы проход через область запускал событие без отталкивания, то используйте режим триггера или его аналог. Если объект должен физически упираться в препятствие, то проверьте, что коллайдер участвует в обычной обработке столкновений.
Коллайдеры и формы: как геометрия упрощает расчёт
Коллайдеры позволяют не проверять каждую деталь графического меша при каждом контакте. Форму подбирают с учётом задачи: чем она проще, тем легче её настраивать и обычно тем дешевле проверять.
- Капсула для персонажа. Если персонажу нужно перемещаться по уровню и проходить через дверные проёмы, то капсула часто удобнее точного повторения контуров модели.
- Коробка для предмета с прямыми гранями. Если объект похож на ящик или платформу, то коробчатый коллайдер обычно хорошо описывает его столкновения.
- Сфера для круглых объектов. Если нужно обрабатывать катящийся шар или простой снаряд, то сферическая форма может дать подходящую физическую аппроксимацию.
- Составная форма для сложного объекта. Если одного примитивного коллайдера недостаточно, то можно собрать форму из нескольких частей, если это поддерживает используемый движок.
- Коллайдер по мешу. Если важна точная форма неподвижного объекта окружения, то может подойти коллайдер, построенный по геометрии меша. Для движущихся тел применимость зависит от движка и его ограничений.
Если модель сложная, то не стремитесь сразу копировать её геометрию в физику. Сначала проверьте, достаточно ли простой формы для игрового поведения: визуальная точность и точность столкновений нужны не всегда в одинаковой степени.
Broad phase и narrow phase: отбор пар и точная проверка
Расчёт столкновений обычно разделяют на предварительный отбор и более точные проверки. Названия broad phase и narrow phase описывают эти этапы, а не отдельные игровые эффекты.
Broad phase ищет пары, которые потенциально могут взаимодействовать. Для этого движок использует упрощённые границы объектов, чтобы не сравнивать все формы со всеми.
- Если объектов много, то предварительный отбор помогает не тратить точную проверку на удалённые пары.
- Если коллайдер слишком велик, то он может чаще попадать в список кандидатов и увеличивать объём последующей работы.
- Если объект переместился, то система может обновить сведения о его границах и пересмотреть потенциальные контакты.
Narrow phase проверяет отобранные пары с учётом реальных форм коллайдеров и уточняет контакт.
- Если формы простые, то проверку обычно легче выполнить, но упрощение может хуже соответствовать нужному поведению.
- Если использовать сложную геометрию, то контакт можно описать точнее, однако такая проверка может требовать больше вычислений.
- Если коллайдеры настроены некорректно, то даже точная проверка даст результат, который не совпадает с ожиданиями от видимых моделей.
Коллизии в Unity и столкновения объектов в Unreal Engine настраиваются средствами соответствующих движков, но общая идея этапов отбора и проверки помогает разбирать проблемы в обоих случаях.
Как физический шаг определяет момент столкновения
Физика обновляет состояние мира отдельными шагами симуляции. Если объект успевает пройти заметное расстояние между проверками, контакт с тонким препятствием может быть обнаружен поздно или пропущен — конкретное поведение зависит от настроек и возможностей движка.
- Если быстрый объект проходит сквозь тонкую стену, то проверьте режим непрерывной проверки столкновений, если он доступен и подходит для этой пары объектов.
- Если результат меняется при нестабильном времени кадра, то отделите обновление физики от обычного обновления визуальной части согласно рекомендациям движка.
- Если объект дрожит у поверхности, то проверьте масштаб коллайдеров, начальное проникновение и частоту обновления физики.
- Если событие контакта срабатывает не тогда, когда ожидается, то выясните, в какой момент движок фиксирует физический контакт и когда игровой код получает уведомление.
- Если коллайдеры настроены правильно, но поведение всё ещё неожиданное, то проверьте ограничения взаимодействия между слоями и типами тел.
От контакта к реакции: импульсы, трение и проникновение
После обнаружения контакта физический решатель рассчитывает, как должны измениться движения тел с учётом их состояния и настроек материалов. Он может уменьшить движение в направлении препятствия, передать скорость другому объекту и учесть трение. Если формы уже пересеклись, решатель также может корректировать положение, чтобы устранить проникновение.
Мини-кейс. Если шар падает на пол и отскакивает слишком сильно, то проверьте настройки упругости материалов и физическое состояние шара. Если шар проходит сквозь пол, то проверьте наличие и положение коллайдеров, режим обнаружения быстрых столкновений и настройки взаимодействия объектов. Этот порядок помогает понять, где искать причину: в обнаружении контакта или в реакции на него.
Разбор практических ситуаций со столкновениями
Почему модели визуально пересекаются, но столкновения нет?
Видимые меши могут пересекаться, пока коллайдеры ещё не коснулись друг друга. Проверьте форму, размер и положение коллайдеров обоих объектов.
Почему персонаж упирается в невидимую стену?
Вероятно, коллайдер препятствия выступает за видимую модель или находится отдельно от неё. Сверьте его границы с геометрией уровня.
Почему снаряд пролетает сквозь препятствие?
При быстром движении объект может пройти через тонкую преграду между проверками физики. Если движок поддерживает такой режим, проверьте настройки непрерывного обнаружения столкновений.
Можно ли использовать меш модели как коллайдер?
Это зависит от типа тела и ограничений движка. Если объект движется, то сначала проверьте допустимые варианты коллайдеров и оцените, достаточно ли составной формы из простых примитивов.
Чем контакт отличается от триггера?
Обычный контакт может вызвать физическую реакцию, например остановку или отталкивание. Триггер обычно сообщает о пересечении области игровому коду без такой реакции.
Почему два объекта проходят друг сквозь друга?
Проверьте, есть ли у обоих объектов коллайдеры и разрешено ли взаимодействие между их слоями или типами. Также выясните, не настроен ли один из коллайдеров как триггер.
Как понять, что причина в физическом шаге?
Если проблема заметнее при высокой скорости объекта или нестабильном времени кадра, то проверьте настройки обновления физики и обнаружения быстрых столкновений. Если она сохраняется и при медленном движении, начните с проверки коллайдеров и правил взаимодействия.