Базовый поиск пути с обходом препятствий в непрерывном 2D-пространстве

Я пишу симуляцию, в которой объект-существо должен иметь возможность двигаться к другому произвольному объекту в окружающей среде, скользя вокруг препятствий, а не выполняя какой-либо разумный поиск пути. Я не пытаюсь заставить его планировать путь — просто двигаться в одном общем направлении и отскакивать от препятствий.

Это двухмерная среда (вид сверху), и каждый объект имеет ограничивающий прямоугольник для обнаружения столкновений. Сетки нет, и я не ищу решение A*.

Я не смог найти никаких руководств по такому «глупому» поиску пути на основе столкновений, поэтому, возможно, я не описываю это, используя самые распространенные термины.

Любые рекомендации о том, как это реализовать (или ссылки на учебники)?


person kpozin    schedule 17.05.2009    source источник


Ответы (5)


Расширяя слова Гийома об избегании препятствий, можно сказать, что для вас хорошо подойдет метод . антигравитационное движение. Вы относитесь к местным препятствиям как к точечным источникам антигравитации, к месту назначения — как к гравитации, и ваш управляемый компьютером персонаж будет скользить (как мыло!) вокруг препятствий, чтобы добраться до места назначения.

person Paul    schedule 17.05.2009
comment
С другой стороны, у вас должно быть антигравитационное поле, которое больше, чем объект, которого нужно избегать, чтобы вы начали поворачивать до того, как транспортное средство окажется на препятствии. Таким образом, у вас может быть конфигурация, в которой вы получаете ускорение, которое идет прямо против желаемого (два препятствия перед вами, отмена каждого бокового ускорения и переопределение прямого ускорения до цели) с положительной стороны, это будет хорошо работать против движущихся препятствий. - person PATRY Guillaume; 18.05.2009
comment
В то время как два препятствия теоретически могут компенсировать друг друга, на практике это маловероятно и нестабильно... всего лишь небольшое изменение положения, и вы обходите препятствие. Если это проблема, вы можете противостоять ей с помощью случайного шума. - person Paul; 19.05.2009
comment
Решение антигравитации выглядит хорошим вариантом в моем случае. Это очень просто, и расчеты тривиальны. Я не требую гарантий, что агенты доберутся до цели с первой попытки, так что ничего страшного, если они будут заблокированы препятствиями (хотя случайное приложение случайных дополнительных сил может решить и эту проблему). - person kpozin; 19.05.2009
comment
Я согласен, что это нестабильно и маловероятно. Я просто упомянул об этом, потому что использовал это решение в случае, когда игроки могли очень точно размещать защиту, и это был чит, который показал наш тест. Я не думал о добавлении случайного шума :( - person PATRY Guillaume; 19.05.2009
comment
Объект может очень легко оказаться застрявшим между другими объектами, такими как две смежные стены. Это не сработало бы для навигации по лабиринту; перемещение вокруг Г-образных зданий и других подобных препятствий. Это было бы неуместно внутри зданий, таких как ИИ в FPS, где им нужно было бы подниматься по лестнице. Однако он подходит для больших открытых пространств с малонаселенными препятствиями. - person MickyD; 26.03.2015

вы можете комбинировать два алгоритма управления:

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

Обход препятствий: вы предвидите будущее транспортного средства, используя поле, длина которого представляет собой постоянное время, умноженное на текущую скорость транспортного средства. Любое препятствие, которое пересекает этот прямоугольник, является потенциальной угрозой столкновения. Ближайшая такая угроза выбирается для избегания. Чтобы объехать препятствие, боковая сила руля прикладывается напротив центра препятствия. Кроме того, прикладывается тормозная (замедляющая) сила. Эти силы зависят от срочности (расстояние от кончика ящика до точки потенциального столкновения). Рулевое управление изменяется линейно, торможение изменяется квадратично.

Дополнительную информацию можно найти на веб-сайте "Управление поведением автономных персонажей".

С уважением

Гийом

PS: это предполагает, что вы используете метод точки/скорости/ускорения для движения объекта.

person PATRY Guillaume    schedule 17.05.2009
comment
Это должен был быть ответ. По крайней мере, он основан на проверенных концепциях, используемых в играх AAA. Плюс Крэйг Рейнольдс классный - person MickyD; 26.03.2015

Возможно, вы могли бы использовать алгоритм Pledge

person Dario    schedule 17.05.2009

Всякий раз, когда ваше существо, движущееся в направлении вектора v, сталкивается со стеной, направление которой представлено вектором w, направление, в котором вам нужно «скользить», задается вектором, являющимся проекцией v на w. Это можно найти с помощью

  v . w
--------- w
 |w|*|w|

где . — это векторное скалярное произведение, а |w| — величина вектора w (= sqrt(w . w)). Если w является единичным вектором, это становится просто

(v . w) w

Использование результирующего вектора в качестве скорости вашего существа будет означать, что ваше существо движется быстро, когда оно просто «задевает» стену, и медленно, когда оно почти врезается в стену. (Именно так большинство шутеров от первого лица управляют столкновениями для игрока-человека.)

Если вместо этого вы хотите, чтобы ваше существо всегда двигалось на полной скорости, вам нужен только знак v . w — вы всегда будете двигаться либо в направлении стены (w), либо в противоположном направлении (-w).

Проблема, с которой вы столкнетесь, заключается в том, что ваше существо врезается в стену в упор. В этом случае ваш спроецированный вектор будет (0, 0), и вам нужна другая техника, чтобы решить, в какую сторону (w или -w) идти. Обычный подход здесь — A*, хотя в этом может не быть необходимости, если ваша среда обладает достаточной структурой.

person j_random_hacker    schedule 17.05.2009

Некоторое время назад я опубликовал алгоритм поиска пути на С#.

Вот ссылка

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

(Текст на испанском языке, но вы можете скачать приложение по ссылке вверху)

person juan    schedule 17.05.2009
comment
чтобы процитировать оригинальный вопрос: я не пытаюсь планировать путь - person Ape-inago; 31.05.2009