forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Нелинейное перемещение (http://forum.boolean.name/showthread.php?t=13924)

pax 22.12.2010 15:08

Нелинейное перемещение
 
Разрабатывая редактор cut-сцен столкнулись с задачей сделать перемещение нелинейным.

Исходные данные красная ломаная линия. Необходимо сделать ее плавной (зеленая).


Каждый красный отрезок - это перемещение между ключевыми кадрами. В данный момент на каждом отрезке перемещение идет с одинаковой скоростью, но на каждом отрезке со своей.



Вот от этой ситуации необходимо избавиться в данный момент.

Буду признателен любым советам и ссылкам.

Я пытался сгладить время (сделать время нелинейным), но получается совсем не то, что хотелось.

.Squid 22.12.2010 15:35

Ответ: Нелинейное перемещение
 
Ну, судя по первому графику, все верно - скорость на каждом отрезке разная. По-моему, просто нужно временнЫе точки в нужном месте ставить.
Или тебе надо сделать так, чтобы пользователь грубо наставил этих точек, а они потом автоматически передвинулись так, чтобы скорость на всех отрезках нормализовалась? Если так, то рассчитывай общую среднюю скорость, разделив весь пройденный путь на затраченное время. Затем, имея эту скорость, находи новые временнЫе точки, деля путь каждого отрезка на эту скорость.

pax 22.12.2010 15:45

Ответ: Нелинейное перемещение
 
Не совсем вариант, когда пользователь расставляет ключевые кадры, он не должен больше ничего делать. Т.е. он должен знать, что в данный момент времени в данном ключевом кадре он будет именно в этой позиции. А перемещение от первого ключевого кадра к последнему пройдет без скачков скорости. Поэтому я и хотел сделать нелинейным время,с помощью спланов Catmull-Rom, но получается байда типа этой:

Вместо плавной линии времени. В одном месте даже время назад ходит ))

pax 22.12.2010 15:53

Ответ: Нелинейное перемещение
 
Интересно, как гугл (в гуглодоках) сплайны рисует... возможно его методика подошла бы...

.Squid 22.12.2010 17:24

Ответ: Нелинейное перемещение
 
Мне кажется, что дело все таки не в сплайнах (хотя у тебя и с ними беда).
Или я не понял сути проблемы.
Допустим пользователь ставит три ключевые точки: начало (Н), конец (К), и промежуточная точка (П). Время для каждой точки:
Н - 0.0 с
П - 5.0 с
К - 10.0 с
От Н до П объект преодолевает 100 единиц пространства.
От П до К - 10 единиц.
Ты хочешь, чтобы от Н до П и от П до К объект двигался с одинаковой скоростью?

Я надеюсь, что ты не это имел в виду. Но, судя по описанию в первом посте, именно это.

alcoSHoLiK 22.12.2010 17:31

Ответ: Нелинейное перемещение
 
Идея правильная, надо сделать время нелинейным. Дело остается за малым - подобрать для каждого отрезка такие функции, чтобы вся анимация работала плавно.

Можно воспользоваться кубической кривой Безье. См. пример визуализации по ссылке http://www.the-art-of-web.com/css/timing-function/. Если вариант с ease-in-out выглядит приемлимо, вот пример реализации, который я использовал для собственных нужд:
Код:

inline float bezierCubic(float a, float b, float c, float d, float t)
{
        if (t < 0.f)
                return a;
        else if (t > 1.f)
                return d;
       
        float tt = t * t;
        float ttt = tt * t;
       
        float t2 = 1.f - t;
        float tt2 = t2 * t2;
        float ttt2 = tt2 * t2;
       
        return ttt2 * a + 3.f * t * tt2 * b + 3.f * tt * t2 * c + ttt * d;
}

inline float easeInEaseOut(float a, float b, float t)
{
        return bezierCubic(a, a, b, b, t);
}

Функция easeInEaseOut реализует плавный переход от значения a к значению b при 0.0 <= t <= 1.0.

----

Если такая штука, как сглаживание по отрезкам, не подходит, надо сглаживать всю кривую. Хороший результат в этом случае даст B-сплайн (конкретно, Uniform cubic B-spline). Примера реализации у меня нет, но я точно знаю, что его можно построить таким образом, чтобы получилась плавная кривая, которая тебе нужна. В википедии даже есть пример - http://en.wikipedia.org/wiki/B-splin...ubic_B-splines.

К слову, можно и кубический сплайн Безье заюзать. У меня просто в памяти отложилось из универа еще, что B-сплайны самые плавные получаются.

Если возникнут проблемы с реализацией, отпишись, поразбираемся вместе.

pax 22.12.2010 18:47

Ответ: Нелинейное перемещение
 
Цитата:

Сообщение от .Squid (Сообщение 172842)
Ты хочешь, чтобы от Н до П и от П до К объект двигался с одинаковой скоростью?

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

2alcoSHoLiK Спасибо, посмотрю B-Сплайны

viper86 23.12.2010 11:00

Ответ: Нелинейное перемещение
 
Есть замечательный ресурс AlgLib, в котором множество готовых бесплатных математических библиотек. Здесь про интерполяцию сплайнами http://alglib.sources.ru/interpolation/spline3.php.

pax 23.12.2010 13:22

Ответ: Нелинейное перемещение
 
Сегодня в друг решил спроецировать кривую на ось... и результат полученный мной в первый раз стал казаться верным...


UPD: Эх не математик я, что-то не получается. На ключевых кадрах рывки так и остались...

Igor 23.12.2010 16:31

Ответ: Нелинейное перемещение
 
Возможно, рывки из-за того, что проекция кривой на ось не является плавной
P.S. Просто мне так кажется


Часовой пояс GMT +4, время: 23:44.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot