Está en la página 1de 42

OpenGL

1. Visualización 3D

Cristina Cañero
Introducción

OpenGL es una librería de funciones, y se puede llamar


desde C.

Es transparente al hardware de gráficos disponible.

Tres librerías:
OpenGL Funciones básicas
GLU Funciones adicionales
GLUT Funciones de interfícies de ventanas
Formato de las funciones

Los nombres de las funciones siguen la convención:

{gl, glu, glut} <un nombre> [{d, f, u, … etc}] [v]

El prefijo indica a qué librería pertenece la función.

El sufijo indica el tipo de los parámetros

Ejemplos de funciones: gluPerspective, glMaterialf,


glMaterialfv, glColor3f, glutSwapBuffers… etc.
De vértices a píxeles

Coordenadas del objeto (x, y, z, w)


Modelview transform

Coordenadas del ojo (eye)

Projection transform
Coordenadas de recorte

Perspective division
Coordenadas del dispositivo

Viewport transform
Coordenadas de ventana (x, y)
De vértices a píxeles

Coordenadas del objeto (x, y, z, w)


Modelview transform

Coordenadas del ojo (eye)

Projection transform
Coordenadas de recorte

Perspective division
Coordenadas del dispositivo

Viewport transform
Coordenadas de ventana (x, y)
Coordenadas del objeto

Sistema de coordenadas en que se define el objeto.


y

z
x
Primitivas geométricas básicas

glut{Wire | Solid}{Sphere, Cube, … etc}(<parámetros>)

Wire Solid
Primitivas geométricas básicas

glut{Wire | Solid}{Sphere, Cube, … etc}(<parámetros>)

Sphere Cube Cone Torus Dodecahedron

Octahedron Tetrahedron Icosahedron Teapot


Ejemplos:
glutWireSphere(radius, slices, stacks)
glutSolidTeapot(size)
Primitivas geométricas básicas

(0, 1, 0) (1, 1, 0)
glBegin(GL_POINTS);
glVertex3f(0, 0, 0);
glVertex3f(0, 1, 0);
glVertex3f(1, 1, 0);
glVertex3f(1, 0, 0);
glEnd();
(0, 0, 0) (1, 0, 0)
Primitivas geométricas básicas

(0, 1, 0) (1, 1, 0)
glBegin(GL_LINES);
glVertex3f(0, 0, 0);
glVertex3f(0, 1, 0);
glVertex3f(1, 1, 0);
glVertex3f(1, 0, 0);
glEnd();
(0, 0, 0) (1, 0, 0)
Primitivas geométricas básicas

(0, 1, 0) (1, 1, 0)
glBegin(GL_LINE_STRIP);
glVertex3f(0, 0, 0);
glVertex3f(0, 1, 0);
glVertex3f(1, 1, 0);
glVertex3f(1, 0, 0);
glEnd();
(0, 0, 0) (1, 0, 0)
Primitivas geométricas básicas

(0, 1, 0) (1, 1, 0)
glBegin(GL_LINE_LOOP);
glVertex3f(0, 0, 0);
glVertex3f(0, 1, 0);
glVertex3f(1, 1, 0);
glVertex3f(1, 0, 0);
glEnd();
(0, 0, 0) (1, 0, 0)
Primitivas geométricas básicas

(0, 1, 0) (1, 1, 0)
glBegin(GL_TRIANGLES)
;
glVertex3f(0, 1, 0);
glVertex3f(1, 1, 0);
glVertex3f(1, 0, 0);
glEnd();
(1, 0, 0)
Primitivas geométricas básicas

(0, 1, 0) (1, 1, 0)
glBegin(GL_QUADS);
glVertex3f(0, 0, 0);
glVertex3f(0, 1, 0);
glVertex3f(1, 1, 0);
glVertex3f(1, 0, 0);
glEnd();
(0, 0, 0) (1, 0, 0)
Primitivas geométricas básicas

(0.5,1.5,0)

glBegin(GL_QUADS);
glVertex3f(0, 0, 0); (-0.5,1,0) (1.5,1, 0)

glVertex3f(-0.5, 1, 0);
glVertex3f(0.5, 1.5, 0);
glVertex3f(1.5, 1, 0);
glVertex3f(0, 1, 0); (0, 0, 0) (1, 0, 0)

glEnd();
De vértices a píxeles

Coordenadas del objeto (x, y, z, w)


Modelview transform

Coordenadas del ojo (eye)

Projection transform
Coordenadas de recorte

Perspective division
Coordenadas del dispositivo

Viewport transform
Coordenadas de ventana (x, y)
De vértices a píxeles
Coordenadas del objeto (x, y, z, w)

Coordenadas del mundo Modelview transform

Coordenadas del ojo (eye)


Projection transform
Coordenadas de recorte
Perspective division

Coordenadas del dispositivo


Viewport transform

Coordenadas de ventana (x, y)


Coordenadas mundo

Sistema de coordenadas en que se define la escena.


escena. Define cómo se colocan los diferentes objetos en la escena.

(x, y, z, w)T mundo = (x, y, z, w)Tobjeto ·Mescena

Mescena pasa de coordenadas objeto a coordenadas mundo (rotaciones, translaciones, escalados… )


Colocando los objetos en la
escena...

Para colocar un objetos de dos maneras diferentes,


utilizaremos dos matrices Modelview (M) distintas.

Para indicar a OpenGL que queremos trabajar con la


matriz M, escribiremos:

glMatrixMode(GL_MODELVIEW).

Al principio de la ejecución del programa, M = I.


Transformación de
rotación
La función:

glRotatef(alpha, x, y, z)

Multiplica la matriz actual por la matriz de rotación de


alpha grados alrededor del eje (x, y, z)

glRotatef(-90, 1, 0, 0)
Transformación de
translación
La función:

glTranslatef(x, y, z)

Multiplica la matriz actual por la matriz de translación


con un vector (x, y, z)

glTranslatef(0, 1, 0)
Transformación de
escalado
La función:

glScalef(sx, sy, sz)

Multiplica la matriz actual por la matriz de escalado de


factores (sx, sy, sz)

glScalef(1, 2.5, 1)
Pila de matrices

OpenGL dispone de una pila para cada matriz.

El tamaño mínimo para la pila Modelview es 32 y para


la pila Projection es 2.

Para guardar / recuperar matrices:

glPushMatrix()
glPopMatrix()

Estas funciones trabajan con la matriz actual.


Ejemplos

glMatrixMode(GL_MODELVIEW);
3
glLoadIdentity();
2
glTranslatef(0.0f,0.25f,0.0f);
glutSolidSphere(0.1,30,30); 1
glTranslatef(0.0f,0.5f,0.0f);
1
glutSolidCube(0.15); 2
glTranslatef(0.0f,0.25f,0.0f);
glutSolidCube(0.15);3
Ejemplos
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glTranslatef(0.0f,0.25f,0.0f); 3
glutSolidSphere(0.1,30,30); 1 2
glPopMatrix(); 1
glTranslatef(0.0f,0.5f,0.0f);
glutSolidCube(0.15);2
glTranslatef(0.0f,0.25f,0.0f);
glutSolidCube(0.15); 3
De vértices a píxeles
Coordenadas del objeto (x, y, z, w)

Coordenadas del mundo Modelview transform

Coordenadas del ojo (eye)


Projection transform
Coordenadas de recorte
Perspective division

Coordenadas del dispositivo


Viewport transform

Coordenadas de ventana (x, y)


Coordenadas ojo
Sistema de coordenadas en que se define la escena respecto el punto de vista de la cámara.

(x, y, z, w)T ojo = (x, y, z, w)Tmundo · Mpunto_de_vista

Mpunto_de_vista pasa de coordenadas escena a coordenadas ojo (rotación y translación)


Punto de vista

Para definir el punto de vista, disponemos de la


función:

void gluLookAt (
eyeX, eyeY, eyeZ,
cenX, cenY, cenZ,
vp_X, vp_Y, vp_Z);

Esta función se aplica sobre la matriz ModelView


(M = Mescena · Mpunto_de_vista)
De vértices a píxeles

Coordenadas del objeto (x, y, z, w)


Modelview transform

Coordenadas del ojo (eye)

Projection transform
Coordenadas de recorte

Perspective division
Coordenadas del dispositivo

Viewport transform
Coordenadas de ventana (x, y)
Coordenadas de recorte

Corresponden a las coordenadas del volumen de visualización normalizado.


normalizado.

(x, y, z, w)T recorte = (x, y, z, w)Tojo · P

P es una matriz de proyección.


proyección.
Tipo de proyección

Para definir el tipo de proyección, tendremos que


modificar la matriz Projection (P).

Para indicar a OpenGL que queremos trabajar con la


matriz P, escribiremos:

glMatrixMode(GL_PROJECTION).

Al principio de la ejecución del programa, P = I.


Proyección ortogonal

Equivale a definir un volumen de visualización en


forma de caja alrededor del eye de la cámara (esto es,
podemos ver detrás) Para hacer esto, llamamos a

glOrtho(left, right, bottom, top, near, far)


Proyección perspectiva

Para conseguir una proyección perspectiva, tenemos la


función:

glFrustum(left, right, bottom ,top, near, far)


Proyección perspectiva

Otra función, más sencilla, es:

gluPerspective(alpha, aspect, near, far)


Proyección perspectiva

Para las funciones glFrustum y gluPerspective,


NUNCA poner near <= 0.
Los resultados son impredecibles.
De vértices a píxeles

Coordenadas del objeto (x, y, z, w)


Modelview transform

Coordenadas del ojo (eye)

Projection transform
Coordenadas de recorte

Perspective division
Coordenadas del dispositivo

Viewport transform
Coordenadas de ventana (x, y)
Coords. de dispositivo

Son el resultado de la selección de las coordenadas que caen dentro del volumen de visualización normalizado.

Aquí es donde se aplican los algoritmos de recorte (clipping).

Corresponden a la “foto” en coordenadas mundo.


De vértices a píxeles

Coordenadas del objeto (x, y, z, w)


Modelview transform

Coordenadas del ojo (eye)

Projection transform
Coordenadas de recorte

Perspective division
Coordenadas del dispositivo

Viewport transform
Coordenadas de ventana (x, y)
Coords. de ventana

Son las coordenadas de ventana-vista, es decir, las


coordenadas de la pantalla del ordenador.

Son el resultado de aplicar la transformación de


viewport a las coordenadas de dispositivo.
Definición del viewport

Para definir el lugar donde


se renderizará la “foto”
sobre la ventana de (0,0)
nuestra aplicación, existe la
función: cx
(x,y)
glViewport(x, y, cx, cy)

cy
Donde (x, y) corresponde a
la posición del viewport y
(cx, cy) a su tamaño.
Definición del viewport

Para mantener la proporción de los objetos, es


imprescindible que la ventana-mundo y la ventana-
vista tengan la misma relación altura / anchura.

BIEN MAL
Resumiendo...

El cómo se verá un objeto en la pantalla vendrá


definido por:

La matriz del Modelview M, que define la colocación de los


objetos en la escena y el punto de vista (M = Mescena · Mpunto_de_vista).

La matriz de Projection P, que define el tipo de proyección.

La posición del viewport en coordenadas de pantalla.

También podría gustarte