Вычисление нормалей вершин в триангулированной геометрии с обнаружением ребер

Нет дубликата Самый эффективный алгоритм для вычисления нормалей вершин из набора треугольников для затенения по Гуро, так как проблема обнаружения ребер не обсуждается.

Как вычислить нормали для каждой вершины в триангулированной геометрии, чтобы использовать их в шейдере Гуро для хорошего отображения, но с отслеживанием краев? Есть ли для этого бесплатное, быстрое и эффективное стандартное решение?

Мне поручили вышеупомянутую задачу исправить процедуру, которая производит видимые артефакты. Нормали должны быть входными данными для простого шейдера Гуро, чтобы «сгладить» отображаемую геометрию на согласованной грани. Подпрограмма также должна иметь возможность находить края, чтобы их можно было использовать позже в какой-либо другой части программного обеспечения и не «сглаживать».

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

Так выглядит геометрия без интерполяции:

введите описание изображения здесь

Вот что до сих пор делает алгоритм интерполяции:

введите описание изображения здесь

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

Интересно, есть ли для этого стандартное решение, так как эта проблема должна возникать довольно часто при работе с таким типом геометрии. И даже если нет, знает ли кто-нибудь из вас общие проблемы с этой задачей и как их избежать, чтобы получить достойные результаты?

Любая помощь приветствуется!

Изменить: Об алгоритме: обнаружение края - это не только нормальный треугольник. Рассмотрим следующий пример (проблема практически такая же в 3D):

Определение края нормального угла треугольника

Все вершины имеют одинаковый угол, то есть 30 °. (Углы не совсем правильные, но вы поняли ...) Однако только два внешних из них должны распознаваться как край, поэтому для этого вопроса должен быть другой критерий. До сих пор я пробовал треугольник

  1. радиус описанной окружности
  2. самый длинный край
  3. Показатель качества треугольника GTS

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


person Brokenmind    schedule 03.06.2014    source источник
comment
Что вы имеете в виду под обнаружением края? Может быть, если два треугольника, которые имеют общую границу, имеют достаточно разные нормали к поверхности (например, достаточно маленький точечный продукт), то считается, что между ними есть жесткое ребро, в противном случае - нет?   -  person j_random_hacker    schedule 04.06.2014
comment
В любом случае, я думаю, что вам нужно посмотреть на твердые ребра вокруг данной вершины v по часовой стрелке и рассмотреть их для разделения треугольников, касающихся v, на 1 или более частей, каждая из которых состоит из пути из треугольников, в котором смежные треугольники на пути имеют плавный край. Затем для каждой части раздела вам нужно вычислить отдельную нормаль вершины для v и использовать ее для затенения по Гуро этой части. Это работает, если на v нет резких граней, или если их 2 или более - единственный проблемный случай, если есть ровно 1, и тогда я не знаю, что нужно делать.   -  person j_random_hacker    schedule 04.06.2014
comment
@j_random_hacker - ›первый комментарий: Верно, но, к сожалению, решение о том, разделяют ли они твердую грань, зависит не только от нормы, но и от размеров треугольников. И - ›второй комментарий, именно в этом и проблема. Теперь, когда я могу публиковать изображения, я подробно остановлюсь на том, что делал до сих пор, возможно, проблема станет более ясной.   -  person Brokenmind    schedule 04.06.2014
comment
Вы пробовали расстояние до противоположной вершины ребра?   -  person Nico Schertler    schedule 04.06.2014


Ответы (1)


Об этом есть общедоступная публикация от Cal-Tech в форме технического отчета под названием "Дискретные операторы дифференциальной геометрии для триангулированных двумерных многообразий".

Предложенные алгоритмы предлагают

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

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

person tmaric    schedule 04.06.2014