У меня есть простая игра, в которой игрок перемещает мяч. Мяч отскакивает от стен. Прямо сейчас у меня реализованы квадратные стены (■): я использую простые столкновения ограничивающих рамок, чтобы проверить, будет ли игрок двигаться в стену при обновлении скорости x или y, и если это так, я умножу эту скорость на -1, чтобы они отскочили ,
Тем не менее, я также хочу реализовать треугольные фигуры (◢◣◤◥). Чтобы прийти в норму, я считаю, что можно просто использовать:
newxspeed = -1*yspeed;
newyspeed = -1*xspeed;
Однако, с чем я сталкиваюсь, так это с обнаружением столкновения: когда игрок попадает на диагональ?
Ответы:
Прежде всего, чтобы рассчитать обнаружение столкновения между сферой (круг в 2D) и линией, вам нужно вычислить перпендикулярный вектор между центром движущегося шара и линией, чтобы вычислить это расстояние, вам нужно сделать следующее:
Таким образом, чтобы вычислить d на рисунке выше, нам нужно сделать несколько шагов.
Затем вы расширяете уравнение, чтобы получить следующее: оно кажется немного сложным, но на самом деле это не так.
Где Q - центр круга, а S - любая точка на линии. Когда расстояние меньше радиуса круга / сферы, вам нужно вызвать реакцию на столкновение, что объясняется в следующей точке.
Неправильно всегда переворачивать компонент x или y, чтобы отскочить от мяча, вам нужно отразить вектор скорости, для этого вам нужно рассчитать вектор нормали поверхности и использовать эту нормаль для расчета отражения вектор с использованием следующего уравнения
где R - вектор отражения, N - нормаль поверхности, а V - вектор скорости.
В случае 45 градусов нормаль к поверхности будет равна N = (1,1,0) с изменяющимся знаком, в зависимости от того, в каком направлении расположены грани (положение или отрицание).
источник
Вы хотите измерить расстояние между центром мяча и стеной, поэтому:
решение системы, которую вы видите на рисунке, даст вам координаты точки d.
Тогда, если расстояние между точкой d и c меньше или равно радиусу шара r, происходит столкновение шара и стенки
источник
Шары на самом деле довольно простые объекты для обнаружения столкновений. Они сталкиваются с местностью, когда расстояние между центром шара и краем местности становится меньше радиуса шара. Положение центра мяча должно быть тривиальным для получения. Поиск ближайшей точки местности обычно сложнее, и лучший способ сделать это зависит от того, как местность представлена.
Ваш алгоритм расчета новой скорости после отскока от диагонального наклона неверен. Обращение координат x и y приведет к тому, что мяч вернется в том же направлении, к которому он приближался к склону. Это хорошо, если мяч попадает на местность под прямым углом, но не подходит для других углов. Вы захотите отрицать только компонент, нормальный к поверхности, например, отскакивая от потолка, вы отрицаете y, а не x.
источник