Java — физика прорыва?

Я создаю игру Breakout и ранее задавал здесь вопрос, но не было предложено никакого решения. У меня есть простая физика, чтобы инвертировать Y скорость мяча при столкновении с ракеткой. Но я должен реализовать более продвинутую физическую систему, например, когда мяч ударяется о левую сторону ракетки и правую сторону и т. д., но как мне рассчитать, куда направить мяч после столкновения? Нормой в Breakout является направление мяча влево при столкновении слева от весла, и вправо, если столкновение происходит справа и т. д.

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

Кто-нибудь здесь знаком с основами физики и может помочь мне рассчитать траекторию, путь, скорость или направление, чтобы отправить мяч после столкновения?!

Заранее спасибо.


person user3422952    schedule 16.04.2014    source источник
comment
Весло прямоугольное?   -  person Dawood ibn Kareem    schedule 17.04.2014
comment
Да, у меня есть координаты его положения и, как я уже упоминал, все его свойства.   -  person user3422952    schedule 17.04.2014
comment
Итак, если мяч ударяется о вертикальную сторону прямоугольника, вы просто обращаете X-компонент его скорости; если он попадает в горизонтальную сторону, вы переворачиваете компонент Y. Это то, что вы спрашиваете? Или вы пытаетесь разобраться со случаем, когда весло движется?   -  person Dawood ibn Kareem    schedule 17.04.2014
comment
en.wikipedia.org/wiki/Classical_mechanics   -  person Alex Salauyou    schedule 17.04.2014
comment
Кроме того ... вы хотите принять во внимание относительные массы мяча и ракетки? Другими словами, ударяет ли мяч ракетку вообще или ракетка достаточно тяжелая (а мяч достаточно легкий), чтобы на саму ракетку не повлияло столкновение?   -  person Dawood ibn Kareem    schedule 17.04.2014
comment
У меня уже есть базовая физика, подобная этой @DavidWallace, но с ее помощью мяч следует по тому же квадратному маршруту. Я пытаюсь реализовать физику, чтобы пользователь мог фактически контролировать, куда летит мяч.   -  person user3422952    schedule 17.04.2014
comment
Итак, вы пытаетесь реализовать трение между мячом и движущейся лопаткой? Или вы просто пытаетесь иметь дело со случаем, когда мяч попадает на край ракетки, а не на длинную сторону? Вы должны быть ГОРАЗДО более конкретными, чем просто сказать «занимайтесь физикой».   -  person Dawood ibn Kareem    schedule 17.04.2014
comment
Я пытаюсь понять, как рассчитать направление мяча после того, как он обычно попадает в ракетку, кроме простого инвертирования скорости Y.   -  person user3422952    schedule 17.04.2014
comment
Этот вопрос кажется не по теме, потому что он касается физики столкновений, а не разработки программного обеспечения. На самом деле вы можете получить ответ на Physics   -  person Jim Garrison    schedule 17.04.2014
comment
Я не смогу вам помочь, если вы не ответите на мои вопросы. Вас интересует эффект трения, при котором мяч на короткое время увлекается движением весла? Вас интересует, что произойдет, если мяч ударится о край ракетки, а не об ее основную поверхность? Любой из них, конечно, будет зависеть от скорости, с которой весло движется в момент удара. Вы заинтересованы в том, чтобы учесть тот факт, что мяч будет немного стучать по ракетке? Пожалуйста, уточните, чего вы пытаетесь достичь.   -  person Dawood ibn Kareem    schedule 17.04.2014
comment
Если я правильно помню, удар по мячу левым или правым краем ракетки отражал мяч под более острым углом, чем удар по мячу серединой ракетки. По сути, разделите весло на 4 области.   -  person Gilbert Le Blanc    schedule 17.04.2014
comment
Гилберт, я разделил его на 3 части: левую, правую и среднюю. Проблема в том, что мне нужно выяснить, что на самом деле является более острым углом.   -  person user3422952    schedule 17.04.2014
comment
Вы можете сделать отношение от -1 до 1, где -1 будет крайним левым, 1 будет самым дальним правым, и вы можете рассчитать угол, приняв 0 градусов, если он попадает в центр, и соотношение до 70 градусов * (положение мяча относительно ракетки, от -1 до 1).   -  person Samich    schedule 17.04.2014


Ответы (2)


Мы постоянно работаем над игрой Breakout для школы. Вот как мы это делаем. Обратите внимание, что это из класса Ball, поэтому каждый раз, когда вы видите это, думайте Ball.

Следующий метод Bounce вычисляет и применяет изменение скорости и вращения в результате отскока мяча.
«Коэффициенты» указывают, как преобразовать скорости в направлениях x и y в скорость, параллельную поверхности. Если мы сориентируем наш взгляд так, что мяч движется вниз к поверхности, скорость, параллельная поверхности, положительна, если движение идет вправо.

Уравнения получены из физического анализа, представленного в: Ричард Л. Гарвин, "Кинематика ультраупругого шероховатого мяча", Американский журнал физики, 37, 88-92, январь 1969 г. Это определяет поведение идеально прыгающего мяча (упругого столкновение) с вращением, которое не скользит/скользит при отскоке. Реальным аналогом является продукт Superball от Wham-O.

Делаем две модификации/специализации: 1) Так как мы работаем в двух измерениях, то наш "шар" - это диск. Это делает момент инерции

1/2 * M * R^2

. В соглашениях статьи Гарвина это означает, что альфа = 1/2. Гарвин не учитывает столкновения с движущейся поверхностью. Тем не менее, легко настроить вещи, учитывая движение относительно рамы движущейся поверхности. Мы просто вычитаем скорость поверхности из параллельного движения мяча перед вычислением того, что происходит при столкновении, а затем прибавляем скорость обратно.

В обозначениях Гарвина мы получаем:

Ca = -1/3 Cb - 4/3 Vb + 4/3 Vs

Va = -2/3 Cb + 1/3 Vb + 2/3 Vs

Здесь Va и Vb — скорости шара, параллельные поверхности, после и до столкновения соответственно. Vs – скорость поверхности. Ca и Cb — это R * вращение Шара после и до столкновения соответственно. (В обозначениях Гарвина C = R * омега, где омега — это вращение.)

/*
@param xFactor an int, -1, 0, or 1, giving the factor by which to
multiply the horizontal speed to get its contribution to the speed
parallel to the surface
@param yFactor an int, -1, 0, or 1, giving the factor by which to
multiple the vertical speed to get its contribution to the speed
parallel to the surface
@param speed a double, giving the speed of the surface; positive
is movement to right if we consider the surface as being horizontal
with the Ball coming down onto it
*/   
  private void bounce (int xFactor, int yFactor, double speed) {
    // can get stuck, so add a random component to the speed
    speed += 0.03 * (random.nextFloat() - 0.5);
    // obtain parallel / normal speeds for horizontal and vertical
    double vParallel = xFactor * this.getHorizontalSpeed() +
                       yFactor * this.getVerticalSpeed();
    double vNormal = xFactor * this.getVerticalSpeed() -
                     yFactor * this.getHorizontalSpeed();
    double radius = this.getImage().getHeight() / 2.0D;
    // determine Garwin's Cb and Vb
    double cBefore = radius * spin;
    double vBefore = vParallel;
    // determine Garwin's Ca and Va
    double cAfter = (-1.0D/3.0D) * cBefore + (-4.0D/3.0D) * vBefore + (4.0D/3.0D) * speed;
    double vAfter = (-2.0D/3.0D) * cBefore + ( 1.0D/3.0D) * vBefore + (2.0D/3.0D) * speed;
    // apply direction reversal to normal component
    double vNAfter = -vNormal;
    // determine horizontal and vertical speeds from parallel and normal components
    double vHAfter = xFactor * vAfter  - yFactor * vNAfter;
    double vVAfter = xFactor * vNAfter + yFactor * vAfter;
    // update the Ball's state
    this.setHorizontalSpeed(vHAfter);
    this.setVerticalSpeed(vVAfter);
    this.spin = cAfter / radius;
}
person ialexander    schedule 19.04.2014
comment
К вашему сведению, каждый ваш встроенный комментарий должен фактически быть комментарием javadoc для отдельного метода. Вы делаете слишком много операций в функции bounce, и вам нужно разделить ее на несколько функций. - person AJMansfield; 19.04.2014
comment
@Ajmansfield вау. К вашему сведению, это крошечный метод. Нет необходимости разбивать его больше, поскольку он делает только одну вещь. Это реализация единого алгоритма. Нам не нужно было бы повторно использовать какую-либо часть этого где-либо еще в программе. Спасибо за ваше мнение. - person ialexander; 19.04.2014

Если вам не нужна столь продвинутая физика и вас устраивает поведение бильярдного шара, то вычислите нормаль к поверхности (nx,ny) в точке столкновения вашим любимым методом (нормируется как nx²+ny²=1 или nx=cos (a), ny=sin(a)) и изменить направление, как в

dot = nx*vx+ny*vy
vx = vx - 2*dot*nx
vy = vy - 2*dot*ny

Это для почти стационарного весла. Для движущейся лопасти сделайте, как было предложено, и сначала вычтите скорость лопасти pvx из vx, вычислите скалярное произведение и результирующие изменения и прибавьте обратно скорость лопасти. Или выполните вычитание только в скалярном произведении без изменения vx:

dot = nx*(vx-pvx)+ny*vy
vx = vx - 2*dot*nx
vy = vy - 2*dot*ny
person Lutz Lehmann    schedule 21.04.2014