Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Отскок мяча от земли

#анимация #алгоритм #javascript #физика


У нас есть холст высотой my и шириной mx, на котором мы рисуем окружность с центром
в точке (x;y) радиуса r, на расстоянии h "от земли". (h = my - y).
Начальная скорость падения окружности вниз равна 0. Будем считать, что масса окружности
прямо пропорциональна радиусу, то есть масса m = r.
Каждый кадр мы рассчитываем координаты окружности и затем прорисовываем ее. Допустим,
в более сложном случае окружность может падать не строго вниз, а под углом и с какой-то
начальной скоростью. 
var obj = {
    x: x,
    y: y,
    radius: radius,
    x_: 0,
    y_: 0,
    speed: Math.sqrt(Math.pow(this.x_, 2) + Math.pow(this.y_, 2)),
    angle: Math.atan2(this.y_, this.x_),
    time: 0,
    h: my - y
};

Пусть x__ и y__ - скорости (проекции скоростей) на оси Ох и Оу соответственно. Пусть
g = 9.8. Каждый шаг я буду изменять координаты шарика
obj.time += 0.0051;
obj.y_ = (g * Math.pow(obj.time, 2))/2;
obj.speed = Math.sqrt(Math.pow(obj.x_, 2) + Math.pow(obj.y_, 2)); // * (-1)
obj.angle = Math.atan2(obj.y_, obj.x_);
obj.y -= obj.speed * Math.sin( obj.angle );

Ввожу вектор, т.к. возможно в будущем сделаю анимацию более сложной.
Вопрос:
Как поступать, когда мяч прилетел на землю? Как перенаправить вектор, чтобы шар отскочил
обратно вверх? Как привязать сопротивление воздуха и массу шарика (чтобы большой мяч
летел быстрее или медленнее)? Как сделать так, чтобы шар в конце концов остановился?
Желательно сделать все как можно ближе к настоящим законам физики.
Куда копать? Пожалуйста, разъясните поподробней этот вопрос.
И что можно почитать на эту тему, чтобы я потом не создавал вопрос о том, как сделать
то же самое с какой-то неправильной фигурой (и т.д.)?    


Ответы

Ответ 1



Для начала почитайте школьную механику. Если мяч несжимаемый, при касании мячом земли vy=-vy; Мгновенно. Если сжимаемый, то при касании появляется сила упругости, которая добавляет ускорение. В простейшем случае Fупр = -kdy,// где dy - смещение по y. Эта сила сначала уменьшит скорость y до 0, потом возвратит к первоначальной величине с обратным знаком. Сопротивление воздуха F = Cx((pV^2)*S)/2 Cx - коэффициент лобового сопротивления. Для шара примерно 0.5 p - плотность среды. Для воздуха - 1.3кг/m^3 S - площадь сечения шара. pi*r*r V - скорость (ПОЛНАЯ, не только по y!!!), относительно воздуха. Не забудте, что эта сила ВСЕГДА направлена против движения. Далее. Если пол шершавый, а касание не единомоментно, мячик будет подкручиваться. Инерция вращающегося шара - что-то типа (2/5)mR^2, то есть в вашем случае (2/5)r^3 Вам пока хватит. Точно хватит. =) P.S. Ах, да. Еще учтите силу архимеда для мячика: p_воздуха*Объем_мяча

Ответ 2



круто весь мир описать наверное и знать при этом всю физику да ещё и математику, но к счастью, а быть может и нет, достаточно создавать иллюзии тех или иных проявлений посредством программинга ибо это и есть симулятор(тобиш иллюзия). и если нет готового движка(которых уже достаточно) ябы это решил функцией падения с эффектом рикошета. тоесть пишем функцию допустим func(int x, int y, int x_destination, int y_destination, int speed) как-то так.. и алгоритм примерно такой: при столкновении с землей вектор на +-180градусов, если движение на 90градусов(перпендикулярно земле) +90градусов, если точка отсчета(старта) больше точки достижения земли по оси Х и У -90градусов, если точка отсчета(старта) меньше точки достижения земли по оси Х и больше по оси У уменьшаем скорость и меняем x_destination, y_destination допустим на отрезок 1/5 от начального при достижении новой точки назначения на +-180градусов и опять к земле и так пока скорость превышает допустим 1 конечно это только набросок и на идеал никоим образом не претендует, только чтобы подсказать направление

Ответ 3



Когда то простую симуляцию отскока мяча (тогда не нужна была оптимизация ) я реализовывал рекурсивно. Каждый отскок будто новый бросок под уголом к горизонту с соответствующим изменением скорости и угла. Базовым случаем являлось условие равенства скорости нулю.

Комментариев нет:

Отправить комментарий