Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Unity2D continuous collision detection

Unity2D continuous collision detection

'ALEX'Постоялецwww28 мар. 201620:11#0
Насколько этот режим проверки столкновений в rigidbody2D  затратнее по сравнению с Discrete? В Discrete режиме движущиеся тела практически всегда пересекаются друг с другом при столкновении. Переключение в Continuous решает эту проблему, но я думаю, если у всех движущихся тел будет установлен подобный режим, и их будет достаточно много (несколько десятков), скажется ли это на производительности.

Хотелось бы понять по каким алгоритмам происходит проверка столкновений в обоих режимах.

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

Про непрерывный: Столкновение регистрируется, если коллайдер объекта должен столкнуться с другим коллайдером между обновлениями физических расчётов.
Вот тут не очень понятно. Т.е. он проверяет на пересечение других коллайдеров как в текущем кадре, так и в следующем? Получается он в 2 раза затратнее дискретного?


И еще один вопрос, не совсем к этому относящийся. Хочу получить абсолютно упругое столкновение. Сталкиваются объект с Rigidbody2D (CircleCollider) c объектом без Rigidbody с BoxCoolider. На объекте-круге есть физ. материал с bounciness = 1 и friction = 0. Но столкновение не абсолютно упругое, а какое-то супер-упругое, в общем круг начинает разгоняться после столкновений. Это если режим столкновений - Discrete, при Continuous почти то что надо, но все равно есть разброс, то чуть больше, то чуть меньше. Таков физ. движок и с этим ничего не сделать или можно как-нибудь настроить, чтоб все точно работало?

Буду очень признателен за любые пояснения.

RadianTORПостоялецwww28 мар. 201621:03#1
'ALEX'
> Таков физ. движок и с этим ничего не сделать или можно как-нибудь настроить,
> чтоб все точно работало?
Чтоб точно работало настроить без костылей врятли удастся, таков уж физдвиг. Ты же сам понимаешь что это игровая физика, где используют упрощения и хаки в угоду производительности.
Приблизительно настроить возможно удастся.
DelfigamerПостоялецwww28 мар. 201621:36#2
'ALEX'
> Про непрерывный: Столкновение регистрируется, если коллайдер объекта должен
> столкнуться с другим коллайдером между обновлениями физических расчётов.
> Вот тут не очень понятно. Т.е. он проверяет на пересечение других коллайдеров
> как в текущем кадре, так и в следующем? Получается он в 2 раза затратнее
> дискретного?
Нет.
Есть такая штука, называется, ЕМНИП, "проблема пули и бумаги".
Есть стена толщиной 1см. Есть пуля длиной 1см, которая летит со скоростью 100м/с. При частоте физдвижка 100Гц получается, что за один такт пуля пролетает 100см. Поэтому может возникнуть такая ситуация, что на одном такте пуля висит в 30см справа от стенки, на следующем - в 70см слева, а поскольку ни на одном из тактом пуля не пересекает стену, то и коллизия между ними не регистрируется - пуля пролетает сквозь стену.
Чтобы такого не происходило, пуля рассчитывается немного по-другому. Каждый такт для пули строится специальный коллайдер, который, образно говоря, представляет собой штырь длиной 100см, с одним концом на прошлой позиции пули, с другим концом - на её текущей позиции и с соответствующим сечением, в котором учитывается как толщина пули, так и её поворот относительно перемещения - если пуля летит боком, то и штырь будет прямоугольным.
Разумеется, каждый такт нужно будет строить новый коллайдер, поэтому такую технику применяют только там, где она оправдана, а именно - тела с большой скоростью и малыми размерами. Например, снаряды.
seamanПостоялецwww28 мар. 201622:36#3
Ну он работает не совсем так.
stencyl
Но близко. Делается как бы SphereCast из предыдущего положения в текущее.
Вообще когда я как то пробовал, правда в 3D, у меня и continuous collision detection на 100% не помогал. Я вручную бросал вперед по движению рейкаст на расстояние в зависимости от скорости. Тогда столкновение регистрировалась на 100%/
'ALEX'Постоялецwww29 мар. 20165:12#4
Delfigamer
> Разумеется, каждый такт нужно будет строить новый коллайдер, поэтому такую
> технику применяют только там, где она оправдана, а именно - тела с большой
> скоростью и малыми размерами. Например, снаряды.

А как тогда можно избежать пересечения спрайтов, если не использовать continuous? У меня проблема не в том, что не регистрируются столкновения, а то что спрайты накладываются друг на друга при столкновении.

Изображение

Т.е. при Discrete ситуация практически при каждом столкновении при падающем круге как на рис. 2. Там к этому рисунку такой комментарий: "In the physics engine, collisions are detected every step at the point where the object moves to. If the object moves into another object or a tile (as illustrated by the purple area in the image), then the physics engine pushes it back to where the collision happened initially." Такое ощущение, что то ли в box2D не реализовано этого выталкивания объекта до точки начального столкновения, то ли в юнити это отключено.

Delfigamer
> Каждый такт для пули строится специальный коллайдер, который, образно говоря,
> представляет собой штырь длиной 100см, с одним концом на прошлой позиции пули,
> с другим концом - на её текущей позиции и с соответствующим сечением, в котором
> учитывается как толщина пули, так и её поворот относительно перемещения - если
> пуля летит боком, то и штырь будет прямоугольным.
А разве построение этого коллайдера такая затратная операция? Можно примерно оценить, во сколько раз Continuous режим затратнее Discrete?

COPOKAПостоялецwww10 янв. 201823:23#5
Тема актуальна. Up
TokarnПостоялецwww11 янв. 20185:49#6
Допустим Fixed delta time в настройках времени уменьши в двое (кстати на все скрипты, использующие Delta Time повлияет, а так же ощутимо прибавится гравитация, т.к. её расчет тоже от делта тайм зависит).
Да, будет в двое затратнее, но по мне так, стандартные настройки под какие-то слишком простые игры в плане физики.

Правка: 11 янв. 2018 5:52

/ Форум / Программирование игр / Физика

2001—2018 © GameDev.ru — Разработка игр