Пересечение линии с повернутым объектом коллайдера
Я реализую свою собственную библиотеку Raycasting, чтобы узнать, как она работает. В качестве отправной точки у меня есть коробка, которая вращается и, используя лучи, обнаруживает различные препятствия, с которыми она сталкивается на своем пути. Стоит упомянуть: у меня это работает с использованием метода пересечения линии AABB. На следующем изображении показано, как это работает:
Моя проблема возникает, когда я поворачиваю одну из вышеуказанных стен и пытаюсь использовать тот же метод для проверки столкновения лучей:
Столкновение повернутого объекта
Я искал возможное решение, чтобы исправить это, используя различные алгоритмы, такие как теорема о разделяющей оси и Коэн-Сазерленд, но я не смог найти ничего, что работает как пересечение AABB, но с использованием OBB. Любые идеи, как округлить задачу на втором рисунке, где он сталкивается с границами объекта, когда он вращается? Я использую Unity и C#.
1 ответ
Я не думаю, что вы найдете алгоритм, аналогичный AABB для повернутых объектов. Вы можете попытаться повернуть систему координат (т. Е. Весь мир) перед проверкой повернутой стены, чтобы выровнять стену по оси, а затем снова повернуть результат обратно в исходную систему координат, но, по моему мнению, это будет в итоге получится более грязным, чем разложение ваших стен на линии и выполнение тестов пересечения линия-линия.
Также может сработать что-то вроде теоремы о разделяющей оси - луч не является выпуклой оболочкой, поэтому вы не можете использовать алгоритм напрямую, но вы можете использовать аналогичные принципы: спроецируйте точки стены на линию, перпендикулярную лучу, и После этого вы сможете рассчитать расстояния между крайними концами стены и вашим лучом, и так, будет ли стена перекрывать луч. С помощью этой информации вы также сможете рассчитать "тени", которые вы видите на скриншоте. Легче ли это, чем пересечение линия-линия или нет, однако, вы должны убедиться сами!