8
IEC361196 Graficación Práctica #1: Graficado de Primitivas en OpenGL OBJETIVOS: Aprender la forma en que se utiliza la librería OpenGL para la graficación de primitivas. Conocer las diferentes primitivas que ofrece la librería OpenGL. INTRODUCCIÓN: Existen diferentes primitivas que pueden utilizarse con la estructura glBegin()… glEnd(). Estas primitivas se declaran simplemente utilizando la constante apropiada, de entre las siguientes: CONSTANTES A UTILIZAR DENTRO DE UN glBegin()...glEnd(): GL_POINTS Es la primitiva utilizada en prácticas anteriores para graficar un píxel individual, por lo que su único argumento es un solo vértice. GL_LINES Esta primitiva define una línea, por lo que requiere dos vértices, el primero indicará donde comienza y el segundo donde termina. GL_TRIANGLES Esta primitiva define un triángulo, por lo que requiere tres vértices. El triángulo puede tener cualquier medida y proporción.

Practica 1

Embed Size (px)

Citation preview

Page 1: Practica 1

IEC361196 Graficación

Práctica #1: Graficado de Primitivas en OpenGL

OBJETIVOS:

Aprender la forma en que se utiliza la librería OpenGL para la graficación de primitivas. Conocer las diferentes primitivas que ofrece la librería OpenGL.

INTRODUCCIÓN:

Existen diferentes primitivas que pueden utilizarse con la estructura glBegin()… glEnd(). Estas primitivas se declaran simplemente utilizando la constante apropiada, de entre las siguientes:

CONSTANTES A UTILIZAR DENTRO DE UN glBegin()...glEnd():

GL_POINTS Es la primitiva utilizada en prácticas anteriores para graficar un píxel individual, por lo que su único argumento es un solo vértice.

GL_LINES Esta primitiva define una línea, por lo que requiere dos vértices, el primero indicará donde comienza y el segundo donde termina.

GL_TRIANGLES Esta primitiva define un triángulo, por lo que requiere tres vértices. El triángulo puede tener cualquier medida y proporción.

GL_TRIANGLE_STRIP Esta primitiva define una serie de triángulos en forma secuencial, por lo que requiere cualquier número mayor o igual a tres vértices. A partir del tercer vértice, cada vértice adicional define un nuevo triángulo.

GL_TRIANGLE_FAN Esta primitiva define una serie de triángulos en forma secuencial, en forma semejante a

Page 2: Practica 1

GL_TRIANGLE_STRIP, por lo que también requiere cualquier número mayor o igual a tres vértices. A partir del tercer vértice, cada vértice adicional define un nuevo triángulo. La diferencia radica en cuales vértices se mantienen constantes, ya que en este caso se va formando un “abanico” de triángulos que comparten el mismo vértice 1.

GL_QUADS Esta primitiva define un cuadrilátero, de cualquier proporción (no necesariamente cuadrado), por lo que requiere como argumentos cuatro vértices.

GL_QUAD_STRIP Esta primitiva define una secuencia de cuadriláteros, por lo que requiere cualquier número mayor o igual a cuatro vértices. A partir del cuarto vértice, cada dos vértices adicionales definen un nuevo cuadrado.

GL_POLYGON Un polígono es un área cercada por líneas de segmentos. OpenGL maneja polígonos correctamente siempre y cuando sean simples y convexos. Si ese no es el caso, el resultado visual puede ser impredecible.

Su definición se realiza especificando los valores de los puntos que son los vértices o esquinas que determinan el polígono.

Para evitar problemas de ambigüedad, OpenGL pone una serie de restricciones a la hora de definir un polígono:

• Los segmentos que determinan el polígono no pueden intersectarse.

• Los polígonos deben ser convexos, no permitiéndose definir polígonos cóncavos.

• No se permite que los polígonos tengan agujeros. Podemos ver algunos ejemplos de polígonos válidos y no válidos en la figura 1:

Figura 1 – Ejemplos de polígonos válidos e inválidos.

Page 3: Practica 1

Para que cualquier primitiva de mas de tres vértices esté mostrando su cara frontal al usuario, es necesario definir los vértices (en el glBegin … glEnd) en sentido contrario al reloj. Similarmente, para que muestre su cara posterior es necesario definir los vértices en el sentido del reloj.

A continuación se muestra una gráfica resumiendo la secuencia de vértices que es utilizada para definir cada tipo de primitiva disponible en OpenGL.

FUNCIONES DE LA LIBRERÍA OPENGL A UTILIZAR:

o void glColor3f (GLfloat r, GLfloat g, GLfloat b)

Page 4: Practica 1

Función .- Establece el color con el cual se graficarán todas las primitivas que estén definidas después de esta instrucción en el programa. Por lo mismo, este color estará activo hasta que otro llamado a esta misma función se haga en algún otro punto posterior en el programa.

r Este parámetro establece la cantidad de “Rojo”, de acuerdo al modelo RGB, con un valor flotante entre 0.0 y 1.0.

g Este parámetro establece la cantidad de “Verde”, de acuerdo al modelo RGB, con un valor flotante entre 0.0 y 1.0.

b Este parámetro establece la cantidad de “Azul”, de acuerdo al modelo RGB, con un valor flotante entre 0.0 y 1.0.

o void glVertex2i (GLint X, GLint Y)

Función .- Define las coordenadas (X,Y) de un vértice. Esta función se utiliza dentro de un par glBegin…glEnd para definir cada vértice de la primitiva que se desea graficar.

X Este parámetro establece la coordenada X con un valor entero.

Y Este parámetro establece la coordenada Y con un valor entero.

Nota: Si utiliza la versión glVertex2f de esta misma función, entonces las coordenadas (X,Y) se especificarán con valores flotantes en lugar de enteros.

DESARROLLO:

Page 5: Practica 1

1. Inicie un proyecto nuevo y efectúe la inicialización del mismo para que incluya la librería OpenGL.

2. Escriba el código mínimo necesario para implementar una aplicación OpenGL. Agregue al código mínimo la siguiente línea de código en la función inicialización():

gluOrtho2D(0.0,100.0,0.0,100.0);

De momento solo agregue esta línea, en prácticas posteriores se verá en detalle su uso y sintaxis.

3. Establezca la ventana donde se graficará con las siguientes características:

a) Titulo: “Practica #1: Graficado de Primitivas en OpenGL”.

b) Dimensiones: 500 x 500.c) Localización: Centrada en la Pantalla.d) Fondo: Gris Oscuro.

4. Utilice su programa para que grafique las siguientes primitivas: (dadas la línea de código que agregó en el inciso 2, asegúrese que todos los vértices que definan a las primitivas pedidas queden dentro de un espacio de coordenadas que va desde (0,0) hasta (100,100), si algunos vértices quedan definidos fuera de éste espacio, estos no serán graficados)

a) Un puntob) Una líneac) Un triángulod) Un “strip” de triángulose) Un “abanico” de triángulosf) Un cuadriláterog) Un “strip” de cuadriláterosh) Un polígono de mas de cuatro vértices

Page 6: Practica 1

Las primitivas pueden estar localizadas en cualquier coordenada y tener cualquier valor para sus vértices. Experimente dándoles diferentes colores a cada primitiva.

CONCLUSIONES:

En esta sección deberá contestar las siguientes preguntas:

1. ¿Qué sucede si se le asigna un color diferente a cada vértice de una misma primitiva? Cómo se muestra en la ventana?

2. ¿Si al definir los vértices de alguna de las primitivas, algún vértice queda fuera del espacio de coordenadas (previamente definido con el gluOrtho2D), qué será lo que se grafica? No muestra la primitiva? la muestra parcialmente?

3. Si dos o más primitivas se traslapan al ser graficadas (porque ocupan áreas similares en el espacio de la ventana), observe cual obstruye la vista a cual (cual queda enfrente y cual atrás) y deduzca entonces, qué es lo que determina el orden en que aparecen?

4. Si utiliza una primitiva del tipo GL_LINE_LOOP y le asigna un color, la primitiva queda graficada como un plano o superficie rellena de color? o solamente aparece el contorno de color y el centro vacío?