Script para convertir mallas trianguladas a cuadranguladas (Tris to Quads)

Zuria - 25/10/2006 11:43
Hola, yo la verdad es que de scripts y estas cosas no tengo mucha idea. Así que hago una proposición. Cuando se humilde una Nurbs a poly siempre sale en tris, se podría hacer un scripts que sustiyuya cada 2 tris, (siempre son pares) a un Quad. Esos dos triángulos definen un cuadrado, si se puede saber la posición de los vértices de esos tris tendrán dos comunes y dos diferentes así que, se puede sacer fácilmente la posición de los 4 vértices, no sé, teóricamente no es complicado ¿o sí?
jedihe - 25/10/2006 23:07
En Blender hay un script que hace eso, podrías mirar el código, que está en Python y no debe ser muy difícil de leer. Según leí el otro día, al parecer el algoritmo como tal es bastante eficiente (usa quicksort).
Siquier - 26/10/2006 02:00
[url]http://www.polybost.com/[/url].
HalfVector - 26/10/2006 05:37
En tu caso, pasar de tris a quads no es complicado. Hay varias formas. Una de ellas es utilizar el mecanismo que se describe aquí. Aunque en ese tutorial, el paso de exportar a 3ds no es necesario. Bastaría con hacer un snapshot.

De todas formas, he creado un script que automatiza el proceso del tutorial. Saludos.

-- IMÁGENES ADJUNTAS --

🖼️

Estamos trabajando para mostrar las imágenes del foro

Adjunto #38061

Zuria - 26/10/2006 10:02
Vaya bien, pero mal, no es el problema de este script, al convertir una Nurbs a editmesh o a poly hace triángulos raros, con un plano Nurbs recién hecho, bien plano, funciona bien, pero si movemos algunos puntos y le damos curvatura empiezan a salir cosas raras.
Nessito - 26/10/2006 10:28

En Blender hay un script que hace eso, podrías mirar el código, que está en Python y no debe ser muy difícil de leer. Según leí el otro día, al parecer el algoritmo como tal es bastante eficiente (usa quicksort).

Podrías poner algún enlace de dónde sacar ese código?
jedihe - 26/10/2006 15:59
El script viene con la compilación oficial, pero por si acaso, aquí subo una copia (es GPL, no creo que haya problema al subirlo al foro).

Posdata: tuve que añadirle.txt al final, la extensión original es.py.

Edito: por lo que veo, lo que dice Halfvector es más apropiado, para el caso del 3ds Max, en particular.

-- IMÁGENES ADJUNTAS --

🖼️

Estamos trabajando para mostrar las imágenes del foro

Adjunto #38087

HalfVector - 26/10/2006 20:19
Yo tengo programado un conversor de tris a quads más del estilo de polybost, pero aún hay casos en los que no hace lo que debe. Si logro resolver esos problemas, lo sacaré. Saludos.
Nessito - 27/10/2006 10:00
Vaya half. Y podrías comentar como lo haces? Así a las bravas sin código ni nada, solo algo del estilo: Pues coges los Edges de tal polígono, y luego los vértices de los Edges y le restas los vértices del polígono original y, y demás.

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.
HalfVector - 27/10/2006 13:36

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:

  • 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.[/list]
    [/LIST]
    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.
  • Ballo - 13/12/2006 16:50
    Vaya me molaría que lo sacaras Halfvector. Pues este que has puesto no me ha funcionado. Ahora mismo buscaba algo así, en XSI hay una herramientas bastante molona, por si necesitáis echarle un ojo. Gracias, saludos.