Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Непрерывное обнаружение столкновений (CCD)

CCD обеспечивает столкновение быстро движущихся тел с объектами, а не их прохождение или туннелирование через эти объекты. Unity предоставляет следующие методы CCD:

Чтобы использовать CCD на основе развертки, выберите компонент RigidBodyA что позволяет воздействовать на GameObject смоделированной гравитацией и другими силами. Подробнее
См. в Словарь
в ИнспекторОкно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет вам проверять и редактировать значения. Подробнее
Просмотрите в окне Словарь
и установите Обнаружение столкновенийАвтоматический процесс, выполняемый Unity, который определяет, вступал ли движущийся игровой объект с компонентом Rigidbody и коллайдера в контакт с какими-либо другими коллайдерами. Подробнее
См. в Словарь
на Непрерывно или Непрерывная динамика. Для спекулятивного CCD установите для параметра Обнаружение столкновений значение Непрерывный спекулятивный.

ПЗС с разверткой

CCD на основе развертки использует алгоритм Time Of Impact (TOI) для вычисления потенциальных столкновенийСтолкновение происходит, когда физический движок обнаруживает, что коллайдеры двух GameObject соприкасаются или перекрываются, когда хотя бы один из них имеет компонент Rigidbody и находится в движении. Подробнее
Посмотрите в Словарь
объект, перемещая его траекторию вперед, используя его текущую скорость. Если вдоль направления движения объекта есть контакты, алгоритм вычисляет время удара и перемещает объект до этого момента. Алгоритм может выполнять подшаги с этого момента и далее, вычисляя скорость после TOI, а затем повторяя развертку, за счет большего количества циклов ЦП.

Однако, поскольку этот метод основан на линейной развертке, он игнорирует угловое движение тела, что может вызвать эффект туннелирования, когда объекты вращаются со скоростью. Например, флиппер в автомате для игры в пинбол закреплен на одном конце и вращается вокруг фиксированной точки. Флиппер имеет только угловое движение и не имеет линейного движения. Поэтому он легко может пропустить столкновение с пинболом:

Тонкий джойстик GameObject с включенным свойством Continuous Dynamic. При быстром вращении вокруг точки вращения палка не соприкасается со сферой.
Тонкий джойстик GameObject с включенным свойством Continuous Dynamic. При быстром вращении вокруг точки вращения палка не соприкасается со сферой..

Другой проблемой этого метода является производительность. Если у вас есть большое количество высокоскоростных объектов с ПЗС в непосредственной близости, накладные расходы ПЗС быстро возрастают из-за дополнительного сканирования, а физический движокСистема, моделирующая аспекты физических систем, чтобы объекты могли правильно ускоряться и подвергаться воздействию столкновений, гравитации и других сил. Подробнее
См. Словарь
должен выполнить больше подшагов CCD.

Спекулятивная ПЗС

Спекулятивная ПЗС-матрица работает путем увеличения минимального ограничивающего прямоугольника объекта, выровненного по широкой фазе (AABB), на основе линейного и углового движения объекта. Алгоритм является спекулятивным, поскольку он выбирает все потенциальные контакты на следующем физическом шаге. Затем все контакты передаются в решатель, который обеспечивает выполнение всех ограничений контактов, чтобы объект не туннелировал через какое-либо столкновение.

На следующей диаграмме показано, как сфера, движущаяся из t0, могла бы занять ожидаемое положение в t1, если бы на ее пути не было стен. Раздувая AABB его целевой позицией, спекулятивный алгоритм выбирает два контакта с нормалями n1 и n2. Затем алгоритм говорит решателю учитывать эти контакты, чтобы сфера не туннелировала сквозь стены.

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

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

Тонкий джойстик GameObject с включенным Speculative CCD. При быстром вращении вокруг точки вращения палка соприкасается со сферой, и происходит столкновение..
Тонкий джойстик GameObject с включенным Speculative CCD. При быстром вращении вокруг точки вращения палка соприкасается со сферой, и происходит столкновение..

Однако умозрительная ПЗС-матрица может вызвать фантомное столкновение, когда на движение объекта влияет предполагаемая точка контакта, хотя этого быть не должно. Это связано с тем, что спекулятивная ПЗС собирает все потенциальные контакты на основе алгоритма ближайшей точки, поэтому нормаль контакта менее точна. Это часто может привести к тому, что высокоскоростные объекты будут скользить по мозаичным объектам столкновения и подпрыгивать вверх, хотя они не должны этого делать. Например, на следующей диаграмме сфера начинается в точке t0 и движется горизонтально вправо, занимая после интегрирования прогнозируемое положение в точке t1. Раздутый AABB перекрывает блоки b0 и b1, а ПЗС дает два предполагаемых контакта в c0 и c1. Поскольку спекулятивная ПЗС генерирует контакты с использованием алгоритма ближайшей точки, c0 имеет очень наклонную нормаль, которая кажется рампой для решателя.

Решатель предполагает, что точка контакта в точке c0 является рампой, поскольку алгоритм ближайшей точки сгенерировал неточную нормаль контакта.
Решатель предполагает, что точка контакта в точке c0 является рампой, поскольку алгоритм ближайшей точки сгенерировал неточную нормаль контакта.

Такая наклонная нормаль заставляет t1 прыгать вверх после интегрирования, а не двигаться прямо вперед:

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

Спекулятивные ПЗС также могут вызывать туннелирование, поскольку спекулятивные контакты вычисляются только на этапе обнаружения столкновений. Во время контактного решения, если объект получает слишком много энергии от решателя, он может оказаться за пределами исходного завышенного AABB после интегрирования. Если есть столкновения сразу за пределами AABB, объект будет туннелировать правильно.

Например, на следующей диаграмме показано, что сфера движется влево от t0, а палочка вращается по часовой стрелке. Если сфера получает слишком много энергии от удара, она может покинуть надутый AABB (прямоугольник с красными точками) в момент t1. Если есть столкновения сразу за пределами AABB, как показано синей рамкой ниже, сфера может закончить тем, что туннелирует прямо через него. Это связано с тем, что решатель вычисляет только контакты внутри раздутого AABB, а обнаружение столкновений не выполняется на этапе решения и интегрирования.

Сфера с раздутым AABB с использованием спекулятивной ПЗС, которая вычисляет контакты только на этапе обнаружения столкновений, поэтому может произойти туннелирование.
Сфера с раздутым AABB с использованием спекулятивной ПЗС, которая вычисляет контакты только на этапе обнаружения столкновений, поэтому может произойти туннелирование.

  • Спекулятивное обнаружение столкновений добавлено в 2018.3
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3