Как рассчитать вектор нормали на основе нескольких треугольников, имеющих общую вершину?

Если у меня есть сетка из треугольников, как мне вычислить нормали в каждой заданной вершине?

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


person TheBuzzSaw    schedule 13.03.2011    source источник
comment
Вам не нужно нормализовать промежуточные результаты; если вы только нормализуете конечный результат - все хорошо.   -  person Jasper Bekkers    schedule 13.03.2011
comment
Джаспер. Но имейте в виду, что многие матричные вычисления, типичные для этой такой гнилой штуки, требуют, чтобы вы сделали длину 1, прежде чем продолжить. Действуйте осторожно, если вы не успокоитесь до конца.   -  person Fattie    schedule 10.12.2011


Ответы (6)


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

person Nicolas Lefebvre    schedule 14.03.2011

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

При таком подходе большое количество маленьких (тонких) треугольников не дает несбалансированного ответа.

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

person 6502    schedule 13.03.2011

Средневзвешенное значение представляется лучшим подходом.

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

Найдите Смещение треугольной сетки с использованием нескольких векторов нормали вершины, автор SJ Kim, et. al., для получения более подробной информации об этом методе.

person irritate    schedule 13.03.2011

Вы можете придать больший вес большим треугольникам, умножив нормаль на площадь треугольника.

person tibur    schedule 13.03.2011
comment
Фактически такое взвешивание является частью перекрестного произведения. Длина вектора векторного произведения пропорциональна площади треугольников. Так что просто добавьте ненормализованные нормали и нормализуйте только полученную сумму. - person datenwolf; 13.03.2011

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

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

person brainjam    schedule 20.03.2011
comment
Обратите внимание на то, что у вышеуказанного оператора есть проблема, заключающаяся в том, что он не работает на участках с нулевой (или близкой к нулю) средней кривизны (например, плоская плоскость или локальное седло). - person ALoopingIcon; 14.04.2011

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

Если вы основываете его на угле между двумя сторонами, входящими в вершину, вы должны получить правильный вес для каждого треугольника, входящего в него. Было бы удобно, если бы вы могли каким-то образом преобразовать его в 2d, чтобы вы могли уйти от базы на 360 градусов для ваших весов, но, скорее всего, просто используя сам угол в качестве множителя веса для расчета его в трехмерном пространстве, а затем сложите все нормали, полученные таким образом, и нормализация конечного результата должна дать правильный ответ.

person Cdaragorn    schedule 13.03.2011