Равномерное движение по кривой Безье.

Главная Форумы Разработка игр Равномерное движение по кривой Безье.

Просмотр 7 веток ответов
  • Автор
    Сообщения
    • #3846
      Ermitash
      Участник

      Добрый день, решаю проблему несколько дней и пока никак не смог математически ее решить( Как сделать так, чтобы объект двигался равномерно по кривой Безье? Я уже сделал зависимость не от t, а от расстояния кривой и поэтому каждый раз к t прибавляю speed/distance. Проблема заключается в направляющих, если их сделать равной длины и между их крайними точками сделать такую же длину, то точка перемещается равномерно.Равномерное движение Однако в другой случае точка будет перемещаться в одном месте быстрее, а в другом медленнее. Неравномерное движение Может вы решали подобную проблему? И в итоге я не знаю как эту проблему решить. Сначала меня осинило тем, что отношение вот этих длин должно быть равно единице и если не так, то speed/distance надо умножить на это отношение. Домножить Но в итоге получился полный облом, потому что отношение почему-то никак не зависит от положения t на кривой. Так вот, что посоветуете?)

    • #3850
      Ermitash
      Участник

      Почему-то фоточки не хочет грузить.

    • #3859
      Сергей Кормишин
      Хранитель

      Фоточки не загрузило потому что ты вместо урл картинки вставил урл страницы на сайте на котором она отображается… Грубо говоря – урл картинки заканчивается на .png, .Jpg и так далее…
      Пока нет времени без картинок разобраться

    • #3928
      Ermitash
      Участник

      Таак, сорян, был загружен, некрасиво получилось с данной темой. Попробуем еще раз, на этот раз по внятнее.

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

      Пример, когда движение будет равномерное между двумя точками:
      Screenshot_1

      А вот пример неравномерного движения:
      Screenshot_2

      От себя могу добавить, что я решил данную проблему путем избавления от касательных вообще. Написал скрипт, который спавнит новую точку через фиксированный параметр t. В итоге на кривой получается много точек, от себя немного корректируем кривую добавляя новые точки и удаляя не нужные. В итоге пускаем объект с фиксированной скоростью и просто говорим двигаться ему от точки к точке. Однако по мне этот способ и имеет право на жизнь, но все же это костыль по мне. И эту задачу можно решить более деликатно. Слышал про существование других сплайнов, возможно с их помощью можно будет решить данную проблему. Интересно почитать ваше мнение по данному вопросу, возможно вы сталкивались с данной проблемой.

    • #3953
      Сергей Кормишин
      Хранитель

      Привет, давно работал с кривыми, не помню какой аппарат там. Что-то похожее на Lerp, так ведь? Только нелинейный, а хитрый :)

      Предположу что можно делать какую-то дифференциальную корректировку – нужно пересчитывать изменение параметра интерполяции, так чтобы изменение в расстоянии было одинаковое (звучит коряво, но это то что нам нужно – изменение расстояния – первая производная по времени,- скорость). Как-то численно можно решить, мне кажется

    • #3955
      Сергей Кормишин
      Хранитель

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

    • #3957
      Ermitash
      Участник

      Смотрите, я лишь говорю автомобилю двигаться от точки к точке. Автомобиль лишь получает массив с координатами точек и все. Динамическая генерация точек, хмм. Смотрите, допустим автомобиль достиг точки на кривой, ему нужно сгенерировать новую точку, которая заспавнилась бы на опр расстоянии. А как нам это сделать? Допустим если привязаться к t и получить эту точку путем прибавления к предыдущей координате (расстояние между точками/ полное расстояние кривой), то это не будет работать, так как t не равномерно распределяется по кривой. Я сделал так, я взял BezierSolution в Assete, использую его, и просто передаю авто след точку при достижении текущей, вот и все.

      На самом деле хотел бы пообщаться с человеком, который занимался созданием AI автомобиля в проектах ААА уровня. Потому что у меня есть много вопросов, которые я бы на самом деле хотел бы пообсуждать. Например один из них, это решение проблемы скалярного произведения, когда объект находится не на ровной поверхности. Я решил эту проблему путем отображения пути и transform.right автомобиля на поверхность. В итоге все работает, но стоит выставить delta между поворотами колес очень маленькую и он начинает шакалить опять влево вправо, что неправильно. У меня есть предположение, что нужно либо кривые рисовать точнее к поверхности, либо то что при скалярном произведении теряется точность. Воот, может у вас есть такой человек?)

    • #3958
      Сергей Кормишин
      Хранитель

      Не очень понял проблему, знакомого человека который AI для симулятора программировал нету, к сожалению.
      Может стоит на реддите спросить- там много опытных людей сидит, но нужно подробный видос с проблемой записать, чтобы было понятно

Просмотр 7 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.
Понравилась статья? Поделиться с друзьями: