Как рассчитать угол отскока?
Я немного поигрался с этим, но просто не могу понять.
Я сделал танк, который стреляет ракетами, и когда ракеты попадают в стены, я хочу, чтобы они отскакивали, но я хочу, чтобы они отскакивали под прямым углом.
Прямо сейчас у меня нет никаких препятствий, ракеты просто отскакивают, когда они выходят за пределы того, что viewportRectangle я сделал.
Является ли решение, которое я ищу, достаточно продвинутым?
Есть ли относительно простой способ сделать это?

Я думаю, что более простой способ сделать это — использовать скорость ракеты вместо вычисления углов. Допустим, у вас есть ракета, у которой есть xVelocity и, yVelocity чтобы представить ее движение по горизонтали и вертикали. Эти скорости могут быть положительными или отрицательными для представления влево, вправо, вверх или вниз.
- Если ракета попадает в верхнюю или нижнюю границу, поменять местами знак yVelocity .
- Если ракета попадает в левую или правую границу, поменять местами знак xVelocity .
Это сохранит движение по противоположной оси таким же.
Заимствуя изображение из ответа ChrisF , предположим, что ракета запускается в позиции I.
.png)
С xVelocity и yVelocity как быть положительным (в 2D — графике вправо и вниз , как правило , положительный) ракета будет двигаться в указанном направлении. Давайте просто присвоим значения
Когда ракета попадает в стену в позиции C , она xVelocity не должна измениться, но ее yVelocity следует изменить на -4, чтобы она летела обратно вверх, но продолжала лететь вправо.
Преимущество этого метода заключается в том , что вам нужно только следить за ракетой — х xPosition , yPosition , xVelocity , и yVelocity . Используя только эти четыре компонента и частоту обновления вашей игры, ракета всегда будет перерисовываться в правильном положении. Как только вы столкнетесь с более сложными препятствиями, которые не находятся под прямым углом или движутся, будет намного легче работать со скоростями X и Y, чем с углами.
Вы можете подумать, что, поскольку ваши стены выровнены с осями координат, имеет смысл написать специальный код для случая (для вертикальной стены отрицайте координату x скорости; для горизонтальной стены отрицайте координату y скорости ). Однако, как только вы научитесь хорошо работать с вертикальными и горизонтальными стенами, вы, вероятно, подумаете следующее: «А как насчет стен под произвольными углами?» Так что об общем случае стоит задуматься с самого начала.
В общем случае предположим, что ваша ракета имеет скорость v и ударяется о стену с нормалью к поверхности n .

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

u = ( v · n / n · n ) n
w = v — u
Здесь v · n — скалярное произведение векторов v и n . См. Ссылку, чтобы узнать, как это вычислить. Скалярное произведение n · n оценивается как квадрат длины вектора нормали; если вы всегда сохраняете свои нормали в виде единичных векторов, тогда n · n = 1, и вы можете опустить деление.
После отскока на компонент движения, параллельный стенке, действует трение f , а на компонент, перпендикулярный стенке, действует упругость, которую можно задать в виде коэффициента восстановления r .
Таким образом, скорость после столкновения равна v ′ = f w — r u . В a идеально упругое столкновение без трения v ′ = w — u ; то есть движение отражается относительно нормали в точке столкновения, как на диаграмме, приведенной в ответе Билла.
Этот подход работает точно так же и в трех измерениях.
(Очевидно, что это очень упрощенное понятие отскока; оно не принимает во внимание угловой момент или деформацию. Но для многих видов видеоигр такого рода упрощение вполне подходит.)
Отскок мяча от стены: оформление задачи на ЕГЭ
Эта задача появлялась уже на моем сайте. Я предложила ее решение, которое казалось мне довольно простым. Ученики спросили, как оформить такую задачу на ЕГЭ, и этот вопрос заставил меня решить задачу заново, теперь уже с точки зрения оформления решения на экзамене.
Задача. Мальчик бросает мяч со скоростью $\upsilon=10$ м/с под углом в $45^<\circ>$ в сторону стены, стоя на расстоянии $l=4$ м от нее. На каком расстоянии от стены должен встать мальчик, чтобы поймать мяч? Удар мяча о стенку считать абсолютно упругим.
Сначала выясним, в каком месте траектории находился мяч, когда ударился о стенку: был ли он на первой ее половине, или же он уже прошел точку максимального подъема? От этого зависит угол, под которым мяч подлетел к стенке, а раз удар абсолютно упругий, значит, мячик и отскочил под этим же углом. Поэтому сначала найдем середину траектории мяча, как если бы стенки не было.

Пунктир – траектория мяча при отсутствии стены
Вертикальная составляющая начальной скорости мяча:
Горизонтальная составляющая начальной скорости:
Время полета мяча до верхней точки найдем из условия равенства вертикальной составляющей скорости нулю:
$$\upsilon_y= \upsilon_
$t$ – время полета мяча до наивысшей точки траектории (при условии отсутствия стенки).
Дальность полета мяча до верхней точки траектории:
Итак, мячик не долетел до верхней точки траектории, теперь можно изобразить стенку и траекторию полета мяча:

Отскок мяча от стены
Теперь определим время полета мяча до стены.
$t_1$ – время полета мяча до стены.
Определим ординату точки, в которой мяч ударился о стенку:
Тогда, подставив время полета мяча до стены, получим:
После отскока мяча от стены его ордината будет изменяться по закону:
Здесь $\upsilon_
Вертикальная составляющая скорости мяча на момент подлета равна:
Подставим в выражение (2) координату (1) и скорость (3):
Мяч приземлится, когда $y_1=0$:
Из этого выражения можно найти время полета мяча от стенки до приземления:
Тогда расстояние, которое мяч пролетит по горизонтали после отскока от стены (напомню, что скорость мяча по горизонтали не изменилась по модулю, ведь удар был упругий), равно:
Осталось всего ничего: подставить числа.
Определим дискриминант численно:
Отрицательный корень нас не устраивает по смыслу задачи, следовательно, ответ 6 м.
Как рассчитать угол отскока?
Я немного поигрался с этим, но просто не могу понять.
Я сделал танк, который стреляет ракетами, и когда ракеты попадают в стены, я хочу, чтобы они отскакивали, но я хочу, чтобы они отскакивали под прямым углом.
Прямо сейчас у меня нет никаких препятствий, ракеты просто отскакивают, когда они выходят за пределы viewportRectangle Я сделал.
Является ли решение, которое я ищу, достаточно продвинутым?
Есть ли относительно простой способ сделать это?
задан 21 фев ’09, 12:02
Это проблема, решение которой, вероятно, станет очевидным, если вы пойдете поиграть в бильярд. — smartcaveman
10 ответы
Я думаю, что более простой способ сделать это — использовать скорость ракеты вместо вычисления углов. Скажем, у вас есть ракета с xVelocity и yVelocity для представления его движения по горизонтали и вертикали. Эти скорости могут быть положительными или отрицательными для представления влево, вправо, вверх или вниз.
- Если ракета попадает в верхнюю или нижнюю границу, поменять местами знак yVelocity .
- Если ракета попадает в левую или правую границу, поменять местами знак xVelocity .
Это сохранит движение по противоположной оси таким же.
Заимствование изображения из Ответ ChrisF, допустим, ракета стартует в позиции I.
.png)
Для 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 на компоненты u перпендикулярно стене и w параллельно ему.

u = (v · n / n · n) n
w = v — u
Здесь, v · n это скалярное произведение векторов v и n. См. Ссылку для объяснения того, как это вычислить. Точечный продукт n · n вычисляется как квадрат длины вектора нормали; если вы всегда сохраняете свои нормали в виде единичные векторы становятся n · n = 1, и вы можете опустить деление.
После отскока на составляющую движения, параллельную стене, действует трение. f, а компонент, перпендикулярный стене, подвержен упругости, которую можно представить в виде коэффициент реституции r.
Таким образом, скорость после столкновения равна v ′ = f w — r u. В идеально упругом столкновении без трения, v ′ = w — u; то есть движение отражается относительно нормали в точке столкновения, как на диаграмме, приведенной в ответе Билла.
Этот подход работает точно так же и в трех измерениях.
(Очевидно, это очень упрощенное понятие подпрыгивания; оно не принимает во внимание угловой момент или деформацию. Но для многих видов видеоигр такого рода упрощение совершенно адекватно.)