340 likes | 638 Views
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. Índice general. Introducción
E N D
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
Índice general Introducción Puntos Dibujando líneas en 3D Polígonos Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Introducción Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Introducción • OpenGL provee de acceso al hardware gráfico • Librería de renderizado a bajo nivel con amplio soporte hardware • Basada en el uso de primitivas • Se construyen figuras complejas a partir de ellas • Puntos, líneas y polígonos, elementos básicos Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Sistema de coordenadas (I) • Se debe especificar la relación coordenadas / pixels físicos de la pantalla • Definición de la clipping area Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Sistema de coordenadas (II) • 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 Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Puntos Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Puntos (I) • 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 Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Puntos (II) • 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); Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Puntos (III) • Ejemplo: Círculo compuesto por puntos • glBegin(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 (IV) • Ejemplos – Puntos aleatorios en un plano • void 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 (V) • Ejemplos – Puntos aleatorios en un plano • Vista del plano que forman los puntos
Dibujando líneas en 3D Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Líneas en 3D (I) • Primitiva: GL_LINES • Lí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 impar • Desestimación del último vértice • Ejemplo: glBegin(GL_LINES); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(20.0f, 20.0f, 20.0f); glEnd(); 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 Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
V2 V1 V0 Líneas en 3D (III) • 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ínea • Excepto el primer vértice (sólo inicio) y el último vértice (sólo fin) • Ejemplo: glBegin(GL_LINE_STRIP); glVertex3f(0.0f, 0.0f, 0.0f); // V0 glVertex3f(40.0f, 40.0f, 0.0f); // V1 glVertex3f(40.0f, 90.0f, 0.0f); // V2 glEnd(); Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
V2 V1 V0 Líneas en 3D (IV) • 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ínea • Incluidos el primero y el último • Figura de líneas cerrada • Ejemplo: glBegin(GL_LINE_LOOP); glVertex3f(0.0f, 0.0f, 0.0f); // V0 glVertex3f(40.0f, 40.0f, 0.0f); // V1 glVertex3f(40.0f, 90.0f, 0.0f); // V2 glEnd(); 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_STRIP • Puntos más próximos Curva mejor definida • No es necesario especificar todos los puntos Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Líneas en 3D (VI) • Aproximación de curvas con líneas rectas (II) • Ejemplo: //Llamar una única vez para todos los puntos glBegin(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(); Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Líneas en 3D (VII) • Ancho de líneas • Método para cambiar el ancho o grosor de dibujo de líneas • void glLineWidth(GLfloat width); • No todos los anchos son válidos • Ejemplo: // Llamada para redibujar una escena void RenderScene(void) { GLfloat y; GLfloat fTam[2]; GLfloat fTamAct; … //Almacenar el valor menor y mayor para ancho glGetFloatv(GL_LINE_WIDTH_RANGE,fTam); fTamAct=fTam[0]; // Subir 20 unidades en el eje Y cada línea for(y=-90.0f; y<90.0f; y+=20.0f) { // Establecer el ancho de línea glLineWidth(fTamAct); // Dibujar la línea glBegin(GL_LINES); glVertex2f(-80.0f, y); glVertex2f(80.0f, y); glEnd(); // Se incrementa el ancho fTamAct += 1.0f; } … }
Líneas en 3D (VIII) • Líneas punteadas (I) • Dibujado de líneas basadas en un patrón punteado o rayado • Activació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
Líneas en 3D (IX) • Líneas punteadas (II) • Ejemplo // Llamada para redibujar una escena void RenderScene(void) { GLfloat y; GLint factor=1; GLushort patron = 0x5555; … // Activar el punteado glEnable(GL_LINE_STIPPLE); // Subir en el eje y 20 unidades cada vez for(y=-90.0f; y<90.0f; y+=20.0f) { // Establecer el patrón glLineSipple(factor, patron); // Dibujar la línea glBegin(GL_LINES); glVertex2f(-80.0f, y); glVertex2f(80.0f, y); glEnd(); factor++; } … }
Polígonos Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Índice Polígonos • Aspectos teóricos • Polígonos válidos • Encaramiento • Ajustes de color • Modos poligonales • Ejemplos prácticos • Triángulos • Cuadriláteros • Polígonos (más de 4 lados) Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Polígonos válidos • Características: • Las aristas no se pueden cortar • Polígonos convexos • Polígonos complejos como unión de polígonos simples. • Vértices en OpenGL son tridimensionales • Los puntos que forman los limites de un polígono no tienen por que estar en el mismo plano • Cambia el punto de vista, rotaciones -> dejar de ser polígono convexo simple • Utilización de triángulos sus vértices están siempre en el mismo plano 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ática
Encaramiento • Determina la cara frontal y trasera del polígono • Se especifica en el orden en que se definen los vértices • Sentido 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() Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Ajustes de color • 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 Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Modos poligonales • 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ón • GL_POINT: muestra sólo los vértices. • GL_LINE: muestra las aristas. • GL_FILL: muestra el polígono entero y relleno. Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Triángulos (I) • 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 (II) Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Cuadriláteros (I) • 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 (II) Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
Polígonos • Funciones glBegin() y glEnd() • Aprovechan todos los vértices que se especifiquen. Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática
¿Preguntas? Informática gráfica Ingeniería Informática Facultad de Ciencias - Departamento de Informática y Automática