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:
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= r n1 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= r n2
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- p1rcourbure = 1r= r n2- r n1= r ( n2- n1)= | p2- p1|| n2- n1|= | 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).
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.
La courbure gaussienne est:
Après toutes ces douleurs, les principales courbures discrètes sont données par:
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.
la source
@ 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?
la source