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

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

В этой теме 7 ответов, 2 участника, последнее обновление  coremission 2 нед. назад.

  • Автор
    Сообщения
  • #3846

    Ermitash
    Участник

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

    • Тема изменена 1 месяц назад пользователем  Ermitash.
    • Тема изменена 2 нед., 1 день назад пользователем  coremission.
  • #3850

    Ermitash
    Участник

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

  • #3859

    coremission
    Хранитель

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

    • Ответ изменён 1 месяц назад пользователем  coremission.
  • #3928

    Ermitash
    Участник

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

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

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

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

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

    • Ответ изменён 2 нед., 2 дн. назад пользователем  Ermitash.
    • Ответ изменён 2 нед., 2 дн. назад пользователем  Ermitash.
    • Ответ изменён 2 нед., 2 дн. назад пользователем  Ermitash.
    • Ответ изменён 2 нед., 2 дн. назад пользователем  Ermitash. Причина: Вспоминаем HTML ееей
  • #3953

    coremission
    Хранитель

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

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

  • #3955

    coremission
    Хранитель

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

  • #3957

    Ermitash
    Участник

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

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

  • #3958

    coremission
    Хранитель

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

Для ответа в этой теме необходимо авторизоваться.