Войти
ПрограммированиеФорум2D графика и изометрия

Скорость движения по сплайну

Страницы: 1 2 3 Следующая »
#0
14:11, 14 авг. 2012

Есть сплайн нужно двигать в доль него с одинаковой скоростью. На форуме вроде миллион тем таких но ни в одной нет законченой мысли о том как это сделать. Из того что я понял, рекомендуют найти длину всего сплайна потом разбить его на одинаковые сегменты и двигать по ним, второй способо интерполировать "как то " никто толком не описывает как, хотя это тот же первый способ по сути.  В математике я не сильный спец по этому прошу расписать что за чем делать как можно подробней. В качестве функции пути использовал кубический безье. Пишут что Катмулл-Ром больше годится.


#1
14:36, 14 авг. 2012

Эээ вообще-то математические сплайны как раз таки и рассчитываются от параметра 0.0 < t < 1.0 коий есть координаты точки от шага по длине сплайна. У тебя Безье или что-то другое? Или я что-то упускаю? Статью читал? http://www.gamedev.ru/code/articles/bezier_curve_editor

#2
15:01, 14 авг. 2012

Я этим вопросом не интересовался и ничего не читал по этой теме, но я бы нашел функцию длины пути от t и в соответствии с ней двигал объект.

#3
15:28, 14 авг. 2012

ALPINE
Я бы тоже воспользовался, да не придумал способа найти длину кривой Безье и Катмулл-Рома.

Способ, которым пользуюсь я сейчас: http://www.gamedev.ru/code/forum/?id=164184#m5

#4
17:42, 14 авг. 2012

Я использовал алгоритм Катмулл-Рома для плавного движения по кривой, к сожалению тему где я разбирался с этим, и где было все хорошо "разжевано" удалили.

Вот мой редактор кривых, класс кривой, и функция для плавного перемещения по этой кривой , написано  на C#, но понять алгоритм можно будет.
http://rghost.ru/39779036

Честно я сам уже не помню как это работает, давно не использовал кривые.

#5
19:08, 14 авг. 2012

> потом разбить его на одинаковые сегменты и двигать по ним
не обязательно на равные, главное - линейность

получаем длину всех отрезков x=x1+x2+x3
получаем концы отрезков на данной ломанной y1=x1, y2=x1+x2, y3=x1+x2+x3
находим дистанцию от времени x*t (0.0 < t < 1.0)
находим отрезок в который попали xn=    ?x*t<=y1,    ?x*t<=y2,    ?x*t<=y3
находим длину до точки от начала отрезка L=x*t-yn-1
интерполируем координаты для данной точки start(xs,ys)=0 <= point(?,?)=L <= finish(xf,yf)=xn

т.е. p=L/xn    point(x,?)=xs+(xf-xs)p

вроде так

#6
21:32, 14 авг. 2012

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

#7
1:54, 15 авг. 2012

DinometaElasticGlass
> и рассчитываются от параметра 0.0 < t < 1.0
Проблема в том, что функция для кубического сплайна - кубическая, из-за чего перемещение по нему неравномерно.

Мне кажется, если:
1. Возьмем производную, то у нас получится функция "скорости" движения
2. Найдем экстремум, а именно - самый большой абсолютный максимум.
3. Будем нормировать им значения "скорости" в каждый момент времени найденным максимумом. Тогда нам будет известно, какая часть скорости от максимальной у нас сейчас.
4. Берем обратное значение скорости и умножаем его на величину того константного шага, который у нас был бы, если бы мы не считали ничего, что у нас посчитано.

В этом случае точка будет двигаться с максимальной скоростью весь сплайн.

По идее, должно работать, если кубический сплайн по сути - кубическая функция одной переменной t то должно работать без проблем.

#8
14:49, 15 авг. 2012

Обьясните пожалуйста 3 и 4 пункт я не понимаю зачем они нужны

#9
18:33, 15 авг. 2012

Лёгких путей не ищем - интегралы пустили в ход. Начинаем разбирать задачу сначала. Берём параметр кривой, разбиваем на n частей и гоним с равным шагом времени. Смотрим на скорость и видим кривую. Такая кривая нас не устраивает, но она показывает, на что надо разделить скорость, чтобы получить равномерное движение. Перемещение за шаг это у нас произведение скорости на время, так что просто делим шаг времени в каждой точке на полученное значение кривой скорости в этой же точке. Для этого берём значение расстояние между точками с интервалом в шаг и делим на это расстояние. Получаем нужный шаг параметра в точке по времени, закладываем и любуемся равномерным движением по кривой. Пример на питоне писать?

#10
19:13, 15 авг. 2012

блин, действительно. Что-то я забурился на мешах.

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

#11
20:53, 15 авг. 2012

Алексей Патрашов
> Пример на питоне писать?
Думаю, если человек не совсем испекся этим летом, то должен понять. Мое взятие производной - ваше разбиение на равные отрезки в пределе.

Emissar
> Обьясните пожалуйста 3 и 4 пункт я не понимаю зачем они нужны
По сути, для двумерного случая у нас есть две функции X(t) и Y(t), ограничусь X(t) для Y(t) все точно также.

Задача состоит в том, чтобы выбрать такое dt, чтобы X(t+dt)-X(t) = A, где A = const на всем сплайне. Имея производную d(X(t)) имеем скорость изменения X(t) в заданной точке t. Теперь найдя самую большую скорость на отрезке 0.0<=t<=1.0 и зная скорость в данной точке t, мы можем понять, насколько медленнее мы движемся, относительно самого быстрого места. Значит, нам надо сделать шаг dt такой, чтобы компенсировать это. Умножая dt на обратное от нормированной скорости мы получаем нужное поведение, в местах где скорость мала, dt будет расти, в местах где скорость максимальна, обратная нормированная скорость будет стремится к 1.

Иначе говоря, шаг dt становится больше, если скорость в данной точке низкая.

#12
0:38, 16 авг. 2012

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

#13
1:27, 16 авг. 2012

Emissar
В статье, на которую дал ссылку DinometaElasticGlass есть упрощенная формула для кубических сплайнов:
Изображение
B_3 это вектор в двумерном пространстве, который равен координатам точки при заданных опорных точках и t.

Нормироваться тебе конечно же надо будет относительно корня суммы квадратов скоростей вдоль осей. А ты как думал? Если ты нормируешь X, то поправка будет такая, чтобы движение вдоль X было равномерным, с Y такая же история. Так что расчеты у тебя будет отдельно по осям, а нормировать надо будет вектор.

#14
11:18, 16 авг. 2012

Arc length parametrization называется

Страницы: 1 2 3 Следующая »
ПрограммированиеФорум2D графика и изометрия

Тема в архиве.