Хм, это хорошая проблема;Дело в том, что хорошее решение (то есть то, которое выглядит и ощущается как настоящая физика) по своей природе использует реальную физику.К счастью, большая часть ньютоновской физики в рамках этой проблемы может быть легко упрощена.Извините, если я слишком многословен, но физика имеет тенденцию делать это с вами.
![The horizontal forces acting in an Arkanoid paddle-ball collision: the lowest vector is the total horizontal force the paddle transmits to the ball; - the top vector is the component of that which goes directly into the ball's horizontal motion; - and the middle arrow is the component which goes into the ball's spin enter image description here](https://i.stack.imgur.com/0VxLu.png)
Итак, чтобы определить проблему, это упругое (как будто энергия не поглощается) столкновение между арканоидным шаром и веслом.Прежде всего, поскольку у вас, очевидно, есть вертикальное движение вниз, я не буду беспокоиться об этом.Итак, все, что следует, относится к горизонтальным компонентам столкновений.
Весло передает определенное количество горизонтального импульса мячу (хотя, поскольку это физика арканоидов, весло не теряетсам импульс: P).Это может быть получено двумя способами - путем вращения мяча и придания мячу горизонтального импульса (очевидно, если шар уже имеет горизонтальный импульс или вращение, добавленный импульс будет ... ну, добавлен).
дельта-импульс + дельта-угловой момент = импульсное весло дало
Конечно, работать с импульсами может быть раздражающим, поскольку на самом деле это не нужно.Я бы предположил, что шар и весло имеют постоянную массу (то есть шар не становится внезапно тяжелее, хотя вы могли бы легко с этим работать), потому что тогда вы могли бы учесть массу каждого из ваших уравнений импульса.Итак,
Дельта-горизонтальная скорость + Дельта-угловая скорость = Весло-скорость * Масса весла / Масса шара
Чтобы получить из этого уравнения, которое вы можете использовать, вы должны установить, сколькоимпульса от весла пошло бы в вращение, и сколько бы пошло в движение шара.Например,
mass_factor = 2 # ratio between paddle and ball masses
angular_factor = 0.3 # the amount of the paddle's movement which will go into the ball's spin
# and now for the bouncy-bouncy
ball.hVel += (1 - angular_factor) * paddle.hVel * mass_factor * friction or whatever
ball.spin += angular_factor * paddle.hVel * mass_factor * friction or whatever
ball.vVel = - ball.vVel # of course, its vertical velocity reverses
Этого будет достаточно, чтобы установить квазиреалистичный отскок, но остается один самородок (который вам не нужно указывать, но его адрес сделает ваш арканоид поразительным) -что происходит со всем этим спином?Можно ли как-то использовать вращение для более интересных отскоков?
Итак, подведем итог, ваш спин - это скорость, с которой периферия шара движется относительно центра.Дело в том, что всякий раз, когда вращающийся шар отскакивает от чего-то неподвижного, его вращение изменяется так же, как и его скорость.Если вращающийся шарик попадает на неподвижную поверхность, бал получает небольшой «удар» в направлении против его вращения (если вращение измерено в точке контакта), и вращение изменится.
#Upon collision with a surface (assumed horizontal, with the ball above the surface)
ball.hVel += -(ball.Avel * rate) # Where "rate" is the ratio which determines how much angular velocity decays with each bounce
ball.Avel *= 1 - rate # So the angular velocity decays properly
Поскольку угловая скорость является вращательно-симметричной, вы бы просто рассматривали столкновения под разными углами (шарики на стенах, шарики на потолках) как повороты этого.
Фу, который был непреднамеренно длинным,Смотрится, и это далеко не завершено, но этого достаточно, чтобы ответить на ваш вопрос ИМХО.