Обнаружение столкновения движущегося объекта с неподвижным

Прежде всего, мой вопрос на самом деле не относится к C # или XNA, но в моих примерах кода они будут использоваться.

В настоящее время я пытаюсь создать клон Pong, и у меня возникла проблема с обнаружением столкновений.

Каждый объект в основном имеет определенную скорость (которая является Vector2), Position (Vector2, также) и Speed ​​(просто поплавок). При каждом вызове объекта Update () позиция изменяется следующим образом:

Velocity.Normalize();
Position += Velocity * Speed;

Сначала я только проверил, было ли в настоящее время столкновение между двумя объектами, с помощью простого вызова Intersects () из прямоугольников объектов. Я быстро понял, что не могу только проверить, в данный момент сталкивается ли объект с другим, а скорее, если объект столкнулся с объектом на своем пути. Только проверка того, сталкиваются ли в данный момент два объекта, заставляла мяч проходить через ракетку, когда скорость была слишком высокой.

Я пробовал разные способы решения проблемы, но, похоже, ни один из них не помог. Мне нужен только способ проверить, столкнулись ли два объекта на своем пути, и если они столкнулись, было ли это горизонтально, вертикально или обоими (чтобы соответственно изменить скорость мяча).

Мне не обязательно сразу нужно решение, может быть, это просто основная идея того, как это реализовать, и я сам запрограммирую.

Спасибо за ваше время.


person Jesse Emond    schedule 07.07.2010    source источник


Ответы (5)


Теорема о разделении осей - ваш друг :)

http://www.codeproject.com/KB/GDI-plus/PolygonCollision.aspx

person FallenAvatar    schedule 07.07.2010


Думаю, эта ссылка: http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php может быть тем, что вы ищете. Он описывает тест развертки сфера-плоскость, полезный, когда у вас есть быстро движущиеся объекты, которые могут проходить через плоскость с интервалом в один кадр.

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

person awshepard    schedule 07.07.2010

У вас проблема с тем фактом, что, если один объект слишком быстрый, он может пройти неподвижный объект до того, как Update() будет вызван с обнаружением (как будто он проходит через неподвижный объект).

Расширьте форму объекта вдоль вектора движения с размером скорости: Квадрат [0,0][2,2] со скоростью [1,0] и скоростью 10 создаст форму прямоугольника [0,0][12,2] => теперь он расположен в координатах [0,0] с размером [12,2].

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

person Jaroslav Jandek    schedule 07.07.2010
comment
это умное решение, которое должно было получить больше любви - person NappingRabbit; 07.08.2018

Если два точечных объекта имеют одинаковое положение, они столкнулись.

person mcandre    schedule 07.07.2010
comment
Я не думаю, что это так просто. Очень мало графики имеют размер всего в одну точку. - person Christopher B. Adkins; 07.07.2010
comment
Если два круговых объекта находятся в пределах суммы своих радиусов, то они столкнулись. - person mcandre; 07.07.2010
comment
Я действительно ищу решение, если два объекта с определенной шириной и высотой столкнулись во время их вызова Update (). - person Jesse Emond; 08.07.2010
comment
Представьте, что у вас есть стена шириной 2 единицы и шар диаметром 1 единицу. Если мяч, скажем, находится на расстоянии 2 единиц от стены и движется со скоростью 6 единиц за кадр, в следующем обновлении ни его начальная, ни конечная позиции не сталкиваются со стеной, но столкновение действительно произошло. путь через движение мячей. Это то, о чем спрашивает XGhost27X. - person FallenAvatar; 08.07.2010
comment
сравнение каждого пикселя похоже на кучу дополнительных накладных расходов - person NappingRabbit; 07.08.2018