Шарик против 45-градусного обнаружения наклона склона


8

У меня есть простая игра, в которой игрок перемещает мяч. Мяч отскакивает от стен. Прямо сейчас у меня реализованы квадратные стены (■): я использую простые столкновения ограничивающих рамок, чтобы проверить, будет ли игрок двигаться в стену при обновлении скорости x или y, и если это так, я умножу эту скорость на -1, чтобы они отскочили ,

Тем не менее, я также хочу реализовать треугольные фигуры (◢◣◤◥). Чтобы прийти в норму, я считаю, что можно просто использовать:

   newxspeed = -1*yspeed;
   newyspeed = -1*xspeed;

Однако, с чем я сталкиваюсь, так это с обнаружением столкновения: когда игрок попадает на диагональ?


2
Я настоятельно рекомендую учебник N ( часть 1 , часть 2 ) по этой теме.
Крис Бёрт-Браун

Большое спасибо. Этот урок фактически помог мне наконец понять, как решить эту проблему.
Qqwy

На самом деле мне очень трудно пометить один из ответов как «решение», поскольку все они помогли мне понять проблему, но ни один из них полностью не решил ее. Что мне делать?
Qqwy

Ответы:


8

Прежде всего, чтобы рассчитать обнаружение столкновения между сферой (круг в 2D) и линией, вам нужно вычислить перпендикулярный вектор между центром движущегося шара и линией, чтобы вычислить это расстояние, вам нужно сделать следующее:

введите описание изображения здесь

Таким образом, чтобы вычислить d на рисунке выше, нам нужно сделать несколько шагов.

  1. Предположим, что ваша линия использует параметрическое уравнение P (t) = S + t V. Обратите внимание, что V - это направление линии, которое можно получить вычитанием (P2 - P1).
  2. Из Пифагора:

d ^ 2 = len ( Q - S ) ^ 2 - len (proj ( Q - S )) ^ 2

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

d = sqrt (len ( Q - S ) ^ 2 - len (( Q - S ) точка V ) ^ 2 / V ^ 2)

Где Q - центр круга, а S - любая точка на линии. Когда расстояние меньше радиуса круга / сферы, вам нужно вызвать реакцию на столкновение, что объясняется в следующей точке.

Неправильно всегда переворачивать компонент x или y, чтобы отскочить от мяча, вам нужно отразить вектор скорости, для этого вам нужно рассчитать вектор нормали поверхности и использовать эту нормаль для расчета отражения вектор с использованием следующего уравнения

R = 2 * ( V точка N ) * N - V

где R - вектор отражения, N - нормаль поверхности, а V - вектор скорости.

В случае 45 градусов нормаль к поверхности будет равна N = (1,1,0) с изменяющимся знаком, в зависимости от того, в каком направлении расположены грани (положение или отрицание).


Вы используете великое уравнение. Тем не менее, это очень трудно для тех, кто плохо знаком с векторами. Было бы полезно, если бы вы разбили свое уравнение на более мелкие шаги.
Qqwy

Кстати, это 2-мерный или 3-мерный вектор? Откуда берется третье значение (0)?
Qqwy

Я использовал 3D-векторы, потому что я предполагал, что вы используете 3D-API (и я могу ошибаться), если это правда, вам нужно установить третий компонент равным 0, но в любом случае уравнения должны работать как для 2D, так и для 3D (и, возможно, выше размеры, но это не имеет значения). Что касается уравнений, я могу объяснить больше, но мне нужно время, чтобы отредактировать ответ.
concept3d

1
Я отредактировал ответ. Надеюсь, теперь это имеет больше смысла. Кстати, я надеюсь, что stackexchange может предоставить удобный способ написания математических формул, потому что сейчас это чревато ошибками.
concept3d

6

Вы хотите измерить расстояние между центром мяча и стеной, поэтому:

введите описание изображения здесь

решение системы, которую вы видите на рисунке, даст вам координаты точки d.

Тогда, если расстояние между точкой d и c меньше или равно радиусу шара r, происходит столкновение шара и стенки


5

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

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


Хотя этот ответ не имеет прямого отношения к проблеме, +1 за то, что рассказал мне о том, как следует разрешать столкновения в этом случае.
Qqwy
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.