Найти правильную скорость поворота ИИ для достижения цели


10

У меня есть корабль, который движется с максимальной скоростью maxSpeedи может поворачиваться на rotationSpeedградусы в секунду. Корабль всегда движется в том направлении, в котором он стоит, что означает, что чем быстрее движется корабль, тем больше его радиус поворота.

Я знаю свою позицию, а также вращение и позицию цели.

Я хотел бы выяснить, находится ли цель в пределах моего радиуса поворота на этой скорости, или лучше, какова максимальная скорость, на которой я могу двигаться, чтобы сделать поворот к цели, не вращаясь вокруг нее постоянно.

Есть ли эффективный (ish) способ сделать это?

Вот что я думаю до сих пор: поскольку я знаю, как далеко я путешествую за шаг и сколько я вращаюсь за шаг, я могу понять, где я буду в следующих двух кадрах. Моя текущая позиция - p1, следующая позиция - p2, затем p3. Я могу взять перпендикулярные биссектрисы (p1, p2) и (p2, p3). Их точка пересечения даст мне центр круга. Затем я могу проверить, находится ли цель в этом круге.

Я не уверен, что это будет работать в 3D (я не уверен, как рассчитать сферу с моими входами). Это решение также не слишком помогает в поиске правильной скорости, с которой нужно двигаться, мне пришлось бы попробовать несколько раз с разными скоростями, чтобы найти приемлемую.

Может кто-нибудь пролить свет на лучшее решение?

Ответы:


17

Есть два способа, которыми управляемый ИИ юнит со связанной скоростью вращения и регулируемой скоростью движения может достичь цели.

Во-первых, давайте рассмотрим проблему, с которой мы сталкиваемся, чтобы мы могли лучше понять ее:

введите описание изображения здесь

Если игрок движется и вращается с постоянной скоростью, пытаясь достичь цели, которая находится справа или слева, он будет двигаться по кругу вечно, никогда не достигая своей цели. Две области, которые игрок обведет, отмечены красным выше.

Круговая область, отмеченная красным, может быть вычислена следующим образом:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

Это приводит к положению и радиусу красных кругов. Мы можем использовать это, чтобы определить, находится ли определенная цель вне досягаемости контролируемого ИИ юнита, если она продолжает поворачиваться в направлении цели.

Чтобы выяснить, находится ли определенный элемент в одном из кругов, мы просто вычисляем расстояние от центра кругов:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

Для этого есть два возможных решения:

1.

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

введите описание изображения здесь

Другой вариант требует немного больше работы для вычисления:

Мы рисуем воображаемую линию между отрядом ИИ и целью. Используя угол между ними:

angle = Math.atan2(goalY - unitY, goalX - unitX);

Теперь вам нужно сделать следующее, чтобы вычислить правильную скорость:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

введите описание изображения здесь

Чтобы заставить его работать в 3-м случае:

Найдите плоскость, на которой находятся следующие три точки:

  1. Цель точка.
  2. Положение блока ИИ в предыдущем кадре.
  3. Текущая позиция блока ИИ.

Вы можете использовать эту плоскость для расчета скорости в 2-м направлении. Вам просто нужно преобразовать точки из их 3d-значений в 2d-значения, встроенные в их общую плоскость.

Вы можете использовать это:

Как преобразовать 3D-точку на плоскости в UV-координаты?


Отлично! Именно ответ я надеялся! Спасибо за ваши подробные объяснения, я думаю, что могу экстраполировать это и использовать его в 3D.
Weichsem

@ weichsem Я обновил ответ. Идея, которую я предложил, состоит в том, чтобы найти общий 2d равный, который они разделяют, и использовать его для вычисления правильной скорости.
AturSams
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.