Qual è il modo più semplice per calcolare la curvatura principale per un triangolo mesh?


19

Ho una maglia e nella regione attorno a ciascun triangolo, voglio calcolare una stima delle principali direzioni di curvatura. Non ho mai fatto questo genere di cose prima e Wikipedia non aiuta molto. Puoi descrivermi o indicarmi un semplice algoritmo che può aiutarmi a calcolare questa stima?

Supponiamo che conosca posizioni e normali di tutti i vertici.

Risposte:


24

Quando avevo bisogno di una stima della curvatura della mesh per uno skin shader, l'algoritmo su cui ho finito per sistemarmi era questo:

Innanzitutto, ho calcolato una curvatura scalare per ciascun bordo della mesh. Se il bordo ha posizionip1,p2 e normalin1,n2 , allora ho stimato la sua curvatura come:

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

Questo calcola la differenza nelle normali, proiettata lungo il bordo, come una frazione della lunghezza del bordo. (Vedi sotto per come mi è venuta questa formula.)

Quindi, per ogni vertice ho osservato le curvature di tutti i bordi che lo toccavano. Nel mio caso, volevo solo una stima scalare della "curvatura media", quindi ho finito per prendere la media geometrica dei valori assoluti di tutte le curvature del bordo in ciascun vertice. Nel tuo caso, potresti trovare le curvature minime e massime e considerare quei bordi come le principali direzioni di curvatura (magari ortonormalizzandoli con il vertice normale). È un po 'approssimativo, ma potrebbe darti un risultato abbastanza buono per quello che vuoi fare.


La motivazione di questa formula è guardare cosa succede in 2D quando viene applicato a un cerchio:

formula di curvatura applicata a due punti su un cerchio

Supponiamo di avere un cerchio di raggio (quindi la sua curvatura è 1 / r ) e di avere due punti sul cerchio, con le loro normali n 1 , n 2 . Le posizioni dei punti, relative al centro del cerchio, saranno p 1 = r n 1 e p 2 = r n 2 , a causa della proprietà che un cerchio o le normali della sfera indicano sempre direttamente dal suo centro.r1/rn1,n2p1=rn1p2=rn2

Pertanto è possibile ripristinare il raggio come o | p 2 | / | n 2 | . Ma in generale, le posizioni dei vertici non saranno relative al centro del cerchio. Possiamo aggirare il problema sottraendo i due: p 2 - p 1r=|p1|/|n1||p2|/|n2|

p2p1=rn2rn1=r(n2n1)r=|p2p1||n2n1|curvature=1r=|n2n1||p2p1|

Il risultato è esatto solo per cerchi e sfere. Tuttavia, possiamo estenderlo per renderlo un po 'più "tollerante" e utilizzarlo su mesh 3D arbitrarie e sembra funzionare abbastanza bene. Possiamo rendere la formula più "tollerante" proiettando prima il vettore sulla direzione del bordo, p 2 - p 1 . Ciò consente che questi due vettori non siano esattamente paralleli (come nel caso del cerchio); proietteremo semplicemente via qualsiasi componente che non sia parallelo. Possiamo farlo punteggiando con il vettore di bordo normalizzato: curvaturan2n1p2p1

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

Et voilà, c'è la formula che appare in cima a questa risposta. A proposito, un bel vantaggio laterale dell'utilizzo della proiezione firmata (il prodotto punto) è che la formula dà quindi una curvatura firmata: positiva per convessa e negativa per superfici concave.


Un altro approccio che posso immaginare di usare, ma non ho provato, sarebbe quello di stimare la seconda forma fondamentale della superficie in corrispondenza di ciascun vertice. Questo potrebbe essere fatto impostando una base tangente sul vertice, quindi convertendo tutti i vertici vicini in quello spazio tangente e usando i minimi quadrati per trovare la matrice 2FF più adatta. Quindi le principali direzioni di curvatura sarebbero gli autovettori di quella matrice. Questo sembra interessante in quanto potrebbe farti trovare direzioni di curvatura "implicite" dai vertici vicini senza spigoli che puntano esplicitamente in quelle direzioni, ma d'altra parte c'è molto più codice, più calcolo e forse meno numericamente robusto.

Un documento che adotta questo approccio è Rusinkiewicz, "Stima delle curvature e dei loro derivati ​​su maglie triangolari" . Funziona stimando la matrice 2FF più adatta per triangolo, quindi facendo la media delle matrici per vertice (simile a come vengono calcolate le normali lisce).


1
Cordiali saluti, se è importante, ho usato la tua risposta qui blender.stackexchange.com/questions/146819/… ma aggiungendo una ponderazione usando l'angolo attorno a p1. Non sai se lo trovi prezioso? Comunque sentiti libero di commentare. Grazie.
limone,

19

Solo per aggiungere un altro modo all'eccellente risposta @NathanReed, puoi usare una curvatura media e gaussiana che puoi ottenere con un discreto Laplace-Beltrami.

vi

                                         inserisci qui la descrizione dell'immagine

A(vi)13vj

f(vi)

ΔSf(vi)=12A(vi)vjN1(vi)(cotαij+cotβij)(f(vj)f(vi))

vjN1(vi)vi

v

H=12||ΔSv||

θj

                                        inserisci qui la descrizione dell'immagine

La curvatura gaussiana è:

K=(2πjθj)/A

Dopo tutto questo dolore, le principali curvature discrete sono date da:

k1=H+H2K  and  k2=HH2K

Se sei interessato all'argomento (e per aggiungere qualche riferimento a questo post) una lettura eccellente è: Operatori discreti di geometria differenziale per 2 collettori triangolati [Meyer et al. 2003].

Ringrazio le immagini per il mio ex professore Niloy Mitra che le ho trovate in alcuni appunti che ho preso per le sue lezioni.


Entrambe le risposte sono davvero buone, è stato difficile per me scegliere. Da quando avevo chiesto il modo più semplice, penso che Nathan prenda la torta.
aprile

2
K=(πjθj)/Amixed

@teodron Potresti avere qualche idea sulla curvatura media dei vertici dei bordi? È possibile definire una cosa del genere?
Museful

vi

-1

@ Nathan-Reed: solo una domanda alla risposta di Nathan-Reed: perché hai usato la media geometrica? Fu perché è "modellato" secondo la curvatura gaussiana?


3
Se hai una nuova domanda, chiedila facendo clic sul pulsante Poni domanda . Includi un link a questa domanda se aiuta a fornire un contesto. - Dalla recensione
Dragonseel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.