3D предотвращение столкновений: поиск обновленного вектора скорости (вне конусов «столкновений-скоростей»)


8

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

Тем не менее, я не совсем понимаю, как вычислить новый вектор скорости движущегося агента. На рисунке ниже показана сцена. Движущийся агент (зеленый) должен управлять тремя статическими объектами (синий). Красная линия представляет начальный вектор скорости движения вперед.

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

Обратите внимание, что есть также три белых / полупрозрачных конуса. Они представляют «запрещенные векторы скорости» относительно каждого препятствия. Это означает, что набор векторов скорости, который, если он будет использоваться в качестве новых векторов вперед агента, заставит агента столкнуться с одним или несколькими препятствиями (также обратите внимание, что радиус каждого конуса равен радиусу данного препятствия). плюс радиус агента, чтобы игрок мог смещаться вокруг).

Чтобы выяснить новый вектор движения движущегося агента в такой трехмерной среде, учитывая три препятствия, наивным подходом было бы просто перенести в 3D классическое решение, описанное в этой часто цитируемой статье и иллюстрируемое следующим 2D-изображением:

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

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

Во многих случаях этого достаточно. Тем не менее, обратите внимание на приведенные ниже случаи (например, в 2D для упрощения визуализации):

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

Во всех из них наивный подход приведет к столкновению. В a и b конечная новая скорость будет совпадать с исходной скоростью (красная стрелка), и движущийся агент будет двигаться вперед, несмотря на то, что он частично или полностью заблокирован. В c) и d) новая скорость (оранжевая стрелка) все равно приведет к тому же следствию.

Итак, мой вопрос: каков наиболее эффективный в вычислительном отношении способ выяснить новый вектор опережения движущегося агента в такой трехмерной среде, учитывая три препятствия, таким образом, чтобы избежать столкновения? Или, другими словами, новый вектор впереди, который:

1) не находится ни в одном из колбочек;

2) максимально приближен к исходному вектору впереди (красная линия на рисунке).

PS: желательно, я не ищу библиотеку, я ищу, как это сделать.

Ответы:


1

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

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

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

Это может быть недостаточно хорошо, если объекты не относительно близко друг к другу. Затем вы можете захотеть выполнить некоторую кластеризацию таким образом, чтобы два объекта принадлежали одному кластеру, если это невозможно или, по крайней мере, нетривиально передать между ними. Вычислите кластер объектов с учетом их ограничивающих объемов плюс размер ограничивающего объема игрока плюс некоторый дополнительный запас. Вы можете использовать что-то вроде этого:

http://lab.polygonal.de/?p=120

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

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

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


0

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

Чтобы решить эту проблему, давайте рассмотрим эквивалентную проблему. Возьмите 2D-фрагмент вашей сцены «впереди» вашего пилота самолета, который является нормальным к исходному вектору. То, что вы получите, это точка, представляющая ваш первоначальный вектор, и серия эллипсов, которые являются 2D проекциями ваших конусов окклюзии. Теперь вам нужно найти ближайшую точку к исходной точке (назовем ее P), которая лежит на внешней стороне непересекающихся эллипсов. Оказывается, это довольно сложная проблема для решения. Есть 3 шага:

  • Выясните точки пересечения всех ваших эллипсов
  • Найдите любые дыры в союзе всех ваших эллипсов
  • Найдите ближайшую точку Pна всех ваших эллипсах за пределами соединения (которое может быть внутри отверстия)

Хорошо, все это требует множителей Лагранжа и проверки угла, а также некоторых других действительно сложных вещей, которые нужно решить. Давайте посмотрим на другие варианты. Если вместо этого мы преобразуем нашу задачу в угловое пространство, мы увидим, что на самом деле мы хотим найти минимальное расстояние между точкой и несколькими окружностями, спроецированными на поверхность сферы. В дифференциальной геометрии это часто называют 2-сферой и здесь полезно. Итак, во-первых, нам нужно найти расстояние между двумя точками на поверхности сферы, которое мы будем использовать для метрики 2-сферы. К счастью, это довольно просто: ds^2 = (R^2)*(dth^2) + (R^2)*(sin(th)^2)*(dph^2)где мы сохраняем Rпостоянный радиус нашей 2-сферы, спроецированной в 3-пространство. Исходя из физики, я беру , thчтобы быть углом от положительного zи phбыть углом от позитива xсsбыть на расстоянии.

Что делает это сделать? Это позволяет нам отказаться от использования множителей Лагранжа, чтобы минимизировать расстояние, и позволяет нам работать в «родной» координате (поскольку мы определяем наши конусы в терминах угла окклюзии). Итак, теперь нам нужно найти радиус наших конус-проекций. Давайте пока возьмем один конус и назовем угол, который его определяет a. Радиус проекции тогда просто R*a. Это было достаточно просто - какое еще количество нам нужно знать о шишках? Нам нужно знать центр проекции, который определяется вектором взгляда актера. Сначала мы преобразуем x, yи zв сферические координаты, где мы знаем, что мы на расстоянии R, и решаем для thи ph, что мы можем сделать, просто подключившись к нашим формулам преобразования:th = acos(z/R)и ph = atan2(y/x)(используйте atan2здесь, чтобы учесть квадрантные неоднозначности арктангенса). Процесс такой же, чтобы найти положение вашего исходного вектора в сферических координатах.

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

Сначала я сравнил бы сумму радиусов всех пар окружностей и расстояния между центрами, а затем, если они больше, чем расстояние между центрами, установил их равными и решил для thиphнайти пересечения. Вы знаете, что каждая пара пересечений описывает «запрещенные углы» для рассматриваемой окружности, которые вы должны хранить в виде массива углов точек пересечения (от центра окружности) для каждой окружности, которая пересекает эту окружность - что важно, вы должны » объединить любые диапазоны, которые перекрываются при добавлении их в массив, чтобы следующая часть работала правильно. Затем вы найдете ближайшую точку на краю окружности к исходной точке (что так же просто, как нарисовать линию через центральную точку окружности и исходную точку, а затем найти местоположение на линии в радиусе окружности. от центра). Затем переберите сохраненный массив и проверьте, находится ли этот угол в диапазоне каждого запрещенного угла. Если это так, то выберите ближайший край. Это самая близкая точка снаружи, описанная внутри этого круга. Повторите процесс для всех кругов (некоторая оптимизация может быть выполнена в процессе выбора - вам не нужно рассчитывать это для каждого круга). Теперь сравните все ваши самые короткие расстояния, найдите самые маленькие, и это ваш ответ, описанный в углахthи ph. Помните, что расстояние описывается метрикой 2 сферы при выполнении этого расчета. Поскольку вас не волнует сфера, на которой все это находится, а только углы, вы можете установить R=1и выполнить эти вычисления на единичной сфере.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.