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

от admin

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

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

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

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

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

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

10 ответов

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

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

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

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

Angle of Reflection

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

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

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

Для идеальных частиц (& света) угол отражения равен углу падения, как показано на этой диаграмме (с сайта commons.wikimedia.org).

Angle of Reflection

На странице об отражении в Википедии очень хорошо объясняется, как это работает.

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

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

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

Missile with vector v about to obliquely hit a wall with surface normal n.

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

Right-angled triangle with hypotenuse for v, short side u parallel to wall and long side w parallel to wall.

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

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

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

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

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

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

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

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

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

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

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

9 ответов

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

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

Это будет поддерживать движение на противоположной оси.

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

Изображение 113465

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

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

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

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

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

Изображение 113466

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

Изображение 113467

u= (vn/ nn) n
w= vu

Здесь vn — dot product векторов v и n. См. Ссылку для объяснения того, как ее вычислить. Точечный продукт nn оценивает квадрат длины нормального вектора; если вы всегда сохраняете свои нормали в виде единичных векторов, то n n= 1, и вы можете опустить деление.

Читать:
Что такое ac adapter

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

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

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

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

Unity как рассчитать угол отскока мяча от стены?

ShockWave2048

Если включена гравитация, drag, материалы то формула точных углов и скоростей может быть очень сложной.

Легче заставить движок просчитать траекторию вперед и на основе положений мяча получить угол и траекторию после столкновения.

если относительное положение стенок паралельно осям координат (т.е. либо препятствие вертикальное либо горизонтальное) то при ударе о горизонтальную стенку, скорость по Y меняется на противоположную (меняется знак) а по X не меняется, ну а при горизонтальной стенке наоборот, по Y не меняется а по X меняется знак на противоположный (умножить на -1)

если препятствия произвольный угол имеют то. формулы можешь посмотреть тут

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

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

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

Прямо сейчас у меня нет никаких препятствий, ракеты просто отскакивают, когда они выходят за пределы 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; то есть движение отражается относительно нормали в точке столкновения, как на диаграмме, приведенной в ответе Билла.

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

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

Related Posts