2D отображение теней

Мне было интересно, как реализовать это с помощью openGL:

пример

  1. У меня есть карта, с ровным полом и стенами. Все здесь двухмерное, трехмерной геометрии нет, только двухмерные полигоны, из которых состоит карта.

  2. Используя вершины полигонов, я отбрасываю тени, чтобы определить видимую область.

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

Мне предложили решить эту проблему с помощью карты теней. Я должен визуализировать 2D-сцену в 4 разных 1D-текстуры, которые содержат глубину расстояния до первой сталкивающейся поверхности. Проблема в том, что я понятия не имею, как визуализировать проекцию 2D-сцены в 1D-текстуру. Если я использую, например: gluLookAt (x, y, 0.0, 0.0, x , y+1, 0.0, 0.0, 1.0);

Для рендеринга вида сверху результат по-прежнему 2D. Кроме того, ничего не будет визуализировано, поскольку все вершины будут находиться в одной плоскости, поэтому все поверхности будут ортогональны камере.

Есть ли у вас какие-либо советы или идеи о том, как сделать эти 2D-проекции в 1D? Я искал подобные сценарии в Google, но все они в 3D-среде.


person Leo    schedule 29.03.2013    source источник
comment
Где именно находится источник света, взаимодействующий с отбрасывающими тень?   -  person Sir Digby Chicken Caesar    schedule 29.03.2013
comment
Персонаж является источником света. Назначение теней — имитировать то, что персонаж может видеть с того места, где он стоит.   -  person Leo    schedule 29.03.2013
comment
Разве вы не можете просто отбросить одну из координат, чтобы перейти из 2D в 1D? Это было бы эквивалентно орфографической проекции, верно?   -  person fluffels    schedule 15.04.2013


Ответы (1)


Отображение теней предполагает либо направленный свет, либо прожектор, а у вас есть точечный свет. Но поскольку вам нужна только тень на полу, вы можете смоделировать ее как прожектор, который парит, например. 2 м над полом и направлен вниз. Все стены должны быть высотой не менее 2 м. В первом проходе карты теней вы можете визуализировать пол и все стены в буфер теней.

Однако я бы не стал использовать карты теней, а вместо этого использовал бы объемные тени. Если вы переходите от 3D к 2D, 3D-объем становится 2D-многоугольником.

Предполагая, что все стены расположены на регулярной сетке, мы можем вычислить лучи обзора от позиции игрока P до всех углов стен. Для каждого угла сохраните соседние стены и игнорируйте все стены, обращенные от игрока. Затем направьте лучи из P в каждый угол, преобразуйте лучи в полярные координаты и отсортируйте их по углу, скажем, против часовой стрелки. Теперь пройдитесь по этому отсортированному списку быстрым движением и постройте теневой многоугольник.

Многоугольник теней состоит либо из угловых точек в этом списке, либо из пересечений между а) линией, параллельной стене, и б) линией, проходящей через точку P и угол. Единственное, что делает это немного сложным, это то, что вам нужно найти стену, которая получает тень. Поскольку входные данные настолько малы, я бы, вероятно, начал с грубой силы (проверил угол у каждой стены) и посмотрел, насколько он медленный. Обратите внимание, что только стены, обращенные к игроку, могут отбрасывать тени. Также обратите внимание, что точка, ближайшая к игроку, не обязательно должна быть видимой.

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

person Andreas Haferburg    schedule 14.05.2013