Я хочу иметь 2D освещение, которое может быть заблокировано внутриигровыми объектами. Моя игра имеет вид сверху вниз, и все игровые объекты описываются прямоугольниками.
Допустим, у меня есть мир 10х10, и я помещаю свет в 1х1 и окружаю его светом. Я хочу видеть источник света 1x1, но не где-нибудь еще, потому что он заблокирован стенами.
Я слышал о работе световых лучей, но как это работает?
opengl
2d
lighting
raycasting
LiquidFeline
источник
источник
Ответы:
Амит Патель написал очень хорошую статью о двухмерном луче.
Это включает в себя наведение лучей на каждую из вершин в пределах диапазона источника света для построения сетки света.
Все наглядные примеры интерактивны в посте и очень просты для понимания.
Вам также не нужно ограничивать себя рамкой, периметр, который вы отслеживаете, может быть любой формы, которая вам нравится.
источник
Вы должны использовать алгоритм лучевого вещания , который означает, что вы должны быть в состоянии вычислить пересечение луча (полулинии) с любым объектом в вашей сцене (линиями, квадратами, кругами, треугольниками ....) и выбрать ближайшее пересечение. Вы излучаете луч во всех направлениях, а затем «рисуете свет» только на ближайший объект.
Вот как это может выглядеть .
источник
Если вы знаете, что такое лучевое приведение, то все, что вам нужно сделать, это жестко закодировать его. Это не слишком сложно, если у вас есть координаты для каждой вершины.
Сначала создайте светоизлучающий объект. Поместите свой свет в координаты х, у.
Это не гарантируется для вогнутого многоугольника, но оно должно работать нормально для любых выпуклых многоугольников.
Это сработает, если ваши затененные объекты (стены, персонажи, летающие фиолетовые пожиратели людей) будут окрашены на экране после применения освещения. В противном случае половина стены будет выглядеть значительно ярче, чем другая половина. Если ваш точечный источник света находится на одинаковом расстоянии от двух пар вершин одной стены (ровно в два раза меньше высоты вашей стены), примените треугольник к двум ближайшим вершинам, а не к двум, находящимся дальше.
Я должен также упомянуть, что этот метод требует динамически создаваемой точки вершины, где край радиуса света встречается с поверхностью затеняющего объекта. Это создает как минимум 3 вершины для любого перекрывающего объекта и позволит стенам, которые простираются за радиус света (или за пределы экрана), также блокировать любой свет.
Больше информации о вогнутых и выпуклых многоугольниках
источник