This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA
<Tipos argumentos (opcional)>
donde: I I I
Prejo indica la librería de la que procede. Puede ser glut, gl, aux, glu. Raíz indica qué realiza la función. No. Argumentos y Tipos argumentos como vemos son opcionales. Los posibles tipos se verán posteriormente.
30 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Tipos de datos de OpenGL OpenGL incorpora tipos de datos propios para facilitar la portabilidad. Los tipos de datos con su correspondencia en C y el sujo que se suele utilizar habitualmente.
31 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 1
El diseño en OpenGL se realiza utilizando tres primitivas básicas: y polígonos. Todas ellas se basan en un elemento fundamental:
puntos, líneas
los vértices.
La función de creación de vértices es glVertex(). Esta función tiene alrededor de 25 versiones en función del número y tipo de los argumentos. Algunas versiones más utilizadas son: I I I
void glVertex2f(GLfloat x, GLfloat y) void glVertex3f(GLfloat x, GLfloat y, GLfloat z) void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
x, y, z son las coordenadas de la posición del vértice. Si z no se especica vale 0. W es la cuarta coordenada cuando se utilizan coordenadas homogéneas, si no se especica vale 1.
32 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 2
I
La denición de primitivas inicia siempre con la función glBegin y naliza con glEnd. Entre estas dos funciones debemos denir los vértices que forman la primitiva. void glBegin(GLenum primitiva) - Marca el inicio de un conjunto de vértices que denen una o varias primitivas. primitiva: tipo de primitiva que iniciamos. Puede valer... GL_POINTS GL_LINES GL_TRIANGLES GL_LINE_LOOP GL_TRIANGLE_FAN GL_QUADS GL_QUAD_STRIP GL_POLYGON
puntos líneas triángulos polilíneas cerradas triángulos alrededor de un punto cuadriláteros cuadriláteros encadenados polígono convexo con cualquier número de vértices
33 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 3
I
I
I
void glEnd(void) Marca el nal de la última primitiva que se haya iniciado con glBegin.
Entre las sentencias glBegin y glEnd puede aparecer código adicional para el cálculo de los vértices y para jar algunos atributos de las primitivas. Sólo las siguientes llamadas a funciones OpenGL se permiten dentro del bloque glBegin-glEnd: * * * * *
glVertex glTextCoord glNormal glCallList glEdgeFlag
* * * * *
glColor glIndex glMaterial glCallLists glEvalCoord
34 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 4
35 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 5
I
Los puntos son las primitivas más sencillas. Se pueden denir varios puntos dentro de un solo bloque. glBegin(GL_POINTS); glVertex3f(0.0, 0.0, 0.0); glVertex3f(50.0, 50.0, 50.0); glEnd()
I
Uno de los atributos de los puntos que se puede alterar es su tamaño. La siguiente función permite cambiar el tamaño del punto y tiene que ser llamada fuera del bloque. void glPointSize(GLfloat tamaño)
tamaño: diámetro en píxeles del punto. I
La primitiva para el diseño de líneas permite trazar segmentos de línea independientes entre dos puntos sucesivos. El número de puntos debe ser par (si es impar, se ignora el último). 36 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 6
I
I
En el caso de poli-líneas , los segmentos de líneas se encuentran unidos unos con otros. En el caso de poli-líneas cerradas, se traza un segmento entre los puntos inicial y nal para cerrarla. Existe una función que nos permite alterar el grosor de la línea. Esta función se debe llamar fuera del bloque glBegin-glEnd. void glLineWidth(GLfloat grosor) grosor: grosor en píxeles de la línea.
I
El orden de denición de los vértices es fundamental, OpenGL utiliza la orientación de los mismos para determinar las caras delantera y trasera.
37 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 7
I
I
I
I
La función de creación de triángulos se utiliza para denir triángulos independientes. Estos triángulos deben denirse de tal manera que la cara delantera quede en sentido anti-horario. Para los triángulos encadenados, cada nuevo punto sirve para incorporar un nuevo triángulo al conjunto. No es necesario tener en cuenta el sentido, OpenGL lo mantiene. Para los triángulos que giran alrededor de un vértice, el vértice inicial sirve como central del conjunto y también OpenGL mantiene el sentido. Los triángulos independientes generan caras diferentes, mientras que los encadenados forman una única cara
38 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 8
glBegin(GL_TRIANGLES); glVertex3f(0, 0, 0); glVertex3f(50, 0, 0); glVertex3f(25, 50, 0); glVertex3f(25, 50, 0); glVertex3f(75, 50, 0); glVertex3f(50, 100, 0); glEnd();
39 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 9
glBegin(GL_TRIANGLES_STRIP); glVertex3f(0, 0, 0); glVertex3f(50, 0, 0); glVertex3f(25, 50, 0); glVertex3f(75, 50, 0); glVertex3f(50, 100, 0); glEnd();
40 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 10
glBegin(GL_TRIANGLES_FAN); glVertex3f(25, 50, 0); glVertex3f(0, 0, 0); glVertex3f(50, 0, 0); glVertex3f(75, 50, 0); glVertex3f(50, 100, 0); glEnd();
41 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 11
42 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 12
I
I
El caso de los cuadriláteros es muy similar al de los triángulos. Se pueden denir cuadriláteros independientes o encadenados. En ambos casos debe mantenerse la orientación horaria, aunque en el caso de los encadenados, esto lo realiza OpenGL. glBegin(GL_QUADS); glVertex3f(0, 0, 0); glVertex3f(0, 50, 0); glVertex3f(50, 50, 0); glVertex3f(50, 0, 0); glEnd();
43 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 13
glBegin(GL_QUAD_STRIP); glVertex3f(0, 0, 0); glVertex3f(0, 50, 0); glVertex3f(50, 50, 0); glVertex3f(50, 0, 0); glVertex3f(100, 50, 0); glVertex3f(100, 0, 0); glEnd();
I
OpenGL permite generar polígonos con cualquier número de vértices. La ordenación de éstos es horaria. 44 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 14
I
Todos los polígonos denidos en OpenGL, independientemente del número de lados que tengan, deben cumplir tres condiciones: a) deben ser planares b) sus aristas no pueden cortarse entre sí c) deben ser convexos
I
Los triángulos son los polígonos más utilizados, pues cumplen todas las condiciones, cualquier polígono puede descomponerse en un conjunto de triángulos glBegin(GL_POLYGON); glVertex3f(0, 0, 0); glVertex3f(25, 50, 0); glVertex3f(50, 100, 0); glVertex3f(75, 50, 0); glVertex3f(50, 0, 0); glEnd(); 45 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Primitivas de diseño parte 15
46 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
QUIZ
Arquitectura, Funciones y Primitivas
47 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
QUIZ
Arquitectura, Funciones y Primitivas
48 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Librerías de OpenGL
TAREA INVESTIGACIÓN. Investigar qué signica el concepto de "anti-liassing" en el contexto de los grácos por computadora. Además descargar, probar y comentar los dos primeros códigos de ejemplo. Se deberá hacer lo siguiente en base a esto: 1. Comentar las líneas de código 2. Investigar el algoritmo de la línea de Bresenham *La investigación deberá presentarse escrito a mano y con lapicero. Además del contenido se evaluará la presentación para contar como tarea completa.
49 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Contenido
1
Introducción
2
Conceptos
3
Cámara Sintética
4
Arquitectura
5
Funciones y Primitivas
6
Visualización
50 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Visualización de poligonos parte 1
I
I
I
I
Hemos visto como denir polígonos, lo que sigue es saber como se representan en la pantalla. La ordenación de los vértices en el polígono marca la interioridad o exterioridad de la cara que dene. Por defecto, cuando estamos en la cara exterior del objeto, los vértices aparecen en sentido anti-horario; cuando estamos en el interior en sentido anti-horario. La función glFrontFace puede alterar el sentido. void glFrontFace(Glenum modo) modo: sentido que deben tener los vértices cuando se miran desde el exterior GL_CW GL_CCW
sentido horario sentido anti-horario
51 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Visualización de polígonos parte 2
I
Los polígonos pueden visualizarse de tres modos: Modo sólido (rellenados con el color actual). Modo alambre (sólo se visualizan las aristas). Modo puntos (sólo se visualizan los vértices).
I
I
Es posible visualizar la parte exterior y la parte interior de los polígonos de dos modos diferentes. La función que cambia el modo de visualización es glPolygonMode.
52 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Visualización de polígonos parte 3
I
Los polígonos que se denan a continuación de esta función, se visualizarán en ese modo. void glPolygonMode(Glenum cara, Glenum modo) cara: indica la cara a la que aplicamos el modo de visualización. Puede valer... GL_FRONT GL_BACK GL_FRONT_AND_BACK
cara exterior cara interior ambas caras
modo: indica el modo de visualización que se aplica. Puede valer... GL_FILL GL_LINE GL_POINT
modo sólido, es el modo por default modo alambre modo puntos
53 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Visualización de polígonos parte 3
I
I
I
Podemos escoger que ciertas aristas del objeto no se visualicen en modo alambre. Las aristas que hemos añadido para formar los triángulos no deben visualizarse, puesto que no forman parte del polígono. La función glEdgeFlag, nos permite ocultar ciertas aristas y vértices en modo alambre o en modo puntos (no afecta cuando visualizamos en modo sólido). La función se utiliza en la denición del polígono, es decir dentro del bloque glBegin-glEnd e indica que se altera la forma de visualizar las aristas que unen los vértices que se denen a continuación.
54 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Visualización de polígonos parte 3
I
La función afecta a todos los puntos siguientes hasta que se cambie de nuevo. void glEdgeFlag (Glboolean flag) void glEdgeFlagv(const Glboolean *flag) flag: vale true cuando la arista forma parte del polígono, es decir, cuando debe visualizarse. Vale false cuando no debe visualizarse.
55 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Color parte 1
I
I
I
I
I
OpenGL incorpora dos modelos de color: modo RGBA y modo índices de color. En el primer modelo, el color se dene a partir de 3 valores de color (correspondientes al rojo, verde y azul), y opcionalmente un valor alfa (translucidez del color). En el modo de índices de color, los colores se encuentran ordenados y se accede a ellos, a través de un único valor que se corresponde con un índice asociado al color. El modo RGBA es más versátil y el más utilizado. Los colores en el modo RGB (no detallamos la componente alfa) se pueden representar utilizando un cubo de lado 1, donde cada eje representa uno de los tres colores.
56 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Color parte 2
I
I
I
Los demás vértices representan los colores amarillo, magenta, cian, blanco y negro. Cada punto en el interior del cubo representa un color, y sus coordenadas indican la cantidad de rojo verde y azul que lo componen. Sobre la línea que une dos colores (dos puntos) se encuentra toda la graduación existente entre los dos. 57 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Color parte 3
I
I
I
sss
Para seleccionar un color, se utiliza la función glColor, cuyos parámetros son los valores RGB del color. Un vez seleccionado el color, todo lo que se dibuje será de ese color, hasta que se cambie a otro. Esta función tiene varias versiones, según se utilice la componente alfa y según el tipo de argumentos. void void void void
glColor3f (GLfloat red, GLfloat green, GLfloat blue); glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alfa); glColor3ub(GLubyte red, GLubyte green, GLubyte blue); glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alfa);
red, green, blue:
valores para el rojo, verde y azul. En las versiones de tipo real toman valores en el intervalo [0,1]; en las de tipo entero en [0,255]. El valor alfa para la componente de translucidez toma los mismos intervalos que las 3 componentes anteriores, según sea el caso.
58 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Color parte
I
I
I
La cantidad de colores que la computadora es capaz de representar, depende de la tarjeta de video. Si al utilizar la función glColor seleccionamos un color del que no dispone nuestro sistema, OpenGL se encarga de seleccionar en su lugar el color más cercano al elegido. Para colorear el fondo, OpenGL dispone de las siguientes funciones: void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alfa)
red, green, blue, alfa son las cuatro componentes del color. GLclampf es un tipo real, así que toma valores en el intervalo [0,1]
Esta función indica el color con que debe inicializarse el buer de color.
void glClear(GLuint bits)
bits indica el elemento que se inicializa.
Para inicializar el buer de color debemos utilizar el valor GL_COLOR_BUFFER_BIT.
59 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Color parte 5
I
Puesto que habitualmente tanto el buer de color como el de profundidad deben ser inicializados cada vez que se redibuja la escena, puede llamarse una sola vez a la función glClear utilizando un conector tipo OR: glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
I
I
I
La función glColor sirve para seleccionar el color con que se dibujan todos los elementos que se diseñan a continuación. Cuando denimos una primitiva de diseño, el color se asigna a cada uno de sus vértices y no a la primitiva completa. Puede haber primitivas como líneas o polígonos en las que cada vértice se dibuje de un color.
60 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Mi primer programa con OpenGL
61 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Ventana OpenGL y coordenadas de pantalla
I
I
I
Ya hemos tenido la ocasión de utilizar el comando glutInitWindowSize(w, h), que dene el tamaño de la ventana de OpenGL con anchura w y altura h, en pixeles. Un comando similar es glutInitWindowPosition(x, y) que sirve para especicar la ubicación (x, y) de la esquina superior izquierda de la ventana de OpenGL en la pantalla de la computadora. El origen (0, 0) de la pantalla resulta que está en la esquina superior izquierda, mientras que el aumento de la dirección de su eje x es horizontal hacia la derecha y la de su eje y es verticalmente hacia abajo y, además, una unidad a lo largo de cualquiera de los ejes es absoluta y representa un pixel.
62 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Ventana OpenGL y coordenadas de pantalla
63 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Mi primer Figura parte 1
# include// Rutina de dibujado (display) void drawScene(void) { glOrtho(0.0, 100.0, 0.0, 100.0, -1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.0, 0.0); glBegin(GL_POLYGON); glVertex3f(20.0, 20.0, 0.0); glVertex3f(80.0, 20.0, 0.0); glVertex3f(80.0, 80.0, 0.0); glVertex3f(20.0, 80.0, 0.0); glEnd(); glFlush(); } // Rutina de inicialización void setup(void) { glClearColor(1.0, 1.0, 1.0, 0.0); }
64 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Mi primer Figura parte 2
// OpenGL window reshape routine. void resize(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyInput(unsigned char key, int x, int y) { switch(key) { // Presiona ESC para EXIT case 27: exit(0); break; default: break; } }
65 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Mi primer Figura parte 3
int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("Cuadrado"); setup(); glutDisplayFunc(drawScene); glutReshapeFunc(resize); glutKeyboardFunc(keyInput); glutMainLoop(); return 0; }
66 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
¾Cómo construir otro tipo de formas?
67 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
¾Y en 3D?
68 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
Librerías de OpenGL
TAREA LECTURA. Realizar una lectura de comprensión del documento PDF titulado "GLUT" disponible en el directorio Web del curso y realizar un breve resumen* (min. 1 cuartilla) que responda a las siguientes preguntas: 1. 2. 3. 4. 5.
¾Qué es GLUT? ¾Cuál es su propósito? ¾Qué funciones especícas cumple? ¾Qué consideraciones especiales hay que tener en cuenta? En base a la descripción de algunas funciones y la presentación de los ejemplos, en tus palabras ¾Cómo es la forma de implementación de este tipo de código en comparación con lo que conoces hasta ahora de programación?
*El resumen deberá presentarse escrito a mano y con lapicero. Además del contenido se evaluará la presentación para contar como tarea completa.
69 / 70
Introducción
Conceptos
Cámara Sintética
Arquitectura
Funciones y Primitivas
Visualización
El único lugar en el que Éxito viene antes que Trabajo es en el diccionario
[Vidal Sassoon]
Juan Carlos Conde Ramírez
[email protected] 70 / 70