OpenGL - простой 2D метод отсечения / окклюзии? - PullRequest
9 голосов
/ 23 сентября 2011

Я работаю над сравнительно небольшой демонстрацией 2D-игр (с видом сверху), используя OpenGL для моей графики.Он идет под основным углом, основанным на невидимости, и поэтому со всеми моими врагами я рисую дугу взгляда, чтобы игрок знал, куда они смотрят.

Пока что одна из моих проблем заключается в том, что когда я рисуюэта дуга взгляда (как заполненный многоугольник), естественно, проходит сквозь любые стены на экране, поскольку ничто не мешает ей:

http://tinyurl.com/43y4o5z

Мне интересно, как мне лучше всего это сделатьпредотвратить что-то подобноеУ меня уже есть код, позволяющий мне обнаруживать пересечения линий со стенами и т. Д. (Для обнаружения вражеского прицела), и я мог бы теоретически использовать его для обнаружения такого случая и соответственно рисовать многоугольник, но это, вероятно, будетдовольно неудобно и / или неэффективно, поэтому я полагаю, что если есть какие-либо встроенные системы OpenGL, которые могут сделать это для меня, то, вероятно, сделали бы это намного лучше.

Я пытался искать вопросы по таким темам, как отсечение /окклюзия, но я даже не уверен, что это именно то, что я должен искать;мои навыки OpenGL ограничены.Похоже, что-либо, использующее, скажем, glClipPlanes или glScissor, не подходит для этого из-за большого количества отдельных стен и т. Д.

Наконец, это просто демонстрация, которую я делаю в своем запасномвремя, так что графика не совсем мое главное беспокойство.Если есть (разумно) безболезненный способ сделать это, то я надеюсь, что кто-то может указать мне правильное направление;если нет простого способа, я могу просто оставить проблему или найти другие обходные пути.

Ответы [ 3 ]

4 голосов
/ 23 сентября 2011

По сути, это проблема слежки.Вот как я могу это сделать:

Для каждой точки по краю вашей дуги проследите (2D) луч от врага в направлении точки, ища пересечения с зелеными прямоугольниками.Если зеленые прямоугольники всегда будут выровнены по оси, математика будет намного проще (ищите пересечение Ray-AABB).Рендеринг точек пересечения в виде веерного треугольника даст вам вашу дугу.

Поскольку вы упомянули, что у вас уже есть код пересечения линии и стены, то до тех пор, пока он сообщит вам расстояние от врага достена, тогда вы сможете использовать ее для прицельной дуги.Не думайте автоматически, что это будет слишком медленно - мы больше не работаем на 486-м.Вы всегда можете уменьшить количество точек по краю дуги, чтобы ускорить процесс.

4 голосов
/ 23 сентября 2011

Я полагаю, если есть какие-нибудь встроенные системы OpenGL, которые могут сделать это для меня, то, вероятно, сделали бы это намного лучше.

OpenGL - это API рисования, а не библиотека обработки геометрии.

На самом деле ваш метод проверки пересечения является правильным способом сделать это.Однако, чтобы ускорить его, вы должны использовать пространственную структуру подразделения.В вашем случае у вас есть что-то, что плачет по дереву Binary Space Partitioning .У деревьев BSP есть приятное свойство: сложность поиска пересечений линии со стенами составляет в среднем около O (log n) , а наихудший случай - O (n log n) ,или, другими словами, BSP Tress очень эффективны.Подробности см. В BSP FAQ http://www.opengl.org//resources/code/samples/bspfaq/index.html

4 голосов
/ 23 сентября 2011

Встроенная в OpenGL обработка окклюзии предназначена для задач 3D, и я не могу придумать простой способ настроить ее для достижения желаемого эффекта.Если бы это был я, я бы решил это с помощью программы фрагментного шейдера, но имейте в виду, что это определенно не подпадает под «(разумно) безболезненный способ сделать это».Вкратце, вы сначала визуализируете двоичную «карту окклюзии», которая черная, где есть стены, и белая в противном случае.Затем вы визуализируете «дугу просмотра», как вы это делаете в настоящее время с фрагментной программой, которая предназначена для поиска от зрителя к целевому местоположению, поиска окклюдера (черный пиксель).Если он находит окклюдер, то он делает этот пиксель «дуги просмотра» прозрачным на 100%.В целом, хотя это и является «правильным» решением, я бы определенно сказал, что это сложная функция, и вы, кажется, в порядке без ее реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...