Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Движение с переменной скоростью

Движение с переменной скоростью

GladiatorПостоялецwww12 янв. 201822:32#0
Привет.

Задачку подкину.. Чёт туплю..

Из точки А в точку Б надо отправить объект.
Известные данные:
1) т.А, т.Б
2) Время, за которое надо попасть из т.А в т.Б
3) Кривая задающая график изменения скорости в зависимости от времени.
4) Максимальная скорость(возможно)

Собсно надо составить формулу по которой это всё можно сделать.

Комментарий:
Время, за которое мы попадаем из т.А в т.Б, можно менять в параметрах, при этом график менять мы не можем. Я предполагаю, что график этот - по оси Х время [0..1] по Y скорость [0..1]. Скорость задаёт коэффициент скорости, который помноженный на некий модуль из п.4 даёт некую конечную скорость. С одной стороны, я хочу попасть из т.А в т.Б за время t, с другой менять скорость в процессе движения. Я так подумал, что если абстрагироваться от программирования то нам нужно сделать так чтобы интеграл по этой кривой(из п.3) давал единицу.. Но этого сложно достичь. Или быть может я усложняю.

Заранее благодарю.

Андрей5000Постоялецwww12 янв. 201822:55#1
Интегрируй свой график скорости
FordPerfectПостоялецwww13 янв. 20181:15#2
Gladiator
Задача одномерная?

>Я так подумал, что если абстрагироваться от программирования то нам нужно сделать так чтобы интеграл по этой кривой(из п.3) давал единицу.
Ну да, если тебе нужна именно эта задача, то именно это там и делать.

[cht]B-A=\int_{t=0}^{1}v_{max} v(t) \, dt[/cht]
и следовательно
[cht]v_{max}=\frac{B-A}{\int_{t=0}^{1} v(t) \, dt}[/cht]
Ежели интегрируется аналитически - тем легче.

Правка: 13 янв. 2018 1:17

FordPerfectПостоялецwww13 янв. 20181:20#3
>Время, за которое мы попадаем из т.А в т.Б, можно менять в параметрах
>Я предполагаю, что график этот - по оси Х время [0..1]
В смысле? Или это [0; T] растянутый [0; 1]?
FordPerfectПостоялецwww13 янв. 20181:46#4
Gladiator
В общем, если я правильно понял, что тебе нужно:
[cht]B-A=\int_{0}^{t}v_{max} f(\tau/t) \, d\tau[/cht]
заменяем переменную:
[cht]B-A=\int_{0}^{1}v_{max} t f(s) \, ds[/cht]
[cht]B-A=t v_{max} \int_{0}^{1}f(s) \, ds[/cht]
откуда
[cht]v_{max}=\frac{B-A}{t \int_{0}^{1}f(s) \, ds}[/cht]

FordPerfectПостоялецwww13 янв. 20181:50#5
А, ну и координата:
[cht]x(\tau)=t v_{max} \int_{0}^{\tau/t} f(s) ds[/cht]
RikkПостоялецwww13 янв. 201816:39#6
Gladiator
> Известные данные:
> 1) т.А, т.Б
x y значит известно у точек АБ

x=x0+vx*t

v=v0+ax*t

пройденный координата x=x0+v0проекцияx *t +(aпроекцияx*t^2 )/ 2

ускорение а= (v-v0) / t-t0

ускорение a считают классически величина постоянная

Gladiator
> 4) Максимальная скорость(возможно)
это предел для вычисления ускорения

а= v конечное - v начальное / t конечное-t начальное

а=дельта v / дельта t

Gladiator
> 2) Время, за которое надо попасть из т.А в т.Б
это задан интервал времени

t конечное - tначальное= дельта t


всё это повторить для y-координаты

пройденный путь s=корень квадратный из (xквадрат+yквадрат)

Gladiator
> 3) Кривая задающая график изменения скорости в зависимости от времени.
это проверочное для сверки
площадь графика общее(интеграл это есть площадь фигуры. взять интеграл)  это s=vt  пройденный путь = всё время множить на скорость
и должно совпадать с
путь s=корень квадратный из (xквадрат+yквадрат)

это физика 6класс школы раздел кинематика движение

и вот вы это не знаете а в гемдевелоп и програминг залезаете с чем вас поздравляем .

на худой конец как упоминал товарищ Zab всю эту хрень можно не делать а хватит глазами на экране примерно на глазок примерить позицию xy по экрану и под это примерно писать примерно программу

GladiatorПостоялецwww13 янв. 201816:53#7
FordPerfect
Спасибо за ответ!

> В смысле? Или это [0; T] растянутый [0; 1]?
Ну смотри, задача "попасть из А в Б за заданное время меняя скорость по заданному графику". Соответственно надо соблюсти 2 условия:
1. Прохождение пути за время t.
2. Соблюдение графика изменения скорости.

Как я понял, главная задача тут, при заданном графике изменения скорости найти максимальную его амплитуду чтобы можно было попасть в место назначения за время t.
Пример графика:
Изображение

FordPerfect
> В общем, если я правильно понял, что тебе нужно:
> [cht]B-A=\int_{0}^{t}v_{max} f(\tau/t) \, d\tau[/cht]
мм.. Что здесь есть [cht]\tau[/cht] ?

GladiatorПостоялецwww13 янв. 201816:55#8
И еще.. мысли вслух.. мне ведь надо получить интеграл равный единице. Если я найду интеграл текущей кривой и просто домножу его на множитель чтобы получить единицу, ведь будет тоже самое ?
RikkПостоялецwww13 янв. 201822:08#9
Gladiator
> получить интеграл равный единице.
речь идет про удельный вес . типа колбаса цена за тонну (1000кг) =1 тысяча рублей.

цена = 1000/тонна

надо получить нормальное.
получаем :
1тонна=1000кг
и потому цена
1000р/1000кг= 1р/1кг= 1

получается цена 1р за 1кг

Gladiator
> надо получить интеграл равный единице
речь идет о таком же смысле. типа удельная масса.

foxesПостоялецwww13 янв. 201822:49#10
Gladiator
> Пример графика:
численные методы интегрирования предполагают что ты просто посчитаешь общую сумму с шагом X от 0 до 1 - соответственно далее найдешь коэффициент масштабирования твоей прыгающей скорости поделив общее время. После чего будешь брать скорость по этому графику с шагом X и умножать ее на полученный масштаб.
GladiatorПостоялецwww13 янв. 201823:29#11
Rikk
Это я итак понимал. Речь была именно о решении задачки.

foxes
> численные методы интегрирования предполагают что ты просто посчитаешь общую
> сумму с шагом X от 0 до 1 - соответственно далее найдешь коэффициент
> масштабирования твоей прыгающей скорости поделив общее время. После чего будешь
> брать скорость по этому графику с шагом X и умножать ее на полученный масштаб.
Такова и была задумка.. Просто я не сразу сообразил что мне нужно предварительно найти интеграл кривой.. Ну т.е. я думал что это можно сделать в процессе вычислений(итераций), однако как я понял не зная Vmax это сделать невозможно.

FordPerfect
Если сможешь пояснить своё аналитическое решение(всё ещё не понимаю что такое тау) буду весьма признателен.

FordPerfect, foxes, Rikk
Благодарю вас!

P.S. Задачку решить удалось.
Если кому интересно решение, то оно под спойлером

+ Показать

IndiegmaУдалёнwww14 янв. 201813:25#12
Gladiator
я думаю дельту времени нужно приращивать в конце, а не в начале. так будет точнее.
...
 while (t < 1.0f)
{
      sum += m_speedCurve.Evaluate(t) * step;
      t += step;// здесь
}
...

...
while (timer < m_time)
{
      float normalizedTime = timer / m_time;
      float speedCoeff = m_speedCurve.Evaluate(normalizedTime);

      m_from.position += dir * speedMax * speedCoeff * Time.deltaTime / m_time;
      timer += Time.deltaTime;// здесь
      yield return null;
}
...
хотя в любом случае до целевой точки (B) не долетаем, т.к. результат сильно зависит от текущей дельты времени.

Правка: 14 янв. 2018 13:26

FordPerfectПостоялецwww14 янв. 201822:55#13
Gladiator
В #4 тау - это тупо переменная интегрирования. В #5 - это текущее время (т. к. t - полное время).
Переформулирую:
[cht]x(\tau)=(B-A)\frac{\int_{0}^{\tau/t}f(s)\,ds}{\int_{0}^{1}f(s)\,ds}[/cht]

Интегрировать можно бы и Симпсоном.

FordPerfectПостоялецwww14 янв. 201823:06#13
    while (t < 1.0f)
    {
      t += step;
      sum += (m_speedCurve.Evaluate(t)+
                   4.0f*m_speedCurve.Evaluate(t+0.5f*step)
                   m_speedCurve.Evaluate(t+step))/6.0f*step;
    }
Здесь предполагается, что в 1 укладывается целое число step.
      float normalizedTime = timer / m_time;
      float speedCoeff = 
  (m_speedCurve.Evaluate(normalizedTime)+
  4.0f*m_speedCurve.Evaluate(normalizedTime+0.5f*Time.deltaTime/m_time)+
  m_speedCurve.Evaluate(normalizedTime+Time.deltaTime/m_time))/6.0f;

      m_from.position += dir * speedMax * speedCoeff * Time.deltaTime / m_time;
      timer += Time.deltaTime;
}:+()___ [Smile]Постоялецwww15 янв. 20182:11#14
FordPerfect
> Интегрировать можно бы и Симпсоном.
Если формула задана сплайном, то можно и точно посчитать.

/ Форум / Программирование игр / Общее

2001—2018 © GameDev.ru — Разработка игр