Как изменить скорости x и y в ответ на отскок стены - PullRequest
0 голосов
/ 10 апреля 2020

Я «программирую» простые сверхскоростные мобильные игры в свое свободное время, используя программное обеспечение языка sudo, называемое construct 3, так как я все еще изучаю реальные языки и пока не могу использовать их достаточно хорошо, чтобы создавать игры.

По сути, я пишу свой собственный супер простой физический движок для прыгающего мяча. У меня есть до 3 мячей в этой маленькой игре в пинбол в любое время. Я дал каждому шару переменную скорости x и y скорости.

Вот мой вопрос: как изменяются скорости x и y, когда шар отскакивает от поверхности под любым углом? Я знаю, что если пол ровный и ударяет по нему, то x остается прежним, а y меняет полярность. Я знаю, что с ударом по стене происходит обратное. Но я понятия не имею, как рассчитать любой другой угол, кроме 4 основных осей. Я уверен, что это простая функция триггера. Да, и озвучьте свой ответ до самого простого ответа sudo-кода, который вы можете сделать.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Прежде всего, вам нужен угол, под которым движется шар, и угол поверхности. Таким образом, вы будете знать, под каким углом шар касается «стены».

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

Что касается углов, под которыми движутся шары, вы можете рассчитать угол по скоростям x и y. Например, если v (x) равно 1, а v (y) равно 1, угол будет 45 °. Вы также можете рассчитать фактическую скорость мяча, которая равна квадрату root из (1² + 1²). Это примерно 1,41, и мы рассчитали все это с помощью теоремы Пифагора.

Теперь у нас есть все 3 линии нашего прямоугольного треугольника, и мы можем вычислить все углы разными способами и без проблем. Например, я могу использовать функцию sin (а ​​затем reverse sin ), чтобы получить угол.

sin(x) = 1 / 1.41

x = sin(-1) (1/1.41)

Мы рассчитали угол, под которым движется мяч (45 °). Предположим, что мяч касается стены, которая расположена под углом 90 °. Как изменятся скорости?

Фактическое воздействие происходит под углом 45 °. Нам нужно взглянуть на угол падения . Мы уже знаем, что скорость x инвертируется, а скорость y остается неизменной, когда мы ударяемся о стену. Как проверить, верно ли это?

  1. Рассчитать угол удара (угол падения) = угол стены - угол шара.

    Угол падения = 90 ° - 45 ° = 45 °

  2. Рассчитайте угол, под которым будет двигаться шарик. Это угол падения + угол стены. Итак: угол перемещения = 45 ° + 90 ° = 135 °.

В этот момент вы можете сказать, что если угол составляет от 270 ° до 360 ° и от 0 ° до 90 °, скорость х положительна. В противном случае он отрицательный (он движется влево). Поскольку мы переключились с 45 ° на 135 °, скорость х теперь будет отрицательной.

Скорость Y будет положительной от 0 ° до 180 ° и отрицательной от 180 ° до 360 °.

Скорость мяча остается на уровне 1,41. Давайте, наконец, вычислим скорости x и y:

Мы знаем, что: X теперь будет отрицательным, а Y останется положительным. Но наша функция косинуса вычислит правильное значение x для нас.

Теперь у нас есть прямоугольный треугольник, где самая длинная линия - скорость вне (1.41). Две другие строки - это наши x и y. Мы получаем скорость у:

sin(135) y/1.41
y = sin(135) * 1,41 = 1

и

x = cos (135) * 1,41 = -1.
0 голосов
/ 11 апреля 2020

При любом столкновении объекта с плоской поверхностью под углом alpha ваш объект отскочит назад под углом -alpha. Кроме того, у вас есть то, что называется сохранением импульса, что означает, что если ваша поверхность не движется и ничего не поглощает, общая скорость вашего объекта также не изменится.

При этом "все вы «нужно сделать», чтобы задать угол вашей поверхности по горизонтали и угол вашего объекта, поступающего на вашу поверхность, чтобы вы могли легко зарегистрировать угол alpha. Таким образом, вы сможете получить угол -alpha между вашим объектом и поверхностью после столкновения в кадре вашей поверхности, а затем вам нужно будет go вернуться к «горизонтальной рамке», просто добавив угол вашей поверхности.

Насколько ваша реализация должна go, я предлагаю следующее:

  • Начните с функции horizontalToAngularFrame, которая будет принимать один или несколько параметров в зависимости от того, находитесь ли вы в 2D или 3D, поэтому вы можете определить угол
  • Код другой функции AngularFrameToHorizontal с тем же номером параметра
  • Когда объект входит в столкновение, просто обработайте как если бы вы обрабатывали объект в горизонтальной рамке и использовали 2 ранее закодированные функции, чтобы вернуть углы к горизонтальной рамке
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...