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