2D-Visibility / Light — Эффективное пересечение полигонов и лучей

Я пытаюсь написать игру в 2D с Sfml. Для этой игры мне нужен Lightengine и некоторый код, который может дать мне область мира, которая видна игроку. Поскольку обе проблемы очень хорошо сочетаются друг с другом (практически одинаковы), я хотел бы решить обе проблемы одновременно.
Мой мир будет загружен из файлов, в которых хитбоксы объектов будут представлены в виде полигонов.
Теперь я написал некоторый код, который берет список полигонов и направление луча, который следует за мышью и находит самое близкое пересечение с любым из этих многоугольников.
Следующим шагом теперь будет отбрасывание лучей от игроков или источников света к краям многоугольников, а также смещение лучей на + -0,000001 радиана, чтобы определить видимую область и вернуть ее в виде многоугольника.

Проблема, однако, в том, что мой алгоритм (он вычисляет пересечение между двумя строками с векторной математикой) слишком медленный.
В моем очень хорошем ПК я получаю 100fps с 300 egdes и одним Ray.

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

Мой вопрос сейчас: было бы значительно быстрее триангулировать полигоны один раз при загрузке карты, а затем использовать пересечение лучей и треугольников, или есть какой-нибудь лучший способ, который вы знаете, чтобы решить мою проблему?
Я также слышал об ограничивающих иерархиях Volumemen, но я не знаю, какое влияние это окажет.

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

1

Решение

Для всех, кто ищет решение, я наконец выбрал:

Я обнаружил физический движок Box2D и теперь использую функцию b2World :: RayCast (…), чтобы определить, попадает ли луч в мою сцену и где именно.
На данный момент все работает нормально и гладко (пока не сделал точного теста) 🙂
http://www.iforce2d.net/b2dtut/world-querying
Я получил его на работу с помощью этого сайта
Хорошего дня! 🙂

1

Другие решения


По вопросам рекламы [email protected]