Нелинейное перемещение
Разрабатывая редактор cut-сцен столкнулись с задачей сделать перемещение нелинейным.
Исходные данные красная ломаная линия. Необходимо сделать ее плавной (зеленая). Каждый красный отрезок - это перемещение между ключевыми кадрами. В данный момент на каждом отрезке перемещение идет с одинаковой скоростью, но на каждом отрезке со своей. Вот от этой ситуации необходимо избавиться в данный момент. Буду признателен любым советам и ссылкам. Я пытался сгладить время (сделать время нелинейным), но получается совсем не то, что хотелось. |
Ответ: Нелинейное перемещение
Ну, судя по первому графику, все верно - скорость на каждом отрезке разная. По-моему, просто нужно временнЫе точки в нужном месте ставить.
Или тебе надо сделать так, чтобы пользователь грубо наставил этих точек, а они потом автоматически передвинулись так, чтобы скорость на всех отрезках нормализовалась? Если так, то рассчитывай общую среднюю скорость, разделив весь пройденный путь на затраченное время. Затем, имея эту скорость, находи новые временнЫе точки, деля путь каждого отрезка на эту скорость. |
Ответ: Нелинейное перемещение
Не совсем вариант, когда пользователь расставляет ключевые кадры, он не должен больше ничего делать. Т.е. он должен знать, что в данный момент времени в данном ключевом кадре он будет именно в этой позиции. А перемещение от первого ключевого кадра к последнему пройдет без скачков скорости. Поэтому я и хотел сделать нелинейным время,с помощью спланов Catmull-Rom, но получается байда типа этой:
Вместо плавной линии времени. В одном месте даже время назад ходит )) |
Ответ: Нелинейное перемещение
Интересно, как гугл (в гуглодоках) сплайны рисует... возможно его методика подошла бы...
|
Ответ: Нелинейное перемещение
Мне кажется, что дело все таки не в сплайнах (хотя у тебя и с ними беда).
Или я не понял сути проблемы. Допустим пользователь ставит три ключевые точки: начало (Н), конец (К), и промежуточная точка (П). Время для каждой точки: Н - 0.0 с П - 5.0 с К - 10.0 с От Н до П объект преодолевает 100 единиц пространства. От П до К - 10 единиц. Ты хочешь, чтобы от Н до П и от П до К объект двигался с одинаковой скоростью? Я надеюсь, что ты не это имел в виду. Но, судя по описанию в первом посте, именно это. |
Ответ: Нелинейное перемещение
Идея правильная, надо сделать время нелинейным. Дело остается за малым - подобрать для каждого отрезка такие функции, чтобы вся анимация работала плавно.
Можно воспользоваться кубической кривой Безье. См. пример визуализации по ссылке 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) ---- Если такая штука, как сглаживание по отрезкам, не подходит, надо сглаживать всю кривую. Хороший результат в этом случае даст B-сплайн (конкретно, Uniform cubic B-spline). Примера реализации у меня нет, но я точно знаю, что его можно построить таким образом, чтобы получилась плавная кривая, которая тебе нужна. В википедии даже есть пример - http://en.wikipedia.org/wiki/B-splin...ubic_B-splines. К слову, можно и кубический сплайн Безье заюзать. У меня просто в памяти отложилось из универа еще, что B-сплайны самые плавные получаются. Если возникнут проблемы с реализацией, отпишись, поразбираемся вместе. |
Ответ: Нелинейное перемещение
Цитата:
2alcoSHoLiK Спасибо, посмотрю B-Сплайны |
Ответ: Нелинейное перемещение
Есть замечательный ресурс AlgLib, в котором множество готовых бесплатных математических библиотек. Здесь про интерполяцию сплайнами http://alglib.sources.ru/interpolation/spline3.php.
|
Ответ: Нелинейное перемещение
Сегодня в друг решил спроецировать кривую на ось... и результат полученный мной в первый раз стал казаться верным...
UPD: Эх не математик я, что-то не получается. На ключевых кадрах рывки так и остались... |
Ответ: Нелинейное перемещение
Возможно, рывки из-за того, что проекция кривой на ось не является плавной
P.S. Просто мне так кажется |
Часовой пояс GMT +4, время: 23:44. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot