Quelle est la façon la plus simple de calculer la courbure principale d'un triangle maillé?

20

J'ai un maillage et dans la région autour de chaque triangle, je veux calculer une estimation des principales directions de courbure. Je n'ai jamais fait ce genre de choses auparavant et Wikipedia n'aide pas beaucoup. Pouvez-vous me décrire ou pointer vers un algorithme simple qui peut m'aider à calculer cette estimation?

Supposons que je connaisse les positions et les normales de tous les sommets.

ap_
la source

Réponses:

24

Lorsque j'avais besoin d'une estimation de la courbure du maillage pour un shader de peau, l'algorithme sur lequel je me suis installé était le suivant:

Tout d'abord, j'ai calculé une courbure scalaire pour chaque bord du maillage. Si l'arête a les positions p1,p2 et les normales n1,n2 , alors j'ai estimé sa courbure comme:

courbure=(n2-n1)(p2-p1)|p2-p1|2

Cela calcule la différence de normales, projetée le long du bord, en tant que fraction de la longueur du bord. (Voir ci-dessous pour savoir comment j'ai élaboré cette formule.)

Ensuite, pour chaque sommet, j'ai regardé les courbures de tous les bords qui le touchaient. Dans mon cas, je voulais juste une estimation scalaire de la "courbure moyenne", donc j'ai fini par prendre la moyenne géométrique des valeurs absolues de toutes les courbures des bords à chaque sommet. Pour votre cas, vous pouvez trouver les courbures minimale et maximale, et prendre ces bords pour être les directions de courbure principales (peut-être en les orthonormalisant avec le sommet normal). C'est un peu rude, mais cela pourrait vous donner un résultat assez bon pour ce que vous voulez faire.


La motivation de cette formule est de regarder ce qui se passe en 2D lorsqu'il est appliqué à un cercle:

formule de courbure appliquée à deux points d'un cercle

Supposons que vous ayez un cercle de rayon (donc sa courbure est 1 / r ), et que vous ayez deux points sur le cercle, avec leurs normales n 1 , n 2 . Les positions des points, par rapport au centre du cercle, vont être p 1 = r n 1r1/rn1,n2p1=rn1 et , en raison de la propriété que les normales d'un cercle ou d'une sphère pointent toujours directement à partir de son centre.p2=rn2

Par conséquent, vous pouvez récupérer le rayon comme ou | p 2 | / | n 2 |r=|p1|/|n1||p2|/|n2|. Mais en général, les positions des sommets ne seront pas relatives au centre du cercle. Nous pouvons contourner ce problème en soustrayant les deux:

p2-p1=rn2-rn1=r(n2-n1)r=|p2-p1||n2-n1|courbure=1r=|n2-n1||p2-p1|

Le résultat n'est exact que pour les cercles et les sphères. Cependant, nous pouvons l'étendre pour le rendre un peu plus "tolérant", et l'utiliser sur des maillages 3D arbitraires, et cela semble fonctionner assez bien. On peut rendre la formule plus "tolérante" en projetant d'abord le vecteur sur la direction du bord, p 2 - p 1 . Cela permet à ces deux vecteurs de ne pas être exactement parallèles (comme ils le sont dans le cas du cercle); nous projeterons simplement tout composant qui n'est pas parallèle. Nous pouvons le faire en pointillant avec le vecteur de bord normalisé: courburen2-n1p2-p1

courbure=(n2-n1)normaliser(p2-p1)|p2-p1|=(n2-n1)(p2-p1)/|p2-p1||p2-p1|=(n2-n1)(p2-p1)|p2-p1|2

Et voilà, il y a la formule qui est apparue en haut de cette réponse. Soit dit en passant, un avantage intéressant de l'utilisation de la projection signée (le produit scalaire) est que la formule donne alors une courbure signée: positive pour les surfaces convexes et négative pour les surfaces concaves.


Une autre approche que j'imagine utiliser, mais que je n'ai pas essayée, serait d'estimer la deuxième forme fondamentale de la surface à chaque sommet. Cela pourrait être fait en définissant une base tangente au sommet, puis en convertissant tous les sommets voisins dans cet espace tangent, et en utilisant les moindres carrés pour trouver la matrice 2FF la mieux adaptée. Les principales directions de courbure seraient alors les vecteurs propres de cette matrice. Cela semble intéressant car cela pourrait vous permettre de trouver des directions de courbure "impliquées" par les sommets voisins sans aucune arête pointant explicitement dans ces directions, mais d'un autre côté, il y a beaucoup plus de code, plus de calcul et peut-être moins robuste numériquement.

Un article qui adopte cette approche est Rusinkiewicz, «Estimation des courbures et de leurs dérivés sur les maillages triangulaires» . Il fonctionne en estimant la matrice 2FF la mieux ajustée par triangle, puis en faisant la moyenne des matrices par sommet (semblable à la façon dont les normales lisses sont calculées).

Nathan Reed
la source
1
Pour info si cela importe, j'ai utilisé votre réponse ici blender.stackexchange.com/questions/146819/… mais en ajoutant une pondération en utilisant l'angle autour de p1. Je ne sais pas si vous trouvez cela précieux? Quoi qu'il en soit, n'hésitez pas à commenter. Merci.
citron
20

Juste pour ajouter une autre façon à l'excellente réponse @NathanReed, vous pouvez utiliser une courbure moyenne et gaussienne qui peut être obtenue avec un Laplace-Beltrami discret.

vje

                                         entrez la description de l'image ici

UNE(vje)13vj

F(vje)

ΔSF(vje)=12UNE(vje)vjN1(vje)(cotαjej+cotβjej)(F(vj)-F(vje))

vjN1(vje)vje .

v

H=12||ΔSv||

θj

                                        entrez la description de l'image ici

La courbure gaussienne est:

K=(2π-jθj)/UNE

Après toutes ces douleurs, les principales courbures discrètes sont données par:

k1=H+H2-K  et  k2=H-H2-K

Si vous êtes intéressé par le sujet (et pour ajouter une référence à cet article), une excellente lecture est la suivante: Opérateurs à géométrie différentielle discrète pour 2 collecteurs triangulés [Meyer et al. 2003].

Pour les images, je remercie mon ex-professeur Niloy Mitra car je les ai trouvées dans certaines notes que j'ai prises pour ses conférences.

cifz
la source
Les deux réponses sont vraiment bonnes, c'était difficile pour moi de choisir. Depuis que j'avais posé des questions sur la manière la plus simple, je pense que Nathan prend le gâteau.
ap_
2
K=(π-jθj)/UNEmjeXe
@teodron Pourriez-vous avoir une idée de la courbure moyenne des sommets de bordure? Peut-on définir une telle chose?
Museful
vje
-1

@ Nathan-Reed: Juste une question à la réponse de Nathan-Reed: pourquoi avez-vous utilisé la moyenne géométrique? Est-ce parce qu'il est "modélisé" d'après la courbure gaussienne?

Gabriel
la source
3
Si vous avez une nouvelle question, veuillez la poser en cliquant sur le bouton Poser une question . Incluez un lien vers cette question si cela permet de fournir un contexte. - De l'avis
Dragonseel