Я пытаюсь понять и реализовать механизм полностью трехмерной системы предотвращения столкновений (поведение рулевого управления) для движения в полете (шесть степеней свободы), в настоящее время фокусируясь на обходе статических препятствий (все с формой сферы).
Тем не менее, я не совсем понимаю, как вычислить новый вектор скорости движущегося агента. На рисунке ниже показана сцена. Движущийся агент (зеленый) должен управлять тремя статическими объектами (синий). Красная линия представляет начальный вектор скорости движения вперед.
Обратите внимание, что есть также три белых / полупрозрачных конуса. Они представляют «запрещенные векторы скорости» относительно каждого препятствия. Это означает, что набор векторов скорости, который, если он будет использоваться в качестве новых векторов вперед агента, заставит агента столкнуться с одним или несколькими препятствиями (также обратите внимание, что радиус каждого конуса равен радиусу данного препятствия). плюс радиус агента, чтобы игрок мог смещаться вокруг).
Чтобы выяснить новый вектор движения движущегося агента в такой трехмерной среде, учитывая три препятствия, наивным подходом было бы просто перенести в 3D классическое решение, описанное в этой часто цитируемой статье и иллюстрируемое следующим 2D-изображением:
Там новая скорость (оранжевая стрелка) просто вычисляется путем нормализации минимального расстояния (черная стрелка) между исходной скоростью и центром препятствия, а затем умножения такой нормали на сумму между радиусом препятствия и радиусом движущийся агент. Тогда среднее значение новых скоростей, рассчитанных для каждого из препятствий, даст общую конечную скорость.
Во многих случаях этого достаточно. Тем не менее, обратите внимание на приведенные ниже случаи (например, в 2D для упрощения визуализации):
Во всех из них наивный подход приведет к столкновению. В a и b конечная новая скорость будет совпадать с исходной скоростью (красная стрелка), и движущийся агент будет двигаться вперед, несмотря на то, что он частично или полностью заблокирован. В c) и d) новая скорость (оранжевая стрелка) все равно приведет к тому же следствию.
Итак, мой вопрос: каков наиболее эффективный в вычислительном отношении способ выяснить новый вектор опережения движущегося агента в такой трехмерной среде, учитывая три препятствия, таким образом, чтобы избежать столкновения? Или, другими словами, новый вектор впереди, который:
1) не находится ни в одном из колбочек;
2) максимально приближен к исходному вектору впереди (красная линия на рисунке).
PS: желательно, я не ищу библиотеку, я ищу, как это сделать.