Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introduccin........................................................................................................ 1
Objetivo.............................................................................................................. 1
Marco terico...................................................................................................... 1
Desarrollo............................................................................................................ 6
Conclusiones..................................................................................................... 11
Bibliografa........................................................................................................ 11
Introduccin
Objetivo
Desarrollar una aplicacin con openGL que muestre mediante un men un
tringulo y un cuadrado
Marco terico
Mens en OpenGL
switch( identificador){
case 0:
ControlVertices( );
break;
case 1:
ControlNormales( );
break;
case 2:
ControlAristas( );
break;
}
}
switch( identificador){
case 0:
ControlLuces( );
break;
case 1:
ControlColisiones( );
break;
case 2:
ControlSonido( );
break;
case 3:
exit( -1 );
}
}
/* Definicin de la ventana */
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
id=glutCreateWindow("Ventana con men contextual");
glutAddMenuEntry("Vrtices", 0);
glutAddMenuEntry("Normales", 1);
glutAddMenuEntry("Aristas", 2);
glutCreateMenu(menu_nivel_1);
glutAddSubMenu("Ver", submenu);
glutAddMenuEntry("Luces on/off", 0);
glutAddMenuEntry("Colisiones on/off", 1);
glutAddMenuEntry("Sonido on/off", 2);
glutAddMenuEntry("Salir", 3);
glutAttachMenu(GLUT_RIGHT_BUTTON);
........
........
aqu vendran los callbacks, el Loop, el retorno del entero....lo de siempre!!!
........
........
}
Las rutinas asociadas a cada opcin de men no las defino, claro. Eso ya
dependera de la aplicacin. Tan slo me interesa la pura creacin del men sin
importarme las acciones que se llevan a cabo si se activa, ok?
Yo creo que el cdigo ya se entiende bastante bin de por s pus es muy
lgico. Voy a comentarlo un poco.
glutAddSubMenu("Ver", submenu);
que le dice al men de primer nivel que la primera de sus opciones se llama
Ver y debe llamar a un men asociado al entero submenu. Mirad que este
entero lo hemos asociado usando:
submenu = glutCreateMenu(menu_nivel_2);
y por supuesto este segundo nivel tambin dispone de sus propias opciones,
creadas de igual manera que antes. Por timo le decimos a GLUT que este
men debe asociarse a pulsar el botn derecho del ratn con:
glutAttachMenu(GLUT_RIGHT_BUTTON);
Un evento es "algo que el usuario puede hacer" como por ejemplo maximizar
una ventana, redimensionarla, pulsar el botn izquierdo del ratn, o usar una
determinada combinacin de teclas. En todos estos casos deberemos "ejecutar
algo de cdigo" dentro de nuestro programa, si es que estaba previsto as. Para
los "ms informticos" dir que se trata de algo as como una interrupcin que
provoca la ejecucin de una determinada rutina cuando se la activa.
El ratn
Lo ms normal es querer controlar lo que debe hacerse cuando el usuario pulsa
uno de sus botones. Si definimos lo siguiente en la funcin MAIN de nuestro
programa...
glutMouseFunc( ControlRaton );
OpenGL entiende que cada vez que se pulse uno de los botones del ratn debe
llamar a una rutina llamada ControlRaton, que por supuesto tenemos que crear
y definir nosotros mismos. Lo haremos de esta forma:
void ControlRaton( int button, int state, int x, int y ){
<cdigo que deseemos se ejecute>
}
donde los parmetros que la funcin nos da (automticamente y sin tener que
hacer nada) son los siguientes:
Es importante aclarar que GLUT espera que los parmetros sean stos en el
caso de este callback y no otros !!!
Veamos un ejemplo:
En este caso, cuando el usuario pulse el botn izquierdo del ratn, sacaremos
un mensaje diciendo que se cierra la aplicacin y entonces la cerraremos. La
funcin exit(-1) pertenece a ANSI C, no a OpenGL, y provoca el fin de la
ejecucin.
Lo vis viendo ms claro?
En el caso de la funcin:
glutMotionFunc( ControlMovimientoRaton );
teniendo en cuenta que X e Y son las coordenadas de pantalla por las que el
ratn est pasando. As podramos usar esta funcin para indicar nuestra
situacin en pantalla de la siguiente forma:
Qu os parece?
El teclado
El control del teclado se realiza mediante:
glutKeyboardFunc( ControlTeclado );
esto lo aadimos a nuestra funcin de MAIN y entonces definimos a parte la
funcin de control propiamente dicha:
Desarrollo
#include <windows.h>
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#define SOLID_CUADRADO 2
#define SOLID_TRIANGLE 3
#define EXIT 9
#define ESC 27
#define TAB 9
int opcion = 1;
switch(value)
{
//Dibuja un cuadrado
case SOLID_CUADRADO:
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3f(0.0,1.3,1.0);
glVertex2d(-0.5, -0.5);
glColor3f(0.5,0.2,0.9);
glVertex2d(-0.5, 0.5);
glColor3f(0.,0.2,0.3);
glVertex2d(0.5, 0.5);
glColor3f(0.6,0.1,0.8);
glVertex2d(0.5, -0.5);
glEnd();
glFlush();
break;
//Dibuja un triangulo
case SOLID_TRIANGLE:
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3f(0.0, 1.0, 1.0);
glVertex2d(-0.5, 0.5);
glColor3f(1.0, 0.0, 1.0);
glVertex2d(0.5, 0.5);
glColor3f(1.0, 0.0, 0.0);
glVertex2d(0.5, -0.5);
glEnd();
glFlush();
break;
case EXIT:
exit(0);
break;
}
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h); // Establecer el tamao del rea visible.
glMatrixMode(GL_PROJECTION); // Modificar la matriz de proyeccin.
glLoadIdentity(); // Inicializar la matriz de proyeccin.
glMatrixMode(GL_MODELVIEW); // Modificar la matriz de vista del modelo.
}
void display(void)
{
glLoadIdentity(); // Inicializar la matriz de vista del modelo.
menuAction(0);
void menu()
{
int submenu1;
submenu1 = glutCreateMenu(menuAction);//Creamos submennu
glutAddMenuEntry("Dibujar cuadrado",SOLID_CUADRADO);
glutAddMenuEntry("Dibujar triangulo",SOLID_TRIANGLE);
glutCreateMenu(menuAction);
glutAddSubMenu("Figura solida",submenu1);
glutAddMenuEntry("Salir",EXIT);
glutAttachMenu(GLUT_RIGHT_BUTTON);
}
//void specialKey(int key, int x, int y)
//{
// if(glutGetModifiers() & GLUT_ACTIVE_SHIFT) // testing SHIFT status
// {
// switch(key)
// {
// case GLUT_KEY_LEFT:
// break;
//
// case GLUT_KEY_RIGHT:
// break;
//
// case GLUT_KEY_UP:
// break;
//
// case GLUT_KEY_DOWN:
// break;
// }
// }
//}
void mouse(int button, int state,int x, int y)
{
switch(button)// Capturamos el evento del boton derecho del raton
{
case GLUT_LEFT_BUTTON:
if(state == GLUT_UP)
{
opcion++;
if(opcion > 8)
{
opcion = 1;
}
menuAction(opcion);
}
break;
}
}
//void keyboard(unsigned char key, int x, int y)
//{
// switch(key)
// {
// case ESC:
//
// exit(0);
// break;
// case TAB:
// opcion++;
// if(opcion > 8)
// {
// opcion = 1;
// }
// menuAction(opcion);
// break;
// }
//}
int main(int argc, char **argv)
{
glutInit(&argc, argv); // Inicializar GLUT
// Inicializar modo de despliegue: usar profundidad, transparencia y double
buffering.
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glutCreateWindow("Menu");
// Crear una ventana con el ttulo indicado.
menu();//Setea el submenu
//glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);//Recibe la funcion mouse para detectar el click
derecho
glutDisplayFunc(display); // Indicar la funcin para desplegar.
glutReshapeFunc(reshape); // Indicar la funcin para cambios de tamao en
la ventana.
glutMainLoop(); // Pasar el control a GLUT.
return 0;
}
Resultados
Conclusiones
Bibliografa