Как рассчитать угол отскока
Перейти к содержимому

Как рассчитать угол отскока

Как рассчитать угол отскока?

Я немного поигрался с этим, но просто не могу понять.

Я сделал танк, который стреляет ракетами, и когда ракеты попадают в стены, я хочу, чтобы они отскакивали, но я хочу, чтобы они отскакивали под прямым углом.

Прямо сейчас у меня нет никаких препятствий, ракеты просто отскакивают, когда они выходят за пределы того, что viewportRectangle я сделал.

Является ли решение, которое я ищу, достаточно продвинутым?

Есть ли относительно простой способ сделать это?

Я думаю, что более простой способ сделать это — использовать скорость ракеты вместо вычисления углов. Допустим, у вас есть ракета, у которой есть xVelocity и, yVelocity чтобы представить ее движение по горизонтали и вертикали. Эти скорости могут быть положительными или отрицательными для представления влево, вправо, вверх или вниз.

  • Если ракета попадает в верхнюю или нижнюю границу, поменять местами знак yVelocity .
  • Если ракета попадает в левую или правую границу, поменять местами знак xVelocity .

Это сохранит движение по противоположной оси таким же.

Заимствуя изображение из ответа ChrisF , предположим, что ракета запускается в позиции I.

Угол отражения

С xVelocity и yVelocity как быть положительным (в 2D — графике вправо и вниз , как правило , положительный) ракета будет двигаться в указанном направлении. Давайте просто присвоим значения

Когда ракета попадает в стену в позиции C , она xVelocity не должна измениться, но ее yVelocity следует изменить на -4, чтобы она летела обратно вверх, но продолжала лететь вправо.

Преимущество этого метода заключается в том , что вам нужно только следить за ракетой — х xPosition , yPosition , xVelocity , и yVelocity . Используя только эти четыре компонента и частоту обновления вашей игры, ракета всегда будет перерисовываться в правильном положении. Как только вы столкнетесь с более сложными препятствиями, которые не находятся под прямым углом или движутся, будет намного легче работать со скоростями X и Y, чем с углами.

Вы можете подумать, что, поскольку ваши стены выровнены с осями координат, имеет смысл написать специальный код для случая (для вертикальной стены отрицайте координату x скорости; для горизонтальной стены отрицайте координату y скорости ). Однако, как только вы научитесь хорошо работать с вертикальными и горизонтальными стенами, вы, вероятно, подумаете следующее: «А как насчет стен под произвольными углами?» Так что об общем случае стоит задуматься с самого начала.

В общем случае предположим, что ваша ракета имеет скорость v и ударяется о стену с нормалью к поверхности n .

Ракета с вектором v собирается косо удариться о стену с нормалью к поверхности n.

Разделите v на компоненты u, перпендикулярные стене, и w, параллельные ей.

Прямоугольный треугольник с гипотенузой для v, короткая сторона u параллельна стене, а длинная сторона w параллельна стене.

u = ( v · n / n · n ) n
w = vu

Здесь v · n — скалярное произведение векторов v и n . См. Ссылку, чтобы узнать, как это вычислить. Скалярное произведение n · n оценивается как квадрат длины вектора нормали; если вы всегда сохраняете свои нормали в виде единичных векторов, тогда n · n = 1, и вы можете опустить деление.

После отскока на компонент движения, параллельный стенке, действует трение f , а на компонент, перпендикулярный стенке, действует упругость, которую можно задать в виде коэффициента восстановления r .

Таким образом, скорость после столкновения равна v ′ = f wr u . В a идеально упругое столкновение без трения v ′ = wu ; то есть движение отражается относительно нормали в точке столкновения, как на диаграмме, приведенной в ответе Билла.

Этот подход работает точно так же и в трех измерениях.

(Очевидно, что это очень упрощенное понятие отскока; оно не принимает во внимание угловой момент или деформацию. Но для многих видов видеоигр такого рода упрощение вполне подходит.)

Отскок мяча от стены: оформление задачи на ЕГЭ

Эта задача появлялась уже на моем сайте. Я предложила ее решение, которое казалось мне довольно простым. Ученики спросили, как оформить такую задачу на ЕГЭ, и этот вопрос заставил меня решить задачу заново, теперь уже с точки зрения оформления решения на экзамене.

Задача. Мальчик бросает мяч со скоростью $\upsilon=10$ м/с под углом в $45^<\circ>$ в сторону стены, стоя на расстоянии $l=4$ м от нее. На каком расстоянии от стены должен встать мальчик, чтобы поймать мяч? Удар мяча о стенку считать абсолютно упругим.

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

под углом к горизонту

Пунктир – траектория мяча при отсутствии стены

Вертикальная составляющая начальной скорости мяча:

Горизонтальная составляющая начальной скорости:

Время полета мяча до верхней точки найдем из условия равенства вертикальной составляющей скорости нулю:

$$\upsilon_y= \upsilon_-gt=\upsilon \sin<\alpha>-gt=0$$

$t$ – время полета мяча до наивысшей точки траектории (при условии отсутствия стенки).

Дальность полета мяча до верхней точки траектории:

Итак, мячик не долетел до верхней точки траектории, теперь можно изобразить стенку и траекторию полета мяча:

под углом к горизонту

Отскок мяча от стены

Теперь определим время полета мяча до стены.

$t_1$ – время полета мяча до стены.

Определим ординату точки, в которой мяч ударился о стенку:

Тогда, подставив время полета мяча до стены, получим:

После отскока мяча от стены его ордината будет изменяться по закону:

Здесь $\upsilon_$ – скорость по оси $y$, которую имел мячик на момент соприкосновения со стеной, $t_2$ – время полета мяча от стены до попадания мальчику в руки, то есть до момента, когда ордината мяча станет нулевой.

Вертикальная составляющая скорости мяча на момент подлета равна:

Подставим в выражение (2) координату (1) и скорость (3):

Мяч приземлится, когда $y_1=0$:

Из этого выражения можно найти время полета мяча от стенки до приземления:

Тогда расстояние, которое мяч пролетит по горизонтали после отскока от стены (напомню, что скорость мяча по горизонтали не изменилась по модулю, ведь удар был упругий), равно:

Осталось всего ничего: подставить числа.

Определим дискриминант численно:

Отрицательный корень нас не устраивает по смыслу задачи, следовательно, ответ 6 м.

Как рассчитать угол отскока?

Я немного поигрался с этим, но просто не могу понять.

Я сделал танк, который стреляет ракетами, и когда ракеты попадают в стены, я хочу, чтобы они отскакивали, но я хочу, чтобы они отскакивали под прямым углом.

Прямо сейчас у меня нет никаких препятствий, ракеты просто отскакивают, когда они выходят за пределы viewportRectangle Я сделал.

Является ли решение, которое я ищу, достаточно продвинутым?

Есть ли относительно простой способ сделать это?

задан 21 фев ’09, 12:02

Это проблема, решение которой, вероятно, станет очевидным, если вы пойдете поиграть в бильярд. — smartcaveman

10 ответы

Я думаю, что более простой способ сделать это — использовать скорость ракеты вместо вычисления углов. Скажем, у вас есть ракета с xVelocity и yVelocity для представления его движения по горизонтали и вертикали. Эти скорости могут быть положительными или отрицательными для представления влево, вправо, вверх или вниз.

  • Если ракета попадает в верхнюю или нижнюю границу, поменять местами знак yVelocity .
  • Если ракета попадает в левую или правую границу, поменять местами знак xVelocity .

Это сохранит движение по противоположной оси таким же.

Заимствование изображения из Ответ ChrisF, допустим, ракета стартует в позиции I.

Угол отражения

Для xVelocity и yVelocity оба положительные (в 2D-графике правая и нижняя стороны обычно положительны), ракета будет двигаться в указанном направлении. Давайте просто присвоим значения

Когда ракета попадает в стену на позиции C, Его xVelocity не должно измениться, но это yVelocity должен быть изменен на -4, чтобы он двигался обратно вверх, но продолжал двигаться вправо.

Преимущество этого метода в том, что вам нужно только отслеживать xPosition , yPosition , xVelocity и yVelocity . Используя только эти четыре компонента и частоту обновления вашей игры, ракета всегда будет перерисовываться в правильном положении. Как только вы столкнетесь с более сложными препятствиями, которые не находятся под прямым углом или движутся, будет намного легче работать со скоростями X и Y, чем с углами.

ответ дан 23 мая ’17, 13:05

Я использую угол наклона ракеты, чтобы она летела вперед. используя Math.Sin и Math.Cos. У меня были проблемы с пониманием другого способа, используя скорость, как в примере XNA с каноническими шарами. Так что все, что мне нужно изменить, это угол наклона ракеты, тогда она сама пойдет вперед. — Молде

Это работает только в том случае, если все ваши стены выровнены по осям координат, и даже тогда вам нужен отдельный корпус для вертикальных и горизонтальных стен. Наверное, в общем случае проще сделать это правильно. — Гарет Рис

Нет, это не так. В общем случае вам нужно выровнять свои векторы с помощью некоторой тригонометрии, чтобы стена стала горизонтальной или вертикальной для ваших расчетов, затем выполните этот расчет и конвертируйте его обратно. Это онил на 2-4 триггера больше, но не легче. — Карл

@Karl: Никакой тригонометрии не требуется! — Гарет Рис

Конечно, вы можете легко адаптировать это для работы с объектами под разными углами, которые неподвижны или движутся. Просто используйте скорости обоих объектов при столкновении, чтобы вычислить новые скорости каждого из них. — Билл Ящерица

Вы можете подумать, что, поскольку ваши стены выровнены с осями координат, имеет смысл написать специальный код для случая (для вертикальной стены отрицайте координату x скорости; для горизонтальной стены отрицайте координату y скорости ). Однако, как только вы научитесь хорошо работать с вертикальными и горизонтальными стенами, вы, вероятно, подумаете следующее: «А как насчет стен под произвольными углами?» Так что об общем случае стоит задуматься с самого начала.

В общем случае предположим, что ваша ракета имеет скорость v и ударяется о стену с нормальной поверхностью n.

Ракета с вектором v собирается косо удариться о стену с нормалью к поверхности n.

Трещина v на компоненты u перпендикулярно стене и w параллельно ему.

Прямоугольный треугольник с гипотенузой для v, короткая сторона u параллельна стене, а длинная сторона w параллельна стене.

u = (v · n / n · n) n
w = vu

Здесь, v · n это скалярное произведение векторов v и n. См. Ссылку для объяснения того, как это вычислить. Точечный продукт n · n вычисляется как квадрат длины вектора нормали; если вы всегда сохраняете свои нормали в виде единичные векторы становятся n · n = 1, и вы можете опустить деление.

После отскока на составляющую движения, параллельную стене, действует трение. f, а компонент, перпендикулярный стене, подвержен упругости, которую можно представить в виде коэффициент реституции r.

Таким образом, скорость после столкновения равна v ′ = f wr u. В идеально упругом столкновении без трения, v ′ = wu; то есть движение отражается относительно нормали в точке столкновения, как на диаграмме, приведенной в ответе Билла.

Этот подход работает точно так же и в трех измерениях.

(Очевидно, это очень упрощенное понятие подпрыгивания; оно не принимает во внимание угловой момент или деформацию. Но для многих видов видеоигр такого рода упрощение совершенно адекватно.)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *