2015-11-01 5 views
0

Я строю 2D-игру, в которой игрок может видеть только объекты, которые не блокируются другими объектами. Рассмотрим этот пример, как он выглядит сейчас:«Инвертирование» вогнутого многоугольника

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

Ray tracing example

Как вы можете видеть, легче район застроен с кучей треугольников, каждый из которых имеет общую точку в позиции игрока. У каждых двух соседей есть две общие точки.

Однако я готов вычислить границы для внешней части полигона, чтобы заполнить его с черным цветом треугольники «скрываются», что игрок не может видеть.

Один из способов сделать это - «замаскировать» черный прямоугольник текущим многоугольником, но я боюсь, что он очень неэффективен.

Любые идеи об эффективном алгоритме для достижения этого?

Спасибо!

+0

по _external_ вы имеете в виду заполнение невидимых областей с треугольников (или полигонов)? –

+0

@willywonka_dailyblah Да, точно. Я тоже задал вопрос, чтобы уточнить это. –

ответ

1

Неаналитическое, грубое решение.

  • Cast лучи с постепенным увеличением полярного угла
  • записи, когда луч первым попадет объект (и точки, где она попадет)
  • Продолжайте идти, пока он больше не попадет в том же объекте (и запись, где он ранее хитов)
  • Используя две записанные точки, построить трапецию, которая простирается до бесконечности (или где)

enter image description here

Предостережения:

  • не работает слишком хорошо с углублениями - нужно включить все точки между ними, а также. Может понадобиться триангуляция Делоне и т. Д. ... беспорядочно! enter image description here

  • Может потребоваться дополнительные состояния для учета предметов, заправленных друг за другом.

enter image description here