Равномерное движение по кривой Безье.
Главная › Форумы › Разработка игр › Равномерное движение по кривой Безье.
- В этой теме 7 ответов, 2 участника, последнее обновление 6 лет, 4 месяца назад сделано Сергей Кормишин.
-
АвторСообщения
-
-
20 мая, 2018 в 11:25 #3846ErmitashУчастник
Добрый день, решаю проблему несколько дней и пока никак не смог математически ее решить( Как сделать так, чтобы объект двигался равномерно по кривой Безье? Я уже сделал зависимость не от t, а от расстояния кривой и поэтому каждый раз к t прибавляю speed/distance. Проблема заключается в направляющих, если их сделать равной длины и между их крайними точками сделать такую же длину, то точка перемещается равномерно. Однако в другой случае точка будет перемещаться в одном месте быстрее, а в другом медленнее. Может вы решали подобную проблему? И в итоге я не знаю как эту проблему решить. Сначала меня осинило тем, что отношение вот этих длин должно быть равно единице и если не так, то speed/distance надо умножить на это отношение. Но в итоге получился полный облом, потому что отношение почему-то никак не зависит от положения t на кривой. Так вот, что посоветуете?)
-
20 мая, 2018 в 11:29 #3850ErmitashУчастник
Почему-то фоточки не хочет грузить.
-
21 мая, 2018 в 15:23 #3859Сергей КормишинХранитель
Фоточки не загрузило потому что ты вместо урл картинки вставил урл страницы на сайте на котором она отображается… Грубо говоря – урл картинки заканчивается на .png, .Jpg и так далее…
Пока нет времени без картинок разобраться -
6 июня, 2018 в 18:01 #3928ErmitashУчастник
Таак, сорян, был загружен, некрасиво получилось с данной темой. Попробуем еще раз, на этот раз по внятнее.
Как реализовать равномерное движение между двумя точками кривой Безье при неравномерно расположенным направляющим? Суть проблемы заключается в том, что равномерное движение возможно только если длина направляющих равна и если расстояние между двумя конечными точками направляющих является равным. Нужно сделать так, чтобы движение было равномерным при разных касательных.
Пример, когда движение будет равномерное между двумя точками:
А вот пример неравномерного движения:
От себя могу добавить, что я решил данную проблему путем избавления от касательных вообще. Написал скрипт, который спавнит новую точку через фиксированный параметр t. В итоге на кривой получается много точек, от себя немного корректируем кривую добавляя новые точки и удаляя не нужные. В итоге пускаем объект с фиксированной скоростью и просто говорим двигаться ему от точки к точке. Однако по мне этот способ и имеет право на жизнь, но все же это костыль по мне. И эту задачу можно решить более деликатно. Слышал про существование других сплайнов, возможно с их помощью можно будет решить данную проблему. Интересно почитать ваше мнение по данному вопросу, возможно вы сталкивались с данной проблемой.
-
8 июня, 2018 в 05:07 #3953Сергей КормишинХранитель
Привет, давно работал с кривыми, не помню какой аппарат там. Что-то похожее на Lerp, так ведь? Только нелинейный, а хитрый :)
Предположу что можно делать какую-то дифференциальную корректировку – нужно пересчитывать изменение параметра интерполяции, так чтобы изменение в расстоянии было одинаковое (звучит коряво, но это то что нам нужно – изменение расстояния – первая производная по времени,- скорость). Как-то численно можно решить, мне кажется
-
8 июня, 2018 в 12:01 #3955Сергей КормишинХранитель
По идее способ которым ты генерируешь точки равноудаленные можно использовать чтобы каждый кадр определять смещение и не генерировать их заранее
-
8 июня, 2018 в 15:04 #3957ErmitashУчастник
Смотрите, я лишь говорю автомобилю двигаться от точки к точке. Автомобиль лишь получает массив с координатами точек и все. Динамическая генерация точек, хмм. Смотрите, допустим автомобиль достиг точки на кривой, ему нужно сгенерировать новую точку, которая заспавнилась бы на опр расстоянии. А как нам это сделать? Допустим если привязаться к t и получить эту точку путем прибавления к предыдущей координате (расстояние между точками/ полное расстояние кривой), то это не будет работать, так как t не равномерно распределяется по кривой. Я сделал так, я взял BezierSolution в Assete, использую его, и просто передаю авто след точку при достижении текущей, вот и все.
На самом деле хотел бы пообщаться с человеком, который занимался созданием AI автомобиля в проектах ААА уровня. Потому что у меня есть много вопросов, которые я бы на самом деле хотел бы пообсуждать. Например один из них, это решение проблемы скалярного произведения, когда объект находится не на ровной поверхности. Я решил эту проблему путем отображения пути и transform.right автомобиля на поверхность. В итоге все работает, но стоит выставить delta между поворотами колес очень маленькую и он начинает шакалить опять влево вправо, что неправильно. У меня есть предположение, что нужно либо кривые рисовать точнее к поверхности, либо то что при скалярном произведении теряется точность. Воот, может у вас есть такой человек?)
-
8 июня, 2018 в 17:22 #3958Сергей КормишинХранитель
Не очень понял проблему, знакомого человека который AI для симулятора программировал нету, к сожалению.
Может стоит на реддите спросить- там много опытных людей сидит, но нужно подробный видос с проблемой записать, чтобы было понятно
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.