Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio...
-
Upload
pepita-fosco -
Category
Documents
-
view
229 -
download
0
Transcript of Dibujar en 3D: puntos, líneas y polígonos. Informática gráfica Ingeniería Informática Antonio...
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
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
Introducción
3
Informática gráfica
Ingeniería Informática
Facultad de Ciencias - Departamento de Informática y Automática
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
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
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
Puntos
7
Informática gráfica
Ingeniería Informática
Facultad de Ciencias - Departamento de Informática y Automática
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
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
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
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
Ejemplos – Puntos aleatorios en un plano Vista del plano que forman los puntos
Puntos (V)
12
Dibujando líneas en 3D
13
Informática gráfica
Ingeniería Informática
Facultad de Ciencias - Departamento de Informática y Automática
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
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
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
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
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
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
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
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
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
Polígonos
23
Informática gráfica
Ingeniería Informática
Facultad de Ciencias - Departamento de Informática y Automática
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
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
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
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
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
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
Triángulos (II)
Informática gráfica
Ingeniería Informática
Facultad de Ciencias - Departamento de Informática y Automática30
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
Cuadriláteros (II)
Informática gráfica
Ingeniería Informática
Facultad de Ciencias - Departamento de Informática y Automática32
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
¿Preguntas?
34
Informática gráfica
Ingeniería Informática
Facultad de Ciencias - Departamento de Informática y Automática