Tris a quads

Oshe half. Y podrías comentar como lo haces? Así a las bravas sin código ni nada, solo algo del estilo: Es que he estado partiéndome la cabeza para encontrar una manera de determinar por topología cuáles son los Edges que sobran en una malla de tris y no encuentro un caso que funcione siempre.

Vaya es que no sé yo si existirá la forma de encontrar una forma que funcione siempre y te deje la malla con los quads tal y como esperas que debería dejarlos.

El método que yo utilicé (que no es que esté demasiado probado) deja triángulos sin convertir (algunos de ellos incomprensiblemente). Aunque bien es cierto que puede ser de gran ayuda ya que la gran mayoría de los triángulos sí te los quita de en medio. Luego es cuestión de refinar un poco a mano.

Lo que yo hago es hacer dos tests. Uno es el de la arista más larga y el otro el del ángulo que forman las normales de dos caras.

Más o menos es lo siguiente:

  • declaro un array que contendrá las aristas a eliminar.
  • por cada cara del modelo.
    • la descarto si se trata de una cara de más de 3 lados.
    • recojo su normal.
    • recojo las aristas de la cara.
    • declaro una variable para almacenar la máxima longitud de la arista y otra variable para la arista con dicha longitud.
    • por cada arista de la cara.
      • se calcula la longitud de la arista.
      • comparamos la longitud de la arista actual con la anterior. Si es mayor, actualizo variables.
    • una vez he recorrido todas las aristas, cojo las caras que utilizan la arista más larga que hemos determinado en el bucle anterior (una de ellas será la que estamos recorriendo actualmente, evidentemente).
    • recojo la normal de la cara restante.
    • calculo el ángulo que forman la normal de la cara actual y la normal de la cara contigua. Si es menor que un threshold que asigna el usuario, añadimos la arista al array que contendrá las aristas a eliminar.

El principal problema es que se deja algunos triángulos que aparentemente no debería dejar. Y el otro es cuando se encuentra con un polo, es decir, una serie de aristas conectadas a un mismo vértice (el ejemplo típico es el polo de las esferas). Para este caso creé un método especial que consistía en primero detectar el polo, claro, y luego seleccionar las aristas del polo de forma alterna. De esta forma se forman quads (aunque si el número de aristas conectadas al polo es impar, siempre quedaría un triángulo).

En fin, que esto sólo es una orientación. Para conseguir resultados más óptimos sería conveniente hacer más tests (por ejemplo, el script que ha puesto Jedihe parece tener en cuenta el área del Quad que se formaría para saber si es válido o no). Saludos.