2D-видимость / свет - эффективное пересечение многоугольника и луча

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

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

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

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

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


person sro5h    schedule 14.07.2015    source источник
comment
возможно, захотите задать этот вопрос на gamedev.stackexchange.com   -  person auburg    schedule 14.07.2015
comment
Хорошо, спасибо за подсказку :)   -  person sro5h    schedule 14.07.2015


Ответы (1)


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

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

person sro5h    schedule 28.07.2015