Отскок мяча от поверхности - PullRequest
4 голосов
/ 16 мая 2010

Я сейчас нахожусь в процессе написания такой игры, как Breakout, и мне было интересно, как правильно отскочить от поверхности шара.

Я пошел наивным способом поворота скорости на 90 градусов, который был:

[vx, vy] -> [-vy, vx]

Что (что неудивительно) не сработало так хорошо. Если я знаю положение и скорость мяча, а также точку, в которую мяч попадет (но вместо этого он отскочит), как я могу отскочить от него?

Ограничения:

  • Я использую целочисленную математику (без FP в любом месте)
  • Все мои поверхности просты плоские поверхности (вертикальные, горизонтальный или блок)
  • Я хочу отскочить только под углом 90 градусов
  • Все столкновения являются чисто упругими (это прорыв - нет необходимости в трении и т. Д.)

Мне не нужен код для конкретного языка. Если бы кто-нибудь мог предоставить небольшую математическую формулу о том, как правильно это сделать, это бы сработало для меня.

Спасибо!

Ответы [ 7 ]

5 голосов
/ 16 мая 2010

Я бы попробовал [vx, vy] -> [vx, -vy] на горизонтальных стенах и [vx, vy] -> [-vx, vy] на вертикальных стенах.

5 голосов
/ 16 мая 2010

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

Итак, если у вас есть [vx, vy], и он отскакивает от вертикальной стены, у вас будет [-vx, vy].

Если у вас есть [vx, vy], и он отскакивает от горизонтальной стены, у вас будет [vx, -vy].

4 голосов
/ 16 мая 2010

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

Для горизонтальных / вертикальных поверхностей нормаль легко вычислить. Для более сложных поверхностей это может зависеть от уравнения поверхности и т. Д.

Кроме того, это предполагает, что энергия шара не изменяется. Если принять во внимание трение / потерю тепла / вращение шарика и т. Д., Это может осложниться.

3 голосов
/ 16 мая 2010

Предполагая, что при столкновении энергия не теряется, шар, движущийся со скоростью (vx, vy), будет двигаться со скоростью (-vx, vy) после отскока от вертикальной поверхности и (vx, -vy) после отскока от горизонтали поверхность.

Для общего случая (отскакивая от плоскости с произвольным вектором нормали, все еще не предполагая потерь энергии), см. Эту статью в Википедии под разделом Вычисления: http://en.wikipedia.org/wiki/Specular_reflection

3 голосов
/ 16 мая 2010

Вы отражаете вектор вокруг линии, перпендикулярной поверхности в точке удара. в 2D:

exit_angle = 180 - Impact_angle.

1 голос
/ 16 мая 2010

Вы должны знать поверхность, а также скорость мяча. Например, отскок от линии, параллельной оси x [vx, vy], станет [vx, -vy]. Если линия параллельна оси y, то [vx, vy] станет [-vx, vy]. Сложнее, если линия не параллельна ни одной из осей, но вы ищете простое отражение скорости вдоль направленности поверхности ((1, 0) и (0, 1) для осей x, y).

0 голосов
/ 16 мая 2010

90 градусов отражений от выровненных по оси ящиков - это вопрос правильного изменения знака скорости X / Y. Кроме того, требуется точечное произведение и небольшое векторное переворот, но эта математика все еще очень безопасна - ее можно легко сделать в качестве фиксированной точки, если это необходимо.

...