Войти
ПрограммированиеФорумФизика

Резолвинг столкновений

#0
14:25, 9 авг. 2019

Пишу простой физдвижок и есть пара вопросов.

1. Какие подходы вы используете для этого дела? Есть какой-то отдельный класс-резолвер или каждый объект имеет внутри код, обрабатывающий это дело для него?

2. Два врага движутся по прямой в сторону игрока. В какой-то момент они сталкиваются и их спрайты сливаются в один. Я хочу, чтобы они продолжали двигаться бок о бок по новой траектории. Как это реализовать?


#1
14:48, 9 авг. 2019

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

#2
22:00, 9 авг. 2019

Robotex
> 1. Какие подходы вы используете для этого дела? Есть какой-то отдельный
> класс-резолвер или каждый объект имеет внутри код, обрабатывающий это дело для
> него?

Использую Task based систему, например class GravitationTask обрабатывает игровые объекты на предмет воздействия на них гравитации.

Robotex
> 2. Два врага движутся по прямой в сторону игрока. В какой-то момент они
> сталкиваются и их спрайты сливаются в один. Я хочу, чтобы они продолжали
> двигаться бок о бок по новой траектории. Как это реализовать?

Здесь сначала collision detection, а потом уже DispatchCollisionTask который смотрит какие типы объектов столкнулись и какой Task создавать для обработки этой ситуации.

#3
(Правка: 17:31) 17:25, 10 авг. 2019

gamedevfor
> какой Task создавать для обработки этой ситуации
А как бы ты обработал эту ситуацию? Вопрос именно в этом. Два объекта столкнулись, мы это зафиксировали и должны поменять равномерное движение, указанное вектором скорости-направления на что-то более сложное. Но вот на что?

Развести объекты на расстояние суммы радиусов?


P.S. Я подумываю об EventQueue для обработки коллизий

#4
23:10, 10 авг. 2019

Robotex
> 2. Два врага движутся по прямой в сторону игрока. В какой-то момент они
> сталкиваются и их спрайты сливаются в один. Я хочу, чтобы они продолжали
> двигаться бок о бок по новой траектории. Как это реализовать?
>

Обычно, физический движок (а не программист!!!) сам решает, как при коллизиях разлетаются объекты.
А то что ты хочешь (как я понял) - это не совсем физика коллизий а некий кинематический скрипт?

И в чём конкретная проблема? Если столкновение умеешь определять, как только оно произошло, обоим объектам задаешь взамен их
прежних, новый одинаковый (сонаправленный) вектор скорости. Они и полетят "бок о бок" в одном направлении.

#5
23:22, 10 авг. 2019

Robotex
> Но вот на что?
Зависит от логики игры, от типов объектов которые столкнулись, может быть от столкновения один из объектов должен взорваться и второй объект отлетит с ускорением из-за воздействия на него ударной волны. В общем универсального ответа здесь нету и быть не может.

Robotex
> Я подумываю об EventQueue для обработки коллизий
В чем плюс такого подхода?

#6
12:08, 13 авг. 2019

rcsim
> это не совсем физика коллизий а некий кинематический скрипт?
да там примитивизм: игрок в центре и враги летят на него по прямой со всех сторон. Нужно обрабатывать столкновение врагов (чтобы спрайты не накладывались), столкновение врага со снарядом (тоже по прямой летит) и врага с игроком


gamedevfor
> может быть от столкновения один из объектов должен взорваться
Ну, должна быть анимация уничтожения и освобождение объекта в пулле

gamedevfor
> В чем плюс такого подхода?
Чтобы физический движок мог коммуницировать с пуллом объектов. Ну и плюс управление тоже сюда привязать. Хотя можно и обсервером примитивным сделать

#7
12:09, 13 авг. 2019

А тут же еще возможна ситуация, когда снаряд туннелирует сквозь врага :(

#8
12:37, 13 авг. 2019

Robotex
Тоесть у тебя она только "возможна"? Ну окей... 1 проблему физдвижка из 1000 ты уже заметил.

#9
12:47, 13 авг. 2019

lookid
> 1 проблему физдвижка из 1000 ты уже заметил
А как эта проблема фиксится?

#10
23:32, 13 авг. 2019

Robotex
>туннелирует сквозь врага

Гугли continuous collision detection

#11
14:13, 30 авг. 2019

Ок, движок может определять столкновение двух многоугольников. Теперь нужно применить к каждому объекту силу, чтобы они изменили свои траекторию и скорость. И как посчитать направление и величину сил для каждого объекта?

Объект представлен двумя координатами положения, вектором ориентации, массой, векторами скорости и результирующей силы, действующей на тело (используется для вычисления ускорения).

А как заставить объект ещё и правильно вращаться после удара?

#12
14:43, 30 авг. 2019

Ну ок, допустим, через массу и скорость можно посчитать импульсы и найти новые скорости. Но ведь нужен еще и угол отражения. Т.е. придется найти точку касания. Какие есть подходы для этого?

#13
15:00, 30 авг. 2019

https://gamedev.ru/community/gd_physcomm/articles/phys_engine_development
https://gamedev.ru/code/articles/?id=4706

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