|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
22.12.2010, 15:08
|
#1
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Нелинейное перемещение
Разрабатывая редактор cut-сцен столкнулись с задачей сделать перемещение нелинейным.
Исходные данные красная ломаная линия. Необходимо сделать ее плавной (зеленая).
Каждый красный отрезок - это перемещение между ключевыми кадрами. В данный момент на каждом отрезке перемещение идет с одинаковой скоростью, но на каждом отрезке со своей.
Вот от этой ситуации необходимо избавиться в данный момент.
Буду признателен любым советам и ссылкам.
Я пытался сгладить время (сделать время нелинейным), но получается совсем не то, что хотелось.
|
(Offline)
|
|
22.12.2010, 15:35
|
#2
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Нелинейное перемещение
Ну, судя по первому графику, все верно - скорость на каждом отрезке разная. По-моему, просто нужно временнЫе точки в нужном месте ставить.
Или тебе надо сделать так, чтобы пользователь грубо наставил этих точек, а они потом автоматически передвинулись так, чтобы скорость на всех отрезках нормализовалась? Если так, то рассчитывай общую среднюю скорость, разделив весь пройденный путь на затраченное время. Затем, имея эту скорость, находи новые временнЫе точки, деля путь каждого отрезка на эту скорость.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.12.2010, 15:45
|
#3
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Нелинейное перемещение
Не совсем вариант, когда пользователь расставляет ключевые кадры, он не должен больше ничего делать. Т.е. он должен знать, что в данный момент времени в данном ключевом кадре он будет именно в этой позиции. А перемещение от первого ключевого кадра к последнему пройдет без скачков скорости. Поэтому я и хотел сделать нелинейным время,с помощью спланов Catmull-Rom, но получается байда типа этой:
Вместо плавной линии времени. В одном месте даже время назад ходит ))
|
(Offline)
|
|
22.12.2010, 15:53
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Нелинейное перемещение
Интересно, как гугл (в гуглодоках) сплайны рисует... возможно его методика подошла бы...
|
(Offline)
|
|
22.12.2010, 17:24
|
#5
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Нелинейное перемещение
Мне кажется, что дело все таки не в сплайнах (хотя у тебя и с ними беда).
Или я не понял сути проблемы.
Допустим пользователь ставит три ключевые точки: начало (Н), конец (К), и промежуточная точка (П). Время для каждой точки:
Н - 0.0 с
П - 5.0 с
К - 10.0 с
От Н до П объект преодолевает 100 единиц пространства.
От П до К - 10 единиц.
Ты хочешь, чтобы от Н до П и от П до К объект двигался с одинаковой скоростью?
Я надеюсь, что ты не это имел в виду. Но, судя по описанию в первом посте, именно это.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.12.2010, 17:31
|
#6
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Ответ: Нелинейное перемещение
Идея правильная, надо сделать время нелинейным. Дело остается за малым - подобрать для каждого отрезка такие функции, чтобы вся анимация работала плавно.
Можно воспользоваться кубической кривой Безье. См. пример визуализации по ссылке 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-сплайны самые плавные получаются.
Если возникнут проблемы с реализацией, отпишись, поразбираемся вместе.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.12.2010, 18:47
|
#7
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Нелинейное перемещение
Сообщение от .Squid
Ты хочешь, чтобы от Н до П и от П до К объект двигался с одинаковой скоростью?
|
Нет, на самих отрезках движение равномерное, мне надо неравномерное. Чтобы я прошел весь путь, и при прохождении П не было прыжка скорости.
2alcoSHoLiK Спасибо, посмотрю B-Сплайны
|
(Offline)
|
|
23.12.2010, 11:00
|
#8
|
Нуждающийся
Регистрация: 19.11.2008
Адрес: Украина, Луганск
Сообщений: 72
Написано 34 полезных сообщений (для 123 пользователей)
|
Ответ: Нелинейное перемещение
Есть замечательный ресурс AlgLib, в котором множество готовых бесплатных математических библиотек. Здесь про интерполяцию сплайнами http://alglib.sources.ru/interpolation/spline3.php.
__________________
Лечим заражение... одна пуля - один больной.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо viper86 за это полезное сообщение:
|
|
23.12.2010, 13:22
|
#9
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Нелинейное перемещение
Сегодня в друг решил спроецировать кривую на ось... и результат полученный мной в первый раз стал казаться верным...
UPD: Эх не математик я, что-то не получается. На ключевых кадрах рывки так и остались...
Последний раз редактировалось pax, 23.12.2010 в 14:46.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.12.2010, 16:31
|
#10
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Нелинейное перемещение
Возможно, рывки из-за того, что проекция кривой на ось не является плавной
P.S. Просто мне так кажется
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:14.
|