Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio...

34
Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad de Ciencias - Departamento de Informática y Automática Universidad de Salamanca 2 de Mayo de 2007

Transcript of Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio...

Page 1: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Dibujar en 3D: puntos, líneas y polígonos.

Informática gráficaIngeniería Informática

Antonio Lillo SanzCarlos Muñoz Martín

Javier Holguera Blanco

Facultad de Ciencias - Departamento de Informática y Automática

Universidad de Salamanca

2 de Mayo de 2007

Page 2: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Introducción

Puntos

Dibujando líneas en 3D

Polígonos

2

Índice general

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 3: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Introducción

3

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 4: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

OpenGL provee de acceso al hardware gráfico

Librería de renderizado a bajo nivel con amplio soporte hardware

Basada en el uso de primitivasSe construyen figuras complejas a partir de ellas

Puntos, líneas y polígonos, elementos básicos

Introducción

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática4

Page 5: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Se debe especificar la relación coordenadas / pixels físicos de la pantalla

Definición de la clipping area

Sistema de coordenadas (I)

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática5

Page 6: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Sistema de coordenadas 3D necesita una tercera componente

Eje Z perpendicular a los ejes X e Y

glLoadIdentity para reiniciar los sistemas de coordenadas a la unidad

GLOrtho para establecer límites de los ejes de coordenadas

glViewPort para definir la vista

Sistema de coordenadas (II)

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática6

Page 7: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Puntos

7

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 8: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Elementos de dibujado esenciales

Se componen de varias coordenadas 3 definidas por el usuario

una cuarta interna (w)

Se especifican con glVertex3f(x,y,z) Un punto en 3D es un vertex

Se dibujan entre las sentencias glBegin(GL_POINTS) y glEnd()

Indica que los vértices son puntos

Puntos (I)

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática8

Page 9: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Se puede modificar el tamaño del punto glPointSize(GLfloat tamaño)

Se obtiene un punto en forma de cuadrado con cara igual al argumento

Ejemplo// Recuperar el tamaño actual del punto

GLfloat antiguoTamaño;

glGetFloatv(GL_POINT_SIZE, &antiguoTamaño); 

// Si el tamaño del punto es pequeño, se agranda (6.0), de lo contrario se mantiene

If(antiguoTamaño < 1.0) glPointSize(6.0);

else glPointSize(1.0);

Puntos (II)

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática9

Page 10: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Ejemplo: Círculo compuesto por puntosglBegin(GL_POINTS);

for(ANG = 0.0f; ANG < 2 * GL_PI; ANG += paso)

{

x = radio * fsin(ANG);

y = radio * fcos(ANG);

glVertex2f(x,y);

}

glEnd();

Puntos (III)

10

Page 11: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Ejemplos – Puntos aleatorios en un planovoid CALLBACK RenderScene(void)

{

// Limpiamos la ventana con un color de fondo.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Guardamos el estado de la matriz y hacemos la rotación.

glPushMatrix();

glRotatef(xRot, 1.0f, 0.0f, 0.0f);

glRotatef(yRot, 0.0f, 1.0f, 0.0f);

/**********ZONA DE DIBUJO************/

//Dibujamos 50 puntos aleatorios en la pantalla.

//Los puntos están todos en el mismo plano (z=0)

glBegin(GL_POINTS);

for(int i=0;i<50;i++)

glVertex2f(puntos[i][0],puntos[i][1]);

glEnd();

// Recuperar transformaciones

glPopMatrix();

// Eliminar comandos de dibujado

glFlush();

}

Puntos (IV)

11

Page 12: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Ejemplos – Puntos aleatorios en un plano Vista del plano que forman los puntos

Puntos (V)

12

Page 13: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Dibujando líneas en 3D

13

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 14: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Líneas en 3D (I)

glBegin(GL_LINES);glVertex3f(0.0f, 0.0f, 0.0f);glVertex3f(20.0f, 20.0f, 20.0f);

glEnd();

Primitiva: GL_LINESLínea definida como trazo entre dos vértices

Puede agrupar tantos pares de vértices como se desee

Si el número de vértices es imparDesestimación del último vértice

Ejemplo:

14

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 15: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Líneas en 3D (II)

Series de líneas y trazos (I)Primitivas:

GL_LINE_STRIP

GL_LINE_LOOP

Permiten especificar una lista de vértices a través de los cuales dibujar una línea continua

Basadas en GL_LINES

15

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 16: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Líneas en 3D (III)

glBegin(GL_LINE_STRIP);glVertex3f(0.0f, 0.0f, 0.0f); // V0glVertex3f(40.0f, 40.0f, 0.0f); // V1glVertex3f(40.0f, 90.0f, 0.0f); // V2

glEnd();

V1

V0

V2

Series de líneas y trazos (II)GL_LINE_STRIP

Dibuja una línea de un vértice al siguiente en la lista

Un vértice se convierte en inicio y fin de una líneaExcepto el primer vértice (sólo inicio) y el último vértice (sólo fin)

Ejemplo:

16

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 17: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Series de líneas y trazos (III)GL_LINE_LOOP

Dibuja una línea de un vértice al siguiente en la lista

Un vértice se convierte en inicio y fin de una líneaIncluidos el primero y el último

Figura de líneas cerrada

Ejemplo:

Líneas en 3D (IV)

glBegin(GL_LINE_LOOP);glVertex3f(0.0f, 0.0f, 0.0f); // V0glVertex3f(40.0f, 40.0f, 0.0f); // V1glVertex3f(40.0f, 90.0f, 0.0f); // V2

glEnd();

V1

V0

V2

17

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 18: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Líneas en 3D (V)

Aproximación de curvas con líneas rectas (I)Alternativa a la construcción de curvas con puntos

Menos tedioso

Más sencillo e intuitivo

Utilización de la primitiva GL_LINE_STRIPPuntos más próximos Curva mejor definida

No es necesario especificar todos los puntos

18

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 19: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Líneas en 3D (VI)

//Llamar una única vez para todos los puntosglBegin(GL_LINE_STRIP);z = -50.0f;for(angulo=0.0f; angulo<=(2.0f*GL_PI)*3.0f; angulo+=0.1f){ x=50.0f*sin(angulo); y=50.0f*cos(angulo); //Especificar el punto y mover el valor de z //ligeramente hacia arriba glVertex3f(x, y, z); z+=0.5f;}glEnd();

Aproximación de curvas con líneas rectas (II)Ejemplo:

19

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 20: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Líneas en 3D (VII)

// Llamada para redibujar una escenavoid RenderScene(void){

GLfloat y;GLfloat fTam[2];GLfloat fTamAct; …//Almacenar el valor menor y mayor para anchoglGetFloatv(GL_LINE_WIDTH_RANGE,fTam);fTamAct=fTam[0];

// Subir 20 unidades en el eje Y cada líneafor(y=-90.0f; y<90.0f; y+=20.0f){

// Establecer el ancho de líneaglLineWidth(fTamAct);// Dibujar la líneaglBegin(GL_LINES);

glVertex2f(-80.0f, y);glVertex2f(80.0f, y);

glEnd();// Se incrementa el anchofTamAct += 1.0f;

}…

}

Ancho de líneasMétodo para cambiar el ancho o grosor de dibujo de líneas

void glLineWidth(GLfloat width);No todos los anchos son válidosEjemplo:

20

Page 21: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Líneas en 3D (VIII)Líneas punteadas (I)

Dibujado de líneas basadas en un patrón punteado o rayadoActivación con glEnable(GL_LINE_STIPPLE);Establecer el patrón

void glLineStipple(GLint factor, GLushort patron);El patrón no es más que un valor de 16 bits

1 Dibujado; 0 Blanco

21

Page 22: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Líneas en 3D (IX)

// Llamada para redibujar una escenavoid RenderScene(void){

GLfloat y;GLint factor=1;GLushort patron = 0x5555;…// Activar el punteadoglEnable(GL_LINE_STIPPLE);// Subir en el eje y 20 unidades cada vezfor(y=-90.0f; y<90.0f; y+=20.0f) {

// Establecer el patrónglLineSipple(factor, patron);// Dibujar la líneaglBegin(GL_LINES);

glVertex2f(-80.0f, y);glVertex2f(80.0f, y);

glEnd();factor++;

}…

}

Líneas punteadas (II)Ejemplo

22

Page 23: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Polígonos

23

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática

Page 24: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Aspectos teóricosPolígonos válidosEncaramientoAjustes de colorModos poligonales

Ejemplos prácticosTriángulos CuadriláterosPolígonos (más de 4 lados)

Índice Polígonos

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática24

Page 25: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Características:Las aristas no se pueden cortarPolígonos convexos

Polígonos complejos como unión de polígonos simples.

Vértices en OpenGL son tridimensionalesLos puntos que forman los limites de un polígono no tienen por que estar en el mismo planoCambia el punto de vista, rotaciones -> dejar de ser polígono convexo simpleUtilización de triángulos sus vértices están siempre en el mismo plano

Polígonos válidos

Polígonos válidos Polígonos no válidos

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática25

Page 26: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Determina la cara frontal y trasera del polígono

Se especifica en el orden en que

se definen los vérticesSentido contrario a las agujas del reloj (V0, V1, V2). Polígono encarado frontalmente.

Sentido de las agujas del reloj (V0, V2, V1). Polígono con encare posterior.

Función glFrontFace()

Encaramiento

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática26

Page 27: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Los colores se especifican para cada vértice no para el polígono.

Efecto de degradado

Función glShadeModel(). Argumentos:GL_SMOOTH: por defecto.

GL_FLAT: color sólido del último vértice

Ajustes de color

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática27

Page 28: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Representación de 3 formas distintas.

Función glPoligonMode(). 2 argumentos:Primero: qué caras se verán afectadas.

GL_FRONT

GL_BACK

GL_FRONT_AND_BACK

Segundo: representaciónGL_POINT: muestra sólo los vértices.

GL_LINE: muestra las aristas.

GL_FILL: muestra el polígono entero y relleno.

Modos poligonales

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática28

Page 29: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Funciones glBegin() y glEnd()Macro GL_TRIANGLES

Vértices múltiplo de 3.

Ejemplo:Especifican vértices: V1, V2, V3, V4, V5, V6 y V7

Triángulos conectados: primitiva GL_TRIANGLE_STRIP.

Triángulos (I)

29

Page 30: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Triángulos (II)

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática30

Page 31: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Similar a triángulos.Macro GL_QUADS.

Vértices múltiplo de 4.

Ejemplo:Especifican vértices: V1, V2, V3, V4, V5, V6, V7, V8 y V9.

Cuadriláteros conectados: 4 vértices más pares de puntos. Macro GL_QUAD_STRIP.

Cuadriláteros (I)

31

Page 32: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Cuadriláteros (II)

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática32

Page 33: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

Funciones glBegin() y glEnd()

Aprovechan todos los vértices que se especifiquen.

Polígonos

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática33

Page 34: Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio Lillo Sanz Carlos Muñoz Martín Javier Holguera Blanco Facultad.

¿Preguntas?

34

Informática gráfica

Ingeniería Informática

Facultad de Ciencias - Departamento de Informática y Automática