Ради интереса я пытаюсь сделать каркасный просмотрщик для DCPU-16 . Я понимаю, как сделать все, кроме как скрыть линии, которые скрыты в каркас. Все вопросы здесь, касающиеся SO, предполагают, что у вас есть доступ к OpenGL, к сожалению, у меня нет доступа ни к чему подобному для DCPU-16 (или к любому виду аппаратного ускорения).
Я нашел довольно хорошее описание алгоритма Аппеля в Google Книгах . Однако есть одна проблема, с которой мне трудно разобраться.
Аппель определил контурную линию как ребро, разделенное лицевым и обратным многоугольником, или неразделенный край лицевого многоугольника, который не является частью замкнутого многогранника. Край, разделяемый двумя фронтальными многоугольниками, не вызывает изменения видимости и поэтому не является контурной линией. На рис. 8.4 ребра AB, EF, PC, GK и CH являются контурными линиями, а ребра ED, DC и GI - нет.
Я понимаю правила алгоритма и то, как он работает, если у вас есть контурные линии, однако я не понимаю, что мне нужно сделать, чтобы определить, является ли ребро " общим для лицевого и обратного многоугольника", или неразделенный край лицевого многоугольника, который не является частью замкнутого многогранника "с точки зрения кодирования. Я могу посмотреть на форму и узнать, какие линии являются контурными линиями в моей голове, но я понятия не имею, как перенести это «понимание» в кодированный алгоритм.
Обновить
Я добился определенного прогресса в определении контурных линий. Я нашел эти две лекционные заметки из курса Университета Буффало по компьютерной графике.
Рассмотрим края. Они делятся на три категории.
- Край, соединяющий две невидимые грани, сам по себе невидим. Это будет удалено из списка и проигнорировано.
- Кромка, соединяющая две потенциально видимые грани, называется материальной кромкой и требует дальнейшей обработки.
- Ребро, соединяющее потенциально видимую грань и невидимую грань, является частным случаем «материальной кромки» и также называется «контурной кромкой».
Используя две вышеупомянутые части информации, я могу приблизиться к возможности записать это как код, но мне еще предстоит пройти долгий путь.
источник
Ответы:
Чтобы правило «-facing» сохранялось, вы должны убедиться, что все грани правильно ориентированы. Используйте, например, правило правой руки, это означает, что вершины грани должны быть пронумерованы таким образом, чтобы положительное вращение в плоскости грани соответствовало нормальному направлению вне многогранника. (Понятно?) Или, проще говоря, каждое лицо должно прийти со своей направленной наружу нормалью.
Висячие грани, то есть не принадлежащие замкнутому многограннику, можно рассматривать как имеющие неопределенную ориентацию.
Теперь вычисление частей ребра, которые скрыты контурным многоугольником, является основным курсом. Эта проблема очень близка к проблеме отрезания отрезка по многоугольному окну в 2D. Сначала рассмотрим линию поддержки отрезка и найдите пересечения с многоугольником. Используя правило четности, вы можете легко определить части внутри и снаружи многоугольника.
источник