#анимация #алгоритм #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
Когда то простую симуляцию отскока мяча (тогда не нужна была оптимизация ) я реализовывал рекурсивно. Каждый отскок будто новый бросок под уголом к горизонту с соответствующим изменением скорости и угла. Базовым случаем являлось условие равенства скорости нулю.
Комментариев нет:
Отправить комментарий