stringtranslate.com

Tira triangular

En gráficos por computadora , una franja de triángulos es un subconjunto de triángulos en una malla de triángulos con vértices compartidos y es un método más eficiente en memoria para almacenar información sobre la malla. Son más eficientes que las listas de triángulos no indexadas , pero normalmente igual de rápidas o más lentas que las listas de triángulos indexadas . [1] [2] La razón principal para utilizar tiras de triángulos es reducir la cantidad de datos necesarios para crear una serie de triángulos. El número de vértices almacenados en la memoria se reduce de 3 N a N + 2 , donde N es el número de triángulos a dibujar. Esto permite un menor uso de espacio en disco , además de acelerar su carga en la RAM .

Diagrama de cuatro triángulos, 1, 2, 3 y 4, con vértices A, B, C, D, E y F.

Por ejemplo, los cuatro triángulos del diagrama, sin utilizar tiras de triángulos, tendrían que almacenarse e interpretarse como cuatro triángulos separados: ABC, CBD, CDE y EDF. Sin embargo, utilizando una franja triangular, se pueden almacenar simplemente como una secuencia de vértices ABCDEF. Esta secuencia se decodificaría como un conjunto de triángulos con vértices en ABC, BCD, CDE y DEF, aunque el orden exacto en que se lean los vértices no será de izquierda a derecha, ya que esto daría como resultado triángulos adyacentes orientados en direcciones alternas. .

Implementación de OpenGL

Modelo de dos triángulos dibujados en OpenGL mediante tiras de triángulos.

OpenGL tiene soporte incorporado para tiras triangulares. La función fija OpenGL (obsoleta en OpenGL 3.0) admite tiras triangulares usando el modo inmediato y las funciones , y . Las versiones más nuevas admiten tiras triangulares usando y .glBegin()glVertex*()glEnd()glDrawElementsglDrawArrays

Para dibujar una franja triangular usando OpenGL en modo inmediato, se debe pasar el argumento , que notifica a OpenGL que está a punto de dibujarse una franja triangular. La familia de funciones especifica las coordenadas de cada vértice de la franja triangular. Para obtener más información, consulte El libro rojo de OpenGL. [3]glBegin()GL_TRIANGLE_STRIPglVertex*()

Para dibujar la franja triangular en el diagrama usando OpenGL en modo inmediato, el código es el siguiente:

 //Los vértices a continuación están en orientación horaria //La configuración predeterminada para glFrontFace es glFrontFace en sentido antihorario ( GL_CW );   glBegin ( GL_TRIANGLE_STRIP ); glVertex3f ( 0.0f , 0.0f , 0.0f ); //vértice 1 glVertex3f ( 0.0f , 0.5f , 0.0f ); //vértice 2 glVertex3f ( 0.5f , 0.0f , 0.0f ); //vértice 3 glVertex3f ( 1.0f , 0.5f , 0.0f ); //vértice 4 glEnd ();                         

Tenga en cuenta que sólo se necesita un vértice adicional para dibujar el segundo triángulo. En OpenGL, el orden en el que se especifican los vértices es importante para que las normales de la superficie sean consistentes.

Citando directamente de la Guía de programación OpenGL :

GL_TRIANGLE_STRIP

Dibuja una serie de triángulos (polígonos de tres lados) usando los vértices v0, v1, v2, luego v2, v1, v3 (observe el orden), luego v2, v3, v4, etc. El orden es para asegurar que todos los triángulos estén dibujados con la misma orientación para que la tira pueda formar correctamente parte de una superficie.

Es aún más claro en las páginas del manual: [4]

Dibuja un grupo conectado de triángulos. Se define un triángulo para cada vértice presentado después de los dos primeros vértices. Para n impar , los vértices n , n + 1 y n + 2 definen el triángulo n . Para n par , los vértices n + 1 , n y n + 2 definen el triángulo n . n se dibujan 2 triángulos.

Tenga en cuenta que n comienza en 1. El ejemplo de código y el diagrama anteriores muestran triángulos dibujados en el sentido de las agujas del reloj. Para que se consideren orientados al frente, es necesaria una llamada anterior a, que de lo contrario tiene un valor inicial de (lo que significa que los triángulos dibujados en sentido antihorario están orientados al frente de forma predeterminada). [5] Esto es importante si y ya están activos ( de forma predeterminada [6] ), porque los triángulos que miran hacia atrás se eliminarán , por lo que no se dibujarán y no aparecerán en pantalla en absoluto. [7]glFrontFace(GL_CW)GL_CCWglEnable(GL_CULL_FACE)glCullFace(GL_BACK)GL_BACK

Propiedades y construcción

De la definición se deduce que una subsecuencia de vértices de una franja triangular también representa una franja triangular. Sin embargo, si esta subfranja comienza en un vértice par (con conteo basado en 1), los triángulos resultantes cambiarán su orientación. Por ejemplo, una subfranja BCDEF representaría triángulos: BCD,CED,DEF.

De manera similar, la inversión de los vértices de las tiras dará como resultado el mismo conjunto de triángulos si la tira tiene un número par de vértices. (por ejemplo, la tira FEDCBA representará los mismos triángulos FED,ECD,DCB,CAB que la tira original). Sin embargo, si una franja tiene un número impar de vértices, entonces la franja invertida representará triángulos con orientación opuesta. Por ejemplo, al invertir una tira ABCDE resultará en una tira EDCBA que representa los triángulos EDC, DBC, CBA).

Hasta hace poco, por lo general no era posible convertir una malla poligonal general en una única franja larga. Por lo general, las tiras triangulares son análogas a un conjunto de bucles de borde , y los polos en el modelo están representados por abanicos triangulares . Herramientas como Stripe [8] o FTSG [9] representan el modelo como varias tiras. Se ha demostrado que agrupar de manera óptima un conjunto de triángulos en tiras secuenciales es NP completo . [10]

Alternativamente, un objeto completo puede describirse como una tira degenerada , que contiene triángulos de área cero que el software o hardware de procesamiento descartará. Los triángulos degenerados introducen efectivamente discontinuidades o "saltos" en la franja. Por ejemplo, la malla en el diagrama también podría representarse como ABCDDFFEDC, que se interpretaría como triángulos ABC CBD CDD DDF DFF FFE FED DEC (triángulos degenerados marcados en cursiva). Observe cómo esta tira primero construye dos triángulos desde la izquierda, luego se reinicia y construye los dos restantes desde la derecha.

Si bien las discontinuidades en las franjas triangulares siempre se pueden implementar reenviando los vértices, las API a veces admiten explícitamente esta característica. IRIS GL admitía Swaps (voltear dos vértices posteriores en una franja), una característica en la que se basaban los primeros algoritmos como el algoritmo SGI . Recientemente, OpenGL/DirectX puede representar múltiples franjas de triángulos sin triángulos degenerados utilizando la función de reinicio primitivo.

Trazado de curvas usando tira triangular

Referencias

  1. ^ "Archivo de documentación".
  2. ^ "Los trucos de la vida: desnudarse o no desnudarse". 31 de enero de 2010.
  3. ^ El libro rojo de OpenGL
  4. ^ "GlComenzar".
  5. ^ glCara frontal
  6. ^ glCullFace
  7. ^ Preguntas frecuentes sobre OpenGL / 10 pruebas de recorte, selección y visibilidad
  8. ^ Azanlí, Elvir. Stripe, consultado el 28 de marzo de 2007.
  9. ^ Xiang, Xinyu. FTSG, consultado el 21 de enero de 2011 (el enlace ya no es válido)
  10. ^ Regina Estkowski, Joseph SB Mitchell, Xinyu Xiang. Descomposición óptima de modelos poligonales en franjas triangulares. En Actas del Simposio sobre Geometría Computacional'2002. pp.254~263 url=http://www.ams.sunysb.edu/~jsbm/papers/p151-mitchell.pdf url=http://portal.acm.org/citation.cfm?id=513431

Ver también