Извлеките острые края из треугольной сетки и ее контура и визуализируйте ее с помощью openGL

Я пытаюсь визуализировать объект в openGL (3.3) в стиле каркаса, но только его острые края (т. Е. Если нормали к соседней грани имеют определенный угол дельты) и его контур / силуэт / границу. Моя структура данных представляет собой треугольную сетку, в которой хранятся только треугольники и их вершины.
Я смотрел в «Аппаратно определяемые граничные функции» Моргана МакГир и Джона Ф. Хьюза а также
Михал Валиент «Аппаратные силуэты объектов»
оба вычисляют ребра / грани-нормали / силуэты онлайн, поэтому им обоим необходимо реализовать некоторый «обходной путь», чтобы иметь возможность использовать графический процессор для определения ребер.

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

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

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

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

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

2

Решение

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

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

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

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

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

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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]