Почему скорость моих шаров в конечном итоге перестает уменьшаться при применении силы тяжести? - PullRequest
2 голосов
/ 10 апреля 2019

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

Код ниже представляет мой процесс нанесения гравитации на шары.

double y        = 100;
double vel      = -10;
double gravity  = -1;
double friction = 0.5;

while(true) {
    y += vel;

    //if collides with floor
    if(y < 0) {
        y = 0;
        vel *= -1;
        vel *= friction;
    }

    else
        vel += gravity;
}

В этом конкретном примере скорость в конечном итоге начинает подпрыгивать от -1,3333 ... 0,666 ... и -0,333 ...

Моя цель - отскок мяча от пола, скорость которого будет уменьшаться с каждым отскоком, пока он в конце концов не достигнет скорости 0 и упрется в пол.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Ведение журнала помогает понять странные колебания.

Начните с этого (к которому оно приходит примерно через 65 кадров):

vel: -1.365234375 
y: 0.26953125

В следующем кадре мяч падает на пол.и значение vel переворачивается и делится пополам:

vel: 0.6826171875 
y: 0 

Далее шар перемещается вверх, а vel переключается на отрицательное значение:

vel: -0.3173828125 
y: 0.6826171875 

Далее шарик перемещается вниз и vel уменьшается еще немного:

vel: -1.3173828125 
y: 0.365234375

Затем мяч падает на пол, и vel делится пополам и снова переворачивается:

vel: 0.65869140625 
y: 0

Обратите внимание, что мы сейчас очень близки к тому, с чего начали, и продолжим этоТаким образом, нормализуя примерно до y = 1/3 и y = 2 / 3.

Если вы уберете эффект гравитации из оператора else и позволите гравитации влиять на каждый кадр, шарик установится в ноль.

Пример в p5js: https://editor.p5js.org/bcingle/sketches/hfVbE9YJf

0 голосов
/ 10 апреля 2019

В коде есть одна проблема ... после определенных скачков ... максимальная высота мяча выходит за пределы предыдущей максимальной высоты. Это явно нарушает физику. Точно так же, как вы поставили проверку y<0, чтобы не допустить перехода y в отрицательную сторону, вы должны поставить y>prevMaxY, чтобы высота не выходила за пределы предыдущего максимума.

else if(y > maxY) {
    y = maxY;
    vel *= -1;
    vel *= friction;
}

Для этого вы должны отслеживать предыдущую максимальную высоту.

Кроме того, в качестве условия завершения вы должны установить порог для y, который будет означать - if max height is less than the threshold then the ball has come to rest.

Хотя ваши приближения / предположения довольно грубые. Вы можете рассмотреть возможность их уточнения.

...