Está en la página 1de 20

Primitivas Bsicas

Dibujo en 3D
Las libreras grficas antiguas permiten trabajar con puntos 2D (pixels) OpenGL no trabaja con coordenadas de pantalla, sino con coordenadas posicionales dentro del volumen de visualizacin El trasladar toda la escena 3D a la pantalla se realiza automticamente

y
(0,100,0)

(-100,0,0)

(100,0,0)

x
(0,-100,0)

z
glOrtho(-100,100,-100,100,100,-100)

Dibujo de puntos
glBegin(GL_POINTS); glVertex3s (0, 0, 50); glVertex2f (-50.0, 50.0); glEnd();

(-50,50,0)

(0,0,50)

Ajuste del tamao del punto


El tamao por defecto de un punto es 1 pixel Podemos cambiarlo usando:
void glPointSize (Glfloat tamao)

Para conocer qu tamaos soporta nuestra distribucin:


Glfloat dimen[2]; // almacena el rango de tamaos Glfloat paso; // almacena los incrementos de tamao glGetFloatv(GL_POINT_SIZE_GRANULARITY, &paso); glGetFloatv(GL_POINT_SIZE_RANGE, dimen);

Para mejorar la calidad de los puntos:


void glEnable (GL_POINT_SMOOTH)

Dibujo de lneas sueltas


glBegin(GL_LINES); glVertex3s (0, 0, 50); glVertex2f (-50.0, 50.0); glVertex3s (0, 100, 0); glVertex3s (-100, 100, -100); glEnd();
(-100,100,-100)

y
(0,100,0) (-50,50,0)

(0,0,50)

Dibujo de polilneas
glBegin(GL_LINES_STRIP); glVertex3s (0, 0, 50); glVertex2f (-50.0, 50.0); glVertex3s (0, 100, 0); glVertex3s (-100, 100, -100); glEnd();

(-100,100,-100)

y
(0,100,0) (-50,50,0)

(0,0,50)

Para cerrar la polilnea:

glBegin(GL_LINE_LOOP); ... glEnd();

Ajuste del grosor de lnea


El grosor por defecto es 1 pixel Podemos cambiarlo usando:
void glLineWidth (Glfloat ancho)

Para conocer qu tamaos soporta nuestra distribucin:


Glfloat dimen[2]; // almacena el rango de anchos posibles Glfloat paso; // almacena los incrementos de ancho glGetFloatv(GL_LINE_WIDTH_GRANULARITY, &paso); glGetFloatv(GL_LINE_WIDTH_RANGE, dimen);

Patrones de lneas
Para dibujar lneas discontinuas primero hay que activar el modo:
void glEnable (GL_LINE_STIPPLE)

Luego se indica el patrn:


void glLineStipple (GLint factor, GLushort patron)

patron = 0x 5

0101010101010101
factor = 3

Dibujo de tringulos
A partir de ahora, las lneas representan polgonos --> reas La mayora del hardware 3D est optimizado para tringulos

glBegin(GL_TRIANGLES); glVertex2f (-50.0, 50.0); glVertex3s (0, 100, 0); glVertex3s (-100,100,-100); ... glEnd();

(-100,100,-100)

y
(0,100,0)

(-50,50,0)

Caras frontales y posteriores


El sentido anti-horario indica cul es la cara frontal Cada cara puede tener propiedades diferentes

glBegin(GL_TRIANGLES); glVertex3s (); // vrtice V0 glVertex3s (); // vrtice V1 glVertex3s (); // vrtice V2 glVertex3s (); glVertex3s (); glVertex3s (); ... glEnd(); // vrtice V3 // vrtice V4 // vrtice V5

V2

Sentido antihorario

V0 V4

V1

Sentido horario

Para que el sentido sea al revs:


void glFrontFace (GL_CW)

V3

V5

Modos de dibujo
Por defecto, los polgonos se dibujan slidos (sin aristas) Otras opciones son: hueco con aristas o slo mostrando los vrtices Cada cara puede mostrarse de forma diferente
void glPolygonMode (GLenum cara, GLenum modo) GL_BACK GL_FRONT_AND_BACK GL_FRONT GL_FILL

GL_LINE GL_POINT

glPolygonMode (GL_FRONT, GL_FILL)

glPolygonMode (GL_BACK, GL_LINE)

V2

Mallas de tringulos
Para dibujar tiras de tringulos:
V0 V1

glBegin(GL_TRIANGLE_STRIP); glVertex3s (); // vrtice glVertex3s (); // vrtice glVertex3s (); // vrtice glVertex3s (); // vrtice glVertex3s (); // vrtice ... glEnd();

V0 V1 V2 V3 V4 V0

V2

V3

V1 V4

Ventajas:
slo se especifica un vrtice por tringulo mejores efectos de iluminacin al sombrear la superficie total V0

V2

V3

V1

V2

Abanicos de tringulos
Para dibujar abanicos de tringulos:
V0 V1

glBegin(GL_TRIANGLE_FAN); glVertex3s (); // vrtice glVertex3s (); // vrtice glVertex3s (); // vrtice glVertex3s (); // vrtice glVertex3s (); // vrtice ... glEnd();

V0 V1 V2 V3 V4

V3

V2

V0

V1

El vrtice V0 es comn a todos los tringulos

V3

V2

V4

V0

V1

Cuadrilteros
Existe hardware de aceleracin para polgonos de ms de 3 lados
//V0 //V1 //V2 //V3

y
(0,100,0) (-50,50,0) (100, 0,0) (100, 100,0)

glBegin(GL_QUADS); glVertex2s (-50, 50); glVertex2s (100, 0); glVertex2s (100,100); glVertex2s (0,100); ... glEnd();

z
V3

Las caras frontales siguen siendo en el sentido anti-horario

V0 V2

V1

Mallas de cuadrilteros
Para dibujar tiras de cuadrilteros:
V0

V3

V2 glBegin(GL_QUAD_STRIP); glVertex3s (); // vrtice glVertex3s (); // vrtice glVertex3s (); // vrtice glVertex3s (); // vrtice glVertex3s (); // vrtice glVertex3s (); // vrtice ... glEnd(); V0 V1 V2 V3 V4 V5 V2 V5

V1

V4

Ventajas:
slo se especifican dos vrtices por polgono mejores efectos de iluminacin al sombrear la superficie total V1 V0 V3

Polgonos generales
Para cualquier nmero de lados
(-50,50,0)

y
(0,100,0) (100, 100,0)

glBegin(GL_POLYGON); glVertex2s (-50, 50); glVertex2s (0, 0); glVertex2s (100,0); glVertex2s (100,100); glVertex2s (0,100); ... glEnd();

(0,0,0)

(100, 0,0)

//V0 //V1 //V2 //V3 //V4

z
V4

Las caras frontales siguen siendo en el sentido anti-horario

V0

V3

V1

V2

Relleno de polgonos
Para rellenar con un patrn primero hay que activar el modo:
void glEnable (GL_POLYGON_STIPPLE)

Luego se indica el patrn de relleno:


void glPolygonStipple (GLubyte bitmap[32x4])

0x0A

0x94

Reglas para los polgonos


Debido a la optimizacin de los algoritmos internos de OpenGL, existen tres restricciones para los polgonos:
Todos los polgonos deben ser planares Las aristas no deben intersectarse Los polgonos deben ser convexos

Polgonos vlidos

Polgonos no vlidos

Subdivisin y bordes
Un polgono cncavo puede representarse como varios convexos Si se dibuja relleno, los bordes no se apreciarn

Si se dibuja en alambre, podemos indicar qu aristas no queremos ver:

glEdgeFlag(TRUE); // a partir de aqu, las aristas son visibles glVertex3s(); ... glEdgeFlag(FALSE); // a partir de aqu, las aristas no se ven glVertex3s(); ...

Visualizacin de objetos 3D
Las superficies de los objetos estarn formados por varias primitivas Para resolver el problema de visibilidad
glEnable (GL_DEPTH_TEST) glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

Para acelera el proceso, podemos indicar que no se visualizen las caras traseras de los polgonos
glEnable (GL_CULL_FACE)

Para desactivar una opcin activada con glEnable se usa:


glDisable (GL_CULL_FACE)

También podría gustarte