Primitivas en OpenGL

POLÍGONOS

OpenGL permite el manejo de tres tipos de primitivas poligonales, triángulos, rectángulos y polígonos en general.

Las siguientes funciones afectan la manera en que son mostrados los polígonos:

void glFrontFace( enum dir ); : Establece el sentido de winding de los polígonos, dir puede ser CCW (Counter-ClockWise), que indica en sentido anti-manecillas o CW (ClockWise) en sentido manecillas. Se puede entender mas fácilmente si se piensa en la primitiva como si esta fuera a ser dibujada en una hoja, con el plano que forman los vértices, si los puntos de la figura se proveen en sentido anti-manecillas, la cara frontal del polígono estará apuntando hacia fuera de la hoja, de lo contrario (en sentido manecillas) estará apuntando hacia adentro. Es importante tener esto en cuenta debido a que algunas funciones de OpenGL dependen de este comportamiento o lo modifican.

void glShadeModel( enum mode ); : Indica de que manera se deben rellenar de color los polígonos, SMOOTH indica que se debe hacer un degradado de color dependiendo del color de cada vértice y FLAT que no se realizará degradado.

void CullFace( enum mode ); : Indica cual de las caras del polígono no debe ser dibujada en caso de que el estado CULL_FACE esté activo, las opciones son FRONT, BACK y FRONT_AND_BACK, para las caras frontal, posterior y frontal-posterior simultáneamente.

void PolygonMode( enum face, enum mode ); : Modifica la forma en que son dibujados los polígonos, face indica la cara a la que se le cambiaran las propiedades, al igual que CullFace las opciones son FRONT, BACK Y FRONT_AND_BACK, mode indica como se desea presentar el polígono, las opciones son POINT, que muestra solo los vértices, LINE, que muestra las líneas que lo conforman y FILL que muestra la superficie del mismo. El modo por defecto es FRONT_AND_BACK y FILL.

Los siguientes estados están asociados al manejo de las primitivas poligonales:

CULL_FACE : Indica si sobre los polígonos se debe realizar la eliminación de caras, por defecto está deshabilitada.

GL_DEPTH_TEST : Indica si se debe realizar un chequeo de profundidad para eliminar los segmentos de objetos ocultos tras otros objetos. Es sin duda esencial realizar este chequeo para dar sentido de profundidad a la escena. Este estado esta por defecto desactivado.

TRIANGULOS

Sin duda esta es una de las primitivas mas utilizadas, debido a que posee ciertas ventajas sobre los rectángulos y polígonos, por ejemplo, no es posible suministrar tres vértices que no pertenezcan a un mismo plano, mientras que esto si es posible con las otras dos primitivas.

Existen tres tipos posibles de primitivas triangulo en OpenGL, independientes, conectados y en abanico.

5. Triángulos independientes glBegin(GL_TRIANGLES);

Simple, cada tres vértices se genera un nuevo triangulo con la cara frontal determinada por el orden que este activo, bien sea CCW o CW. Evidentemente la cantidad de vértices debe ser 0 o múltiplo de tres, los últimos vértices que no correspondan a ninguna tripleta son despreciados.

Ejemplo

…
glBegin(GL_TRIANGLES);
	glVertex3f(0.0f,0.0f,0.0f);
	glVertex3f(1.0f,0.0f,0.0f);
	glVertex3f(0.0f,1.0f,0.0f);
glEnd();
…

Este ejemplo genera un triangulo rectángulo sobre el plano XY con la cara frontal apuntando hacia Z+ en CCW.

6. Triángulos conectados glBegin(GL_TRIANGLE_STRIP);

Similar a LINE_STRIPS, los primeros tres vértices generan un triangulo y luego cada vértice adicional genera otro que comparte un lado del triangulo anterior, es decir si se suministran los vértices a,b,c,d,e se formarán los triángulos abc , cbd y cde. La razón por la que se invierte el orden de los vértices en algunos triángulos, cbd por ejemplo, es para preservar el winding de la primitiva.

Ejemplo:

…
glBegin(GL_TRIAGLE_STRIP);
glVertex3f(0.0f,0.0f,0.0f);
	glVertex3f(1.0f,0.0f,0.0f);
	glVertex3f(0.0f,1.0f,0.0f);
	glVertex3f(1.0f,1.0f,0.0f);
glEnd();
…

Este fragmento de código dibuja un cuadrado de lado 1 sobre el plano XY, hecho de dos triángulos y con la cara frontal apuntando hacia Z+.

7. Triángulos en abanico glBegin(GL_TRIANGLE_FAN);

Esta primitiva genera un conjunto de triángulos alrededor de un punto común, al igual que TRIANGLE_STRIPS, estos están conectados por un lado. En este caso el proporcionar los vértices a,b,c,d,e generarán los triángulos abc, acd y ade.

Ejemplo:

…
#define PI 3.1415926535897932384626433832795f
...
int n= 2*PI/50;
glBegin(GL_TRIANGLE_FAN);
	glVertex3f(0.0f,0.0f,0.0f);
	for(int seg=0, seg<50;seg++)
{
		glVertex3f(cos(seg*n), sin(seg*n),0.0f);
}
glEnd();
…

Este código dibuja un círculo de radio 1 hecho de n-1 segmentos de triángulo, sobre el plano XY y con la cara frontal hacia Z- en sentido CW.

Ejemplo Triángulos

1 2 3 4

Compartir esta entrada

DiggReddit
  • Jonathan

    ¿Tendrá consecuencias ideológicas, formativas y sociales, la forma de pensar:

    “si luce bien, esta bien”

    ?

    Por cierto, la palabra “está” se acentúa.

  • nolasco

    bueno todo esta bonito
    pero me gustaria que sean mas orientaodos a los codigos bueno yo se mas o menos
    todo lo que e leido buneo ya lo sabia pero quisiera ssaber como dar movientos a cualquier objeto no sobre su propio eje ya sea y,x,z sino
    por ejeplo un carrito que avance en forma horizontal

  • http://black-byte.com/ jotatsu

    En el tutorial “Transformaciones en OpenGL encontrarás algo de información al respecto.

  • darkniel

    excelente trabajo, muy didactico, me sirvio de mucho, gracias

  • rojiza

    Hola
    Aqui les dejo un link donde encontrar algunos ejemplo de programas en opengl

    bueno ami me sirvieron.
    http://openglenc.es.tl

  • Yorjander

    muy buena la informaciu00f3n que se ha publicado, pero seru00eda mu00e1s interesante si pusieru00e1n mas ejemplos de cu00f3digo.