En gráficos por computadora , una tira de triángulos es un subconjunto de triángulos en una malla triangular con vértices compartidos , y es un método más eficiente en memoria p...
Hispanopedia WikiContenido en espanolLectura gratuita
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 usar tiras de triángulos, tendrían que almacenarse e interpretarse como cuatro triángulos separados: ABC, CBD, CDE y EDF. Sin embargo, usando una tira de triángulos, 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 leen 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 usando tiras de triángulos.
OpenGL tiene soporte integrado para tiras de triángulos. La función fija de OpenGL (obsoleta en OpenGL 3.0) tiene soporte para tiras de triángulos usando el modo inmediato y las funciones , , y . Las versiones más recientes admiten tiras de triángulos usando y .glBegin()glVertex*()glEnd()glDrawElementsglDrawArrays
Para dibujar una tira triangular usando el modo inmediato de OpenGL, se debe pasar el argumento , que notifica a OpenGL que se va a dibujar una tira triangular. La familia de funciones especifica las coordenadas de cada vértice de la tira triangular. Para obtener más información, consulte The OpenGL Redbook. [ 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 en sentido horario // La configuración predeterminada para glFrontFace es en sentido antihorario glFrontFace ( 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 solo se necesita un vértice adicional para dibujar el segundo triángulo. En OpenGL, el orden en que se especifican los vértices es importante para que las normales de la superficie sean consistentes.
Dibuja una serie de triángulos (polígonos de tres lados) usando los vértices v0, v1, v2, luego v2, v1, v3 (nótese el orden), luego v2, v3, v4, y así sucesivamente. El orden garantiza que todos los triángulos se dibujen con la misma orientación para que la tira pueda formar parte correctamente de una superficie.
Dibuja un grupo conectado de triángulos. Se define un triángulo por 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 . Se dibujan n – 2 triángulos.
Nótese que n comienza en 1. El ejemplo de código y el diagrama anteriores muestran triángulos dibujados en sentido horario . Para que se consideren orientados hacia el frente, es necesaria una llamada previa a , que de otro modo tiene un valor inicial de (lo que significa que los triángulos dibujados en sentido antihorario están orientados hacia el frente por defecto). [ 5 ] Esto es importante si y ya están activos ( por defecto [ 6 ] ), porque los triángulos orientados hacia atrás se descartará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
Por definición, una subsecuencia de vértices de una tira triangular también representa una tira triangular. Sin embargo, si esta subsecuencia comienza en un vértice par (con numeración base 1), los triángulos resultantes cambiarán su orientación. Por ejemplo, una subsecuencia BCDEF representaría los triángulos BCD, CED y DEF.
De forma similar, invertir 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 y CAB que la tira original). Sin embargo, si una tira tiene un número impar de vértices, la tira invertida representará triángulos con orientación opuesta. Por ejemplo, invertir una tira ABCDE dará como resultado la tira EDCBA, que representa los triángulos EDC, DBC y CBA.
Hasta hace poco, convertir una malla poligonal general en una única tira larga era prácticamente imposible. Normalmente, las tiras triangulares son análogas a un conjunto de bucles de aristas , y los polos del modelo se representan mediante abanicos triangulares . Herramientas como Stripe [ 8 ] o FTSG [ 9 ] representan el modelo como varias tiras. Se ha demostrado que agrupar de forma óptima un conjunto de triángulos en tiras secuenciales es un problema 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 discontinuidades o "saltos" en la tira. Por ejemplo, la malla del diagrama también podría representarse como ABCDDFFEDC, que se interpretaría como los triángulos ABC, CBD, CDD, DDF, DFF, FFE, FED y DEC (los triángulos degenerados están 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 tiras de triángulos siempre se pueden implementar reenviando vértices, algunas API admiten explícitamente esta función. IRIS GL admitía intercambios (invertir dos vértices consecutivos en una tira), una función utilizada por algoritmos antiguos como el algoritmo SGI . Recientemente, OpenGL/DirectX puede renderizar múltiples tiras de triángulos sin triángulos degenerados mediante la función de reinicio primitivo.
↑ Preguntas frecuentes sobre OpenGL / 10 Pruebas de recorte, eliminación de objetos ocultos y visibilidad
↑ Azanli, Elvir. Stripe , consultado el 28 de marzo de 2007.
↑ Xiang, Xinyu. FTSG , consultado el 21 de enero de 2011. (El enlace ya no es válido)
↑ Regina Estkowski, Joseph SB Mitchell, Xinyu Xiang. Descomposición óptima de modelos poligonales en tiras triangulares. En Actas del Simposio sobre Geometría Computacional de 2002. págs. 254-263 url= http://www.ams.sunysb.edu/~jsbm/papers/p151-mitchell.pdf url= http://portal.acm.org/citation.cfm?id=513431