Обнаружение направления столкновения
Квадратная плитка сталкивается с другой квадратной плиткой. Бармен говорит...
У меня есть:
- Высота, ширина, 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 перпендикулярны, любое другое значение будет находиться между
или любые другие трюки с векторной алгеброй о том, как вы хотите определить/определить свое столкновение!