¿Cuál es la forma más sencilla de calcular la curvatura principal para un triángulo de malla?

19

Tengo una malla y en la región alrededor de cada triángulo, quiero calcular una estimación de las direcciones principales de curvatura. Nunca he hecho este tipo de cosas antes y Wikipedia no ayuda mucho. ¿Puede describirme o señalarme un algoritmo simple que pueda ayudarme a calcular esta estimación?

Suponga que conozco posiciones y normales de todos los vértices.

ap_
fuente

Respuestas:

24

Cuando necesitaba una estimación de la curvatura de la malla para un sombreador de piel, el algoritmo en el que terminé estableciéndome fue este:

Primero, calculé una curvatura escalar para cada borde en la malla. Si el borde tiene posiciones y normales n 1 , n 2 , entonces calculé su curvatura como:p1,p2n1,n2

curvature=(n2n1)(pag2-pag1)El |pag2-pag1El |2

Esto calcula la diferencia en las normales, proyectadas a lo largo del borde, como una fracción de la longitud del borde. (Vea a continuación cómo se me ocurrió esta fórmula).

Luego, para cada vértice, miré las curvaturas de todos los bordes que lo tocaban. En mi caso, solo quería una estimación escalar de la "curvatura promedio", así que terminé tomando la media geométrica de los valores absolutos de todas las curvaturas de los bordes en cada vértice. Para su caso, puede encontrar las curvaturas mínimas y máximas, y tomar esos bordes como las direcciones de curvatura principales (tal vez ortonormalizándolos con el vértice normal). Eso es un poco difícil, pero podría darte un resultado lo suficientemente bueno para lo que quieres hacer.


La motivación para esta fórmula es observar lo que sucede en 2D cuando se aplica a un círculo:

fórmula de curvatura aplicada a dos puntos en un círculo

Suponga que tiene un círculo de radio (por lo que su curvatura es 1 / r ), y tiene dos puntos en el círculo, con sus normales n 1 , n 2 . Las posiciones de los puntos, en relación con el centro del círculo, seránr1/ /rnorte1,norte2 y p 2 = r n 2 , debido a la propiedad de que las normales de un círculo o esfera siempre apuntan directamente desde su centro.pag1=rnorte1pag2=rnorte2

Por lo tanto, puede recuperar el radio como o | p 2 | / | n 2 | . Pero, en general, las posiciones de los vértices no serán relativas al centro del círculo. Podemos solucionar esto restando los dos: p 2 - p 1r=El |pag1El |/ /El |norte1El |El |pag2El |/ /El |norte2El |

pag2-pag1=rnorte2-rnorte1=r(norte2-norte1)r=El |pag2-pag1El |El |norte2-norte1El |curvatura=1r=El |norte2-norte1El |El |pag2-pag1El |

El resultado es exacto solo para círculos y esferas. Sin embargo, podemos extenderlo para hacerlo un poco más "tolerante", y usarlo en mallas 3D arbitrarias, y parece funcionar razonablemente bien. Podemos hacer que la fórmula sea más "tolerante" proyectando primero el vector norte2-norte1 en la dirección del borde, . Esto permite que estos dos vectores no sean exactamente paralelos (como lo están en el caso del círculo); simplemente proyectaremos cualquier componente que no sea paralelo. Podemos hacer esto punteando con el vector de borde normalizado: curvaturapag2-pag1

curvatura=(norte2-norte1)normalizar(pag2-pag1)El |pag2-pag1El |=(norte2-norte1)(pag2-pag1)/ /El |pag2-pag1El |El |pag2-pag1El |=(norte2-norte1)(pag2-pag1)El |pag2-pag1El |2

Et voilà, está la fórmula que apareció en la parte superior de esta respuesta. Por cierto, un buen beneficio adicional de usar la proyección con signo (el producto de puntos) es que la fórmula proporciona una curvatura con signo: positivo para convexo y negativo para superficies cóncavas.


Otro enfoque que puedo imaginar usando, pero que no he probado, sería estimar la segunda forma fundamental de la superficie en cada vértice. Esto se puede hacer estableciendo una base tangente en el vértice, luego convirtiendo todos los vértices vecinos en ese espacio tangente y utilizando mínimos cuadrados para encontrar la matriz 2FF que mejor se ajuste. Entonces, las principales direcciones de curvatura serían los vectores propios de esa matriz. Esto parece interesante ya que podría permitirle encontrar direcciones de curvatura "implicadas" por los vértices vecinos sin ningún borde que apunte explícitamente en esas direcciones, pero, por otro lado, hay mucho más código, más cómputo y quizás menos robusto numéricamente.

Un artículo que adopta este enfoque es Rusinkiewicz, "Estimación de curvaturas y sus derivados en mallas triangulares" . Funciona estimando la matriz 2FF de mejor ajuste por triángulo, luego promediando las matrices por vértice (similar a cómo se calculan las normales suaves).

Nathan Reed
fuente
1
Para su información, si eso es importante, he usado su respuesta aquí blender.stackexchange.com/questions/146819/... pero agregando una ponderación usando el ángulo alrededor de p1. ¿No sabe si lo encuentra valioso? De todos modos, siéntase libre de comentar. Gracias.
limón
19

Solo para agregar otra forma a la excelente respuesta @NathanReed, puede usar la curvatura media y gaussiana que se puede obtener con un discreto Laplace-Beltrami.

vyo

                                         ingrese la descripción de la imagen aquí

UN(vyo)13vj

F(vyo) la función definida por su malla (debe ser una variedad diferenciable) en cierto punto. La discretización más popular del operador de Laplace-Beltrami que conozco es la discretización cotangente y está dada por:

ΔSF(vyo)=12UN(vyo)vjnorte1(vyo)(Cotαyoj+Cotβyoj)(F(vj)-F(vyo))

vjnorte1(vyo)vyo

v

H=12El |El |ΔSvEl |El |

θj

                                        ingrese la descripción de la imagen aquí

La curvatura gaussiana es:

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

Después de todo este dolor, las principales curvaturas discretas están dadas por:

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

Si está interesado en el tema (y para agregar alguna referencia a esta publicación), una lectura excelente es: Operadores discretos de geometría diferencial para colectores triangulares de 2 [Meyer et al. 2003].

Por las imágenes agradezco a mi ex profesor Niloy Mitra, ya que las encontré en algunas notas que tomé para sus conferencias.

cifz
fuente
Ambas respuestas son realmente buenas, fue difícil para mí elegir. Como había preguntado sobre la forma más sencilla, creo que Nathan se lleva el pastel.
ap_
2
Lo que Meyer et al. 2003 no mencionó (quizás explícitamente) cómo calcular la curvatura de los vértices de los bordes. Como han adoptado un enfoque de déficit de ángulo, la curvatura gaussiana para vértices fronterizos debería leerK=(π-jθj)/ /UNmetroyoXmire.
teodron
@teodron ¿Podría tener alguna idea sobre la curvatura media de los vértices de los bordes? ¿Se puede definir tal cosa?
Museful
@Museful Estoy un poco preocupado porque la curvatura media no sea negativa, sin importar el tipo de superficie. Si el operador tipo laplaciano se define en un vértice de borde, entonces se trata de evaluar la misma expresión, incluidos solo los triángulos que forman las caras de la superficie incidente envyo. Sin embargo, hay documentos más recientes sobre curvaturas discretas ...
teodron
-1

@ Nathan-Reed: Solo una pregunta a la respuesta de Nathan-Reed: ¿por qué usaste la media geométrica? ¿Fue porque está "modelado" después de la curvatura gaussiana?

Gabriel
fuente
3
Si tiene una nueva pregunta, hágalo haciendo clic en el botón Hacer pregunta . Incluya un enlace a esta pregunta si ayuda a proporcionar contexto. - De la opinión
Dragonseel