Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 22.12.2010, 15:08   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Нелинейное перемещение

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

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


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



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

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

Я пытался сгладить время (сделать время нелинейным), но получается совсем не то, что хотелось.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 22.12.2010, 15:35   #2
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Нелинейное перемещение

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

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (22.12.2010)
Старый 22.12.2010, 15:45   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Нелинейное перемещение

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

Вместо плавной линии времени. В одном месте даже время назад ходит ))
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 22.12.2010, 15:53   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Нелинейное перемещение

Интересно, как гугл (в гуглодоках) сплайны рисует... возможно его методика подошла бы...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 22.12.2010, 17:24   #5
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Нелинейное перемещение

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

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

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (22.12.2010)
Старый 22.12.2010, 17:31   #6
alcoSHoLiK
Дэвелопер
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (22.12.2010)
Старый 22.12.2010, 18:47   #7
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Нелинейное перемещение

Сообщение от .Squid Посмотреть сообщение
Ты хочешь, чтобы от Н до П и от П до К объект двигался с одинаковой скоростью?
Нет, на самих отрезках движение равномерное, мне надо неравномерное. Чтобы я прошел весь путь, и при прохождении П не было прыжка скорости.

2alcoSHoLiK Спасибо, посмотрю B-Сплайны
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 23.12.2010, 11:00   #8
viper86
Нуждающийся
 
Аватар для viper86
 
Регистрация: 19.11.2008
Адрес: Украина, Луганск
Сообщений: 72
Написано 34 полезных сообщений
(для 123 пользователей)
Ответ: Нелинейное перемещение

Есть замечательный ресурс AlgLib, в котором множество готовых бесплатных математических библиотек. Здесь про интерполяцию сплайнами http://alglib.sources.ru/interpolation/spline3.php.
__________________
Лечим заражение... одна пуля - один больной.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо viper86 за это полезное сообщение:
.Squid (23.12.2010), pax (23.12.2010)
Старый 23.12.2010, 13:22   #9
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Нелинейное перемещение

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


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

Последний раз редактировалось pax, 23.12.2010 в 14:46.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Igor (23.12.2010)
Старый 23.12.2010, 16:31   #10
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: Нелинейное перемещение

Возможно, рывки из-за того, что проекция кривой на ось не является плавной
P.S. Просто мне так кажется
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com