Який найпростіший спосіб обчислити головну кривизну для сітчастого трикутника?


20

У мене сітка, і в області навколо кожного трикутника я хочу обчислити оцінку основних напрямків кривизни. Я ніколи раніше цього не робив, і Вікіпедія не дуже допомагає. Чи можете ви описати або вказати мені на простий алгоритм, який може допомогти мені обчислити цю оцінку?

Припустимо, що я знаю позиції та нормали всіх вершин.

Відповіді:


24

Коли мені знадобилася оцінка кривизни сітки для шейдера шкіри, алгоритм, на якому я закінчився, був такий:

По-перше, я обчислив скалярну кривизну для кожного краю в сітці. Якщо край має положення і нормалі , то його кривизна я оцінила як:n 1 , n 2p1,p2н1,н2

curvature=(n2n1)(p2p1)|p2p1|2

При цьому обчислюється різниця нормалей, що проектується по краю, як частка довжини ребра. (Дивіться нижче, як я придумав цю формулу.)

Потім для кожної вершини я дивився на викривлення всіх ребер, що торкаються її. У моєму випадку я просто хотів скалярну оцінку "середньої кривизни", тому я в кінцевому підсумку взяв середнє геометричне значення абсолютних значень усіх кривих ребер у кожній вершині. У вашому випадку ви можете знайти мінімальну і максимальну кривизни, а ці краї вважати основними напрямками кривизни (можливо, ортонормалізуючи їх з вершиною нормальної). Це трохи грубо, але це може дати вам досить хороший результат для того, що ви хочете зробити.


Мотивація цієї формули - це перегляд того, що відбувається в 2D при застосуванні до кола:

формула кривизни, застосована до двох точок на колі

Припустимо, у вас є коло радіуса (тому його кривизна дорівнює ), і у вас є дві точки на колі з їх нормалами . Положення точок, відносно центру кола, будуть і , завдяки властивості, яку нормалі кола або сфери завжди вказують безпосередньо від її центру.1 / r n 1 , n 2 p 1 = r n 1 p 2 = r n 2r1/rн1,н2p1=rн1p2=rн2

Тому ви можете відновити радіус якабо. Але в цілому позиції вершин не будуть відносно центру кола. Ми можемо обійти це, віднімаючи два: | р 2 | / | n 2 | p 2 - p 1r=|p1|/|н1||p2|/|н2|

p2-p1=rн2-rн1=r(н2-н1)r=|p2-p1||н2-н1|кривизна=1r=|н2-н1||p2-p1|

Результат точний лише для кіл та сфер. Однак ми можемо розширити його, щоб зробити його трохи більш "толерантним" і використовувати його на довільних 3D-сітках, і, здається, він працює досить добре. Ми можемо зробити формулу більш толерантною, спочатку вектор на напрямок краю, . Це дозволяє, щоб ці два вектори не були абсолютно паралельними (як це у випадку кола); ми просто спроектуємо будь-який компонент, який не є паралельним. Це можна зробити, встановивши крапку з нормалізованим ребром вектора: p 2 - p 1 кривизнан2-н1p2-p1

кривизна=(н2-н1)нормалізувати(p2-p1)|p2-p1|=(н2-н1)(p2-p1)/|p2-p1||p2-p1|=(н2-н1)(p2-p1)|p2-p1|2

Et voilà, є формула, яка з’явилася вгорі цієї відповіді. До речі, приємною побічною перевагою використання підписаної проекції (крапкового добутку) є те, що формула надає підписану кривизну: позитивна для опуклих, а негативна для увігнутих поверхонь.


Ще один підхід, який я можу уявити, використовуючи, але не намагався, - це оцінити другу фундаментальну форму поверхні в кожній вершині. Це можна зробити, встановивши дотичну основу у вершині, потім перетворивши всі сусідні вершини в цей дотичний простір і використовуючи найменші квадрати для пошуку найкращої матриці 2FF. Тоді основними напрямками кривизни були б власні вектори цієї матриці. Це здається цікавим, оскільки воно може дозволити вам знайти напрямки кривизни, "натякані" на сусідні вершини, без будь-яких ребер, які явно вказують у цих напрямках, але з іншого боку, це набагато більше коду, більше обчислень і, можливо, менш чисельно надійний.

Документ, який застосовує такий підхід, - Русинкевич, "Оцінка кривизн та їх похідних на трикутних сітках" . Він працює, оцінюючи найкращу матрицю 2FF на трикутник, а потім усереднюючи матриці на вершину (подібно до того, як обчислюються гладкі нормали).


1
FYI, якщо це має значення, я тут використав вашу відповідь blender.stackexchange.com/questions/146819/…, але додав зважування, використовуючи кут навколо p1. Не знаєте, чи вважаєте ви це цінним? У будь-якому разі сміливо коментуйте. Спасибі.
лимон

20

Для того, щоб додати ще один спосіб до відмінної відповіді @NathanReed, ви можете використовувати середню та гауссову кривизну, яку можна отримати за допомогою дискретного Laplace-Beltrami.

Тож припустимо, що околиця з кільцем у вашій сітці виглядає приблизно такvi

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

1А(vi) може бути просто областей трикутників, які утворюють це кільце, і вказаний є однією з сусідніх вершин. vj13vj

Тепер давайте назвемо функцію, визначену вашою сіткою (повинна бути диференційованим колектором) у певний момент. Найпопулярніша дискретизація оператора Лапласа-Белтрамі, про яку я знаю, - це дискретизація котангенсів і надається:f(vi)

ΔSf(vi)=12А(vi)vjN1(vi)(cотαij+cотβij)(f(vj)-f(vi))

Де означає кожну вершину в одному кільцевому районі .vjN1(vi)vi

З цим досить просто обчислити середню кривизну (тепер для простоти давайте назвемо функцію вашої сітки у вершині, що цікавить, просто )v

Н=12||ΔSv||

Тепер введемо кут якθj

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

Гауссова кривизна:

К=(2π-jθj)/А

Після всього цього болю основні дискретні викривлення задаються:

к1=Н+Н2-К  і  к2=Н-Н2-К

Якщо вас цікавить тема (і додати деяку посилання на цю посаду), відмінним прочитанням є: Дискретні диференціально-геометричні оператори для трикутних 2-маніфольдів [Meyer et al. 2003].

За образи я дякую моєму екс-професору Найлою Мітрі, коли я знайшов їх у деяких записках, які я взяв на його лекції.


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

2
Що Meyer et al. 2003 рік (можливо, явно) не згадував про те, як обчислити кривизну прикордонних вершин. Оскільки вони застосували кутовий дефіцитний підхід, Гаусса для прикордонних вершин повинна читати . К=(π-jθj)/Амiхег
теодрон

@teodron Чи можете ви мати уявлення про середню кривизну прикордонних вершин? Чи можна таке визначити?
сумно

@ Задоволений Я трохи переживаю, що середня кривизна не буде негативною, незалежно від типу поверхні. Якщо оператор, подібний до Лаплація, визначений на граничній вершині, то справа в тому, щоб оцінити той самий вираз, включаючи лише трикутники, що складають грані поверхні, що падає на . Однак існують новіші статті про дискретні викривлення ..vi
теодрон

-1

@ Nathan-Reed: Лише запитання до відповіді Натана-Рід: чому ти використав геометричне значення? Це було тому, що воно "моделюється" після Гауссової кривизни?


3
Якщо у вас є нове запитання, будь ласка, задайте його, натиснувши кнопку Задати питання . Додайте посилання на це питання, якщо це допомагає надати контекст. - З огляду
Dragonseel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.