Арканоидная физика (симуляция физики снаряда) - PullRequest
2 голосов
/ 09 ноября 2011

У меня есть ползунок, скорость которого я вычисляю по разнице между позициями в каждом тике (иногда она может быть огромной из-за использования ее на сенсорном экране, поэтому, возможно, мне следует зафиксировать это на произвольном числе, чтобы избежать некоторых из этих проблем?)

У меня есть шар с трехмерным вектором направления и скоростью.

Когда шар сталкивается с ползунком, я обращаю его направление на ось Z (отходя от ползунка)и затем используйте скорость ползунков для управления направлением X (влево <-> вправо).итак:

ball.direction.x += (slider_friction * slider_velocity)

Теперь обновление мяча выполняется следующим образом:

velocity = ball.velocity * time
ball.direction.normalise()
ball.position = ball.direction * ball.velocity

Кажется, это работает отлично, за исключением некоторых случаев, кажется,Очень возможно, что любая из осей шариков будет равна нулю, в результате чего в некоторых случаях он никогда не вернется к ползунку.Что было бы хорошим решением для этого?И что было бы хорошим способом для обработки ответа с блоками, когда он сталкивается с ними?Должен ли он вернуться к подпрыгиванию под прямым углом, или он должен продолжать отражаться с теми же модификаторами отскока, которые применял ползунок?Также были бы полезны любые другие физические советы для этого типа моделирования снаряда.

1 Ответ

7 голосов
/ 12 ноября 2011

Хм, это хорошая проблема;Дело в том, что хорошее решение (то есть то, которое выглядит и ощущается как настоящая физика) по своей природе использует реальную физику.К счастью, большая часть ньютоновской физики в рамках этой проблемы может быть легко упрощена.Извините, если я слишком многословен, но физика имеет тенденцию делать это с вами.

enter image description here

Итак, чтобы определить проблему, это упругое (как будто энергия не поглощается) столкновение между арканоидным шаром и веслом.Прежде всего, поскольку у вас, очевидно, есть вертикальное движение вниз, я не буду беспокоиться об этом.Итак, все, что следует, относится к горизонтальным компонентам столкновений.

Весло передает определенное количество горизонтального импульса мячу (хотя, поскольку это физика арканоидов, весло не теряетсам импульс: 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

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

Фу, который был непреднамеренно длинным,Смотрится, и это далеко не завершено, но этого достаточно, чтобы ответить на ваш вопрос ИМХО.

...