@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты

Какими формулами можно описать движение предмета?

Доброго времени суток!
Подскажите пожалуйста как реализовать алгоритмически движение предмета наподобие движения покебола из игры "Pokemon GO"? Если вкратце, то мы делаем движение пальцем по экрану смартфона (свайп), а покебол (шар) летит в нужном направлении с нужной скоростью и вращением. Если мы делаем медленный свайп, то шар летит медленнее. Если мы делаем свайп дугой, то шар закручивается по дуге.

Сейчас у меня есть массив, содержащий координаты точек свайпа и время, когда указатель (палец) в этих координатах находился. Как мне по этим точкам создать математическую модель движения? Нужно как-то перевести статику в динамику (скорость, вращение, добавить затем и силу тяжести)?
  • Вопрос задан
  • 558 просмотров
Пригласить эксперта
Ответы на вопрос 3
@AlexSku
не буду отвечать из-за модератора
Не знаю, откуда вы берёте информацию, в своё время на Delphi информация поступала от жестов (gestures).
Остальное вы хорошо описали (помните? - постановка задачи это наполовину её решение), только надо получше структурировать.
Сначала исходные данные.
Затем пишете уравнения перемещения и вращения (скорость - интеграл (т.е. накопление) по ускорению, перемещение - интеграл по скорости), можете добавить силу тяжести и трение. Подставляете исходные данные - и получаете результат в зависимости от времени. Делаете анимацию (положение, поворот) в нужный момент времени.
Ответ написан
Комментировать
x67
@x67
У предмета есть вектор скорости и вектор ускорения. Также есть одна угловая скорость (на плоскости) и одно угловое ускорение.
Собственно разберем простой случай, когда при свайпе предмет мгновенно достигает нужной скорости и нужной частоты вращения.
Тогда можно аппроксимировать свайп в линию (запросы: линейная фильтрация, тренд по точкам, линейная интерполяция и тп). Возможно подойдет просто взять начальную и конечную точку, попробуйте. Тогда у предмета скорость по оси Х будет равна (x2-x1)*К/(t2-t1), где 1 и 2 - точки начала и конца свайпа, а К - какой-то коэффициент, который будет вам удобен. А по оси Y соответственно (y2-y1)*K/(t2-t1).
Закрутку считать так. Берете начальную и конечную точки свайпа, получаете из них линию, далее ищите самую далекую точку от линии (или для простоты ищите расстояние средней точки до линии). Угловая скорость будет пропорциональна этому расстоянию.
Как сделать так, чтобы предметы ускорялись плавно?
Во первых надо запомнить, что ускорение не должно быть постоянным, должна быть какая-то инфляция его во времени. Причем быстрая. Далее нужно решить, есть ли у предметов разная масса (насколько физична игра?) Если нету, то мы работаем напрямую с ускорением, если есть, то появится еще сила, воздействующая на предмет. Предположим массы нет, тогда можно сделать простое ускорение, равное какому-то числу. Конечную скорость считаем также, но при этом не сразу присваиваем скорость, а постепенно изменяем по следующей формуле:Vx=Vx+ax*dt. dt - интервал между фреймами (для девайсов с переменным фпс, чтобы игра не скакала,) ах - ускорение по оси х. При достижении скорости ускорение становится равным нулю.
Еще один вариант плавного разгона - Vx=K*Vx+(1-K)*Vxzad, где К может быть в интервале от 0 до 1, а Vxzad - расчетная скорость, которой надо достичь. Чем больше К, тем медленнее будет ускоряться предмет. Если надо, эту формулу можно написать немного в другом виде, тогда с ней будет приятнее работать (можно будет легко задавать, за какое время предмет будет достигать своей скорости).
Для угловой скорости все это работает точно также.
Ну и да, в принципе можно обойтись без ускорения или сил с массой, задавая скорость алгоритмически, но с ускорением удобно будет вводить разные эффекты вроде гравитации, трения и тп.
Ответ написан
Griboks
@Griboks
Судя по условию, уже имеется r(t) - функция перемещения, полученная из движения пальца по экрану. Необходимо сделать аналогичное перемещение для покебола.

1) Движение шара по дуге и другой траектории, определённой пользователем.
Предлагаю просто напросто масштабировать вашу r(t) до нужных размеров и запустить по ней шарик.
(Соответствующие преобразования)
2) Сила тяжести
Самый просто способ - двигать шар в две итерации: r(t), а затем применить силу тяжести [y(t) = y0 + V0*t + 5*t^2]. Не забываем, что она направлена вниз!
3) Вращение
Необходимо определить, как пользователь будет задавать вращение. Ведь свайп по дуге - это движение шара по дуге. Но, например, не составит труда вращать шар с угловой скоростью w=r(tmax)-r(tmin).
4) Более точные модели
Безусловно, можно рассчитывать ещё и силы сопротивления, скорости, рывки, массу, энергию и много чего ещё. Только это вовсе не требуется в данной задаче.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы