На низкой скорости человек может включить ни копейки. На высокой скорости только очень незначительные повороты не требуют замедления. Скорость и радиус поворота, таким образом, сильно взаимосвязаны.
Насколько человек замедляется при наведении на цель, на самом деле является суждением, а не автоматическим вычислением. Один человек может почти полностью остановиться, резко повернуть и бежать прямо к цели. Другой человек может лишь немного замедлить движение и сделать широкую изогнутую дугу, даже если это увеличивает общую длину до цели. Единственное предостережение в том, что если желаемая цель находится внутри радиуса кривой на текущей скорости, единственный разумный путь - это замедление, так как для ее достижения потребуется широкий круг вдали от цели (вместо того, чтобы обойти ее бесконечно ).
Вот как бы я это сделал. Я прошу прощения за имперские единицы, если вы предпочитаете метрические.
- Самый быстрый человек, когда-либо зарегистрированный, проехал чуть менее 28 миль в час. Каждой из ваших человеческих единиц должна быть назначена личная максимальная скорость от 1 до 28 миль в час.
- Создайте 29-элементную таблицу максимальных скоростей ускорения и замедления человека, движущегося на каждой целой мили в час по прямой линии. Это не должно быть точно - просто приблизительные значения ускорения и замедления для каждого значения. Создайте быстрые, средние, медленные версии таблицы из 29 элементов и назначьте каждого человека в одну из этих таблиц. Выбранная таблица может быть привязана к максимальной скорости устройства, поэтому устройство с максимальной скоростью 10 миль в час будет медленным ускорителем.
- Создайте таблицу из 29 элементов самого острого радиуса, которую человек может повернуть за эту милю в час (0-28).
Теперь, когда вы анимируете каждую человеческую единицу, если у вас есть целевая информация и вы должны выбрать из этого ускорение, задача сложнее. Если вместо этого у вас есть вектор силы, это проще. Давайте начнем с вектора силы.
- Если суммарное ускорение и результирующий угол вектора силы превысит предел способности устройства, ограничьте новый вектор устройства максимально допустимым углом, а также замедлите устройство с максимальной скоростью для его текущей линейной скорости.
- Во время следующего такта, будучи медленнее, он сможет вращаться более резко.
- Если вектор силы может быть полностью согласован, но блок движется медленнее, чем его максимальная скорость для этой кривизны, примените максимальное ускорение, которое имеет блок на этой скорости.
Я знаю, что детали будут довольно сложными, но я думаю, что это хорошее начало.
Для версии пути, где у вас есть цель и вам нужно выбрать силу для применения, проблема немного другая, и даже сложнее. У меня пока нет идей - но достаточно сказать, что, учитывая примерное состояние человека, уже убегающего от цели на максимальной скорости, будет путь наилучшего времени, с одной стороны, достаточно медленный при повороте, чтобы совершить идеальную дугу к цели, и с другой стороны, полностью остановиться, полностью вращаться и бежать прямо к цели.