Обнаружение направления столкновения

Квадратная плитка сталкивается с другой квадратной плиткой. Бармен говорит...

У меня есть:

  • Высота, ширина, x и y обеих плиток.
  • Двумерный вектор движения, вызвавшего столкновение.

Мне нужно знать, из какой SIDE произошло столкновение (например, сверху, снизу, слева, справа), чтобы reset местоположение соответствовало.

Я дам мысленный cookie тому, кто может ответить на этот вопрос, потому что я пробовал слишком много часов, и это кажется фундаментальным.

Ответы

Ответ 1

float player_bottom = player.get_y() + player.get_height();
float tiles_bottom = tiles.get_y() + tiles.get_height();
float player_right = player.get_x() + player.get_width();
float tiles_right = tiles.get_x() + tiles.get_width();

float b_collision = tiles_bottom - player.get_y();
float t_collision = player_bottom - tiles.get_y();
float l_collision = player_right - tiles.get_x();
float r_collision = tiles_right - player.get_x();

if (t_collision < b_collision && t_collision < l_collision && t_collision < r_collision )
{                           
//Top collision
}
if (b_collision < t_collision && b_collision < l_collision && b_collision < r_collision)                        
{
//bottom collision
}
if (l_collision < r_collision && l_collision < t_collision && l_collision < b_collision)
{
//Left collision
}
if (r_collision < l_collision && r_collision < t_collision && r_collision < b_collision )
{
//Right collision
}

Это не решает, когда объект находится внутри одного из другого. Но он работает с перекрытием

Ответ 2

Учитывая, что r1 и r2 (r2 являются стационарными), сначала найдите ближайший угол от r2 до r1. Эта точка (c1.x, c1.y) и представьте теперь, что вы распространите это на две плоскости, одну параллельно оси x и одну на y.

Теперь найдите ближайший угол от r1 до r2 (назовите его c2) и используйте его в следующей формуле: y = mx + b где b - c2.x и т - ваш вектор. и x - c1.x

Итак, если y больше, чем c1.y, то это означает, что в точке x contact (width) вы уже попали в верхнюю часть. Если это меньше, то вы еще не ударили. Инвертировать нижний/верхний.

Ответ 3

Предполагая, что у вас есть способ обнаружить столкновения, понимание того, какие стороны столкнулись, прямолинейно. Вам просто нужно изучить позиции x и y каждого квадрата.

Квадрат1: (x1, y1)
Square2: (x2, y2)

Я буду работать из предположения, что верхний левый угол вашей рабочей области (0,0) и что значения x увеличиваются по мере продвижения вправо, а значения y возрастают при движении вниз.

С учетом этого:

Если (x1 < x2), правая часть квадрата 1 столкнулась с левой стороной квадрата 2
Если (x1 > x2), левая часть квадрата 1 столкнулась с правой стороной квадрата 2
если (y1 < y2), нижняя сторона квадрата 1 столкнулась с верхней стороной квадрата 2
если (y1 > y2), верхняя сторона квадрата 1 столкнулась с нижней стороной квадрата 2

Я предлагаю вам нарисовать себе несколько фотографий, и это должно стать ясным для вас.

Ответ 4

вам нужно смоделировать свой квадрат, чтобы захватить ориентацию тоже, просто с (x, y, height) квадрата, ориентация я означает, будет ли это в первом, втором, третьем четвертом квадранте, путем моделирования всех четырех углов вершины квадрата.

то вам нужно определить, все четыре вектора, которые делают этот квадрат

найдите косинус между 2D-вектором, который у вас есть с каждой стороны квадрата например, если косинус данной стороны и 2D-вектор равен 1, то оба они ортогональны или 0 перпендикулярны, любое другое значение будет находиться между

или любые другие трюки с векторной алгеброй о том, как вы хотите определить/определить свое столкновение!