2016-03-23 6 views
2

Я пытаюсь отобразить объект в openGL (3.3) в стиле wire-frame, но только его острые края (т. Е. Если смежные граничные нормали имеют определенный угол дельта) и его контур/силуэт/граница. Моя структура данных представляет собой треугольную сетку с сохраненными треугольниками и ее вершинами. Я изучил "Hardware Determined Edge Features" by Morgan McGuire and John F. Hughes и "Hardware Generated Object Silhouettes" by Michal Valient оба подсчитали края/лицевые нормали/силуэты онлайн, поэтому они оба должны реализовать некоторое «обходное решение», чтобы иметь возможность использовать GPU для определения края.Извлеките острые края из треугольной сетки и ее контур и визуализируйте его с помощью openGL

Я подумал, что лучше всего определить, когда острые края находятся в автономном режиме, и как-то сохранить эту информацию для последующего рендеринга и определить контур/силуэт/границу объекта в зависимости от точки зрения.

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

Мои вопросы:
Как определить острые края? Или пройти через сетку, создать список смежности и проверить все ребра? (кросс-продукт, чтобы получить лицевые нормали и точечный продукт, чтобы получить угол между ними)
Как сохранить это в хорошем смысле, чтобы впоследствии можно было легко его визуализировать? Создать вырожденные треугольники для тусклых краев? Слишком много информации теряется таким образом? Использовать формат, который хранит строки и нарисовать их? Как их сделать?

Как определить контур/силуэт онлайн?

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

ответ

2

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

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

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

for each triangle t1 
    for each triangle t2 
     if t2 has 2 indices common with t1 then 
      add t2 to t1 adjacency list 
     endif 
    endfor 
endfor 

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

for each triangle t1 
    indexList.append(t1.a, t1.b, t1.c) 
    for each triangle t2 in t1 adjacency 
     idx = find the index not common with t1 
     indexList.append(idx) 
    endfor 
endfor 
+0

Благодарим за отзыв. Насколько я понимаю, острые края остаются острыми краями, независимо от того, что такое «точка зрения» (если отбрасывание задней поверхности используется для опущения обратных частей). Нет? Будет ли хороший способ создать структуру полузадачи, чтобы легко рассчитать смежные граничные грани, а затем сохранить линии, которые являются острыми краями, например. obj-файл и рендеринг через GL_LINES? Только для силуэта необходима «точка зрения», как описано, например, [Здесь] (http://ogldev.atspace.co.uk/www/tutorial39/tutorial39.html). Верный? – Michael

+0

Возможно, посмотрите на эту статью http://e-collection.library.ethz.ch/eserv/eth:4390/eth-4390-01.pdf (обнаружение края сетки), чтобы найти острые края. Тем не менее, вы все равно должны будете работать, чтобы обнаружить контурные линии. Что касается вашего замечания об отбраковке задней поверхности, это выполняется с использованием обмотки треугольника, и это зависит от вывода шейдеров вершин/геометров/тэсов (https://www.opengl.org/wiki/Face_Culling).Это косвенно зависит от точки зрения. – Zouch