Está en la página 1de 20

OpenGL en Windows

OpenGL en Windows

El sistema operativo debe asumir


la interaccin con el usuario
la gestin de la ventana

Nuestro entorno de programacin debe darnos una interfaz para llamar a


OpenGL desde nuestro cdigo

Una aplicacin completa necesita mezclar OpenGL con:


mens,
cajas de dilogo,
barras de botones,
etc.

OpenGL con C++ Builder

Habr que instalar un componente TOpenGL

Comparativa GLUT / TOpenGL


void main()
{

glutInitDisplayMode

Simple o doble buffer, y modo de color elegido,


controlado por las propiedades

glutInitWindowSize

Se define en tiempo de diseo

glutCreateWindow

No tiene sentido

glutDisplayFunc

Evento OnPaint

glutReshapeFunc

Evento OnResize

glutIdleFunc

Puede hacerse con un Timer

glutMainLoop

No tiene sentido

glutPostRedisplay

Forzar el evento OnPaint

Transformaciones Geomtricas

La matriz de modelado

La matriz de modelado representa el sistema de coordenadas


tranformado sobre el cual construiremos la escena

Cada transformacin que hagamos se multiplicar por la matriz,


actualizando sus coeficientes

Cada punto que pintemos, se multiplicar por la matriz

x
y
z
w

xm
ym
zm
wm

Traslacin

Para construir una matriz de traslacin:


void glTranslatef (GLfloat x, GLfloat y, GLfloat z)

x
z

// Trasladar 10 unidades hacia arriba


glTranslatef (0.0f, 10.0f, 0.0f);
// Dibuja el cubo
glutSolidCube (10.0f);

Rotacin

Para construir una matriz de rotacin:


void glRotatef (GLfloat ang, GLfloat x, GLfloat y, GLfloat z)

x
z

x
z

// Rotar 45 grados en el eje y


glRotatef (45.0f, 0.0f, 1.0f, 0.0f);
// Dibuja el cubo
glutSolidCube (10.0f);

Escalado

Para construir una matriz de escalado:


void glScalef (GLfloat x, GLfloat y, GLfloat z)

x
z

x
z

// Escalar el doble en vertical


glScalef (1.0f, 2.0f, 1.0f);
// Dibuja el cubo
glutSolidCube (10.0f);

La dualidad de la matriz de modelado

Es igual aplicar la transformacin al


sistema de referencia de la escena,
que aplicar la transformacin inversa
al objeto

glRotatef(45,0,0,1);
glTranslatef(10,0,0);
glRectf(-5,-5,5,5);

y'
x'

y
y'

y'

x'
y

x'
x

Orden de las transformaciones


y
y'

glRotatef(45,0,0,1);

x'
x

glTranslatef(10,0,0);

1/ 2 0 0

1/ 2 0 0

0
1 0
0
0 1

1/ 2

1/ 2
M=
0
0

glRectf(-5,-5,5,5);

y'
x'
y

0
M = M
0

0 0 10 1/ 2

1 0 0 1/ 2
=
0 1 0 0

0 0 1 0

1/ 2 0 10/ 2

1/ 2 0 10/ 2

0
1
0
0
0
1

y'
x'
y

P
x

1/ 2

1/ 2
P = MP =
0
0

1/ 2 0 10/ 2 5 10 2


1/ 2 0 10/ 2 5 5 2
=

0
1
0 0 0

0
0
1 1 1

Resetear la matriz de modelado

y
10

Si quisiramos obtener esta escena,


no podemos hacer esto
10

// Sube 10 unidades en y
glTranslatef (0.0f, 10.0f, 0.0f);

// Dibuja la primera esfera


glutSolidCube (1.0f);

// Mueve 10 unidades en x
glTranslatef (10.0f, 0.0f, 0.0f);
10

// Dibuja la segunda esfera


glutSolidCube (1.0f);
10

porque obtendramos esto:

Necesitamos una forma de resetear la matriz de modelado


void glLoadIdentity()

El cdigo correcto sera:


// Inicializa la matriz del modelador
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
// Sube 10 unidades en y
glTranslatef (0.0f, 10.0f, 0.0f);
// Dibuja la primera esfera
glutSolidCube (1.0f);
// Reinicia de nuevo la matriz
glLoadIdentity();
// Mueve 10 unidades en x
glTranslatef (10.0f, 0.0f, 0.0f);
// Dibuja la segunda esfera
glutSolidCube (1.0f);

y
10

10

La pila de matrices

No siempre es deseable reiniciar por completo la matriz de modelado

A veces es preferible querer almacenar la matriz actual, y volverla a


recuperar ms adelante

OpenGL mantiene una pila de matrices

glPushMatrix()

glPopMatrix()

Para conocer la profundidad mxima de la pila:


glGet(GL_MAX_MODELVIEW_STACK_DEPTH)

// Inicializacin
glClear (GL_COLOR_BUFFER_BIT);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
// Dibuja el ncleo
glutSolidSphere(10,20,20);
// Dibuja el electrn amarillo
glColor3ub(255, 255, 0);
glPushMatrix();
glRotatef(-45.0f, 0.0f, 0.0f, 1.0f);
if (VerOrbitas) auxWireCylinder(70,1);
glRotatef(angulo, 0.0f, 1.0f, 0.0f);
glTranslatef(70.0f, 0.0f, 0.0f);
glutSolidSphere(6,20,20);
glPopMatrix();
//dibuja los dems electrones
// incrementa el ngulo y dibuja
angulo+= 10;
glFlush();

Manipulacin de matrices

Podemos crear nuestra propia matriz y cargarla en la pila correspondiente


void glLoadMatrix (GLdouble *m);

Tambin podemos multiplicarla por la matriz actual


void glMultMatrix (GLdouble *m);

Ejemplo:
GLfloat m[] =

{1,0,5,0,
0,1,5,0,
0,0,1,0,
0,0,0,1};

glMatrixMode (GL_MODELVIEW);
glLoadMatrix (m);

Errores y mensajes de OpenGL

Deteccin de errores

Cuando una llamada a OpenGL causa un error no grave, el comando se


ignora y el programa contina

Depende de cada distribucin

Para preguntar si todo ha ido correctamente:


glEnum e = glGetError();

Posibles valores de retorno:


GL_NO_ERROR
GL_INVALID_VALUE
GL_INVALID_OPERATION
GL_STACK_OVERFLOW

Obteniendo informacin de la versin

Para tomar ventaja de una cualidad conocida en una implementacin


particular
const unsigned char *s = glGetString (Glenum nombre)

donde nombre indica:


GL_VENDOR: compaa responsable de la implementacin
GL_RENDERER: nombre del generador (software, hardware)
GL_VERSION: nmero de versin
GL_EXTENSIONS: extensiones aadidas al estndar

Algunos distribuidores aaden extensiones a OpenGL que ofrecen


optimizaciones especficas del distribuidor

Compromiso calidad / velocidad

Algunas distribuciones permiten varias formas distintas de realizar la


misma operacin

Para decidir si se prefiere ms velocidad o mayor calidad:


glHint (Glenum destino, Glenum modo)

donde destino indica el comportamiento a controlar:


GL_LINE_SMOOTH_HINT: antialiasing de lneas
GL_PERSPECTIVE_CORRECTION_HINT: interpolacin de color y texturas

y modo indica uno de los siguientes valores:


GL_FASTEST
GL_NICEST