Está en la página 1de 7

Universidad Nacional Mayor de San Marcos

Facultad de Ingeniera de Sistemas e Informtica


E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Manejo de mens jerrquicos con OpenGL

Laboratorio 05

Manejo de mens
jerrquicos con OpenGL
Interaccin con el usuario
empleando mens contextuales.

Objetivo: El objetivo de esta prctica, es que el alumno conozca y sepa cmo aplicar los principales
comandos de manejo de mens jerrquicos; tambin, poder efectuar un despliegue apropiado de las
grficas con OpenGL, permitiendo al usuario el diseo ms transparente y legible, adems de
interactuar con la aplicacin grfica.

Duracin de la Prctica: 2 Horas.

Lugar de realizacin: Laboratorio de cmputo.

El conocimiento requerido para realizar esta prctica es de haber asimilado los conceptos bsicos
de C/C++ y OpenGL.

El desarrollo tendr la siguiente estructura de temas:

1. Interaccin y animacin usando GLUT (segunda parte)


2. Mens jerrquicos
3. Programa ejemplo con OpenGL
4. Ejercicios propuestos
5. Referencias

Mg. Johnny R. Avendao Q. Pag. No. 1


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Manejo de mens jerrquicos con OpenGL

1. INTERACCIN Y ANIMACIN USANDO GLUT (segunda parte)

OpenGL nos proporciona una serie de funciones que pueden ser usadas fcilmente para crear
ventanas con botones, casillas de seleccin, as como tambin una serie de mens jerrquicos de
varios niveles; la primera es proporcionada por MUI (Micro User Interface). Nosotros veremos
inicialmente el manejo de los mens jerrquicos y luego pasaremos a la librera mui. Cabe rescatar
que este aporte fue desarrollado por Tom Davis, inicialmente diseado de manera independientemente
de OpenGL, luego Silicon Graphics la incorpor a GLUT dada su versatilidad y facilidad de uso.

2. MENS JERRQUICOS

GLUT nos permite crear mens jerrquicos de muchos niveles, las cuales se pueden activar
mediante la presin de uno de los botones del mouse, el que elijamos (normalmente el derecho), y
cuando estemos sobre la ventana de visualizacin.
Si lo que queremos son mens que cuelguen de la ventana (tpicos de cualquier aplicacin
Windows) deberemos recurrir a algo ms sofisticado como la MFC 1 del sistema operativo de Windows.

Las funciones necesarias son las siguientes:

int glutCreateMenu(void (*func) (int valor)): permite crear un men al cual se le asocia una
rutina dada por func, que es una funcin del tipo callback, que se activar cuando se la
invoque.

void glutAddMenuEntry(char *nombre, int valor): permite desplegar una opcin


membretada con la cadena de caracteres nombre, la variable valor es un entero asociado a
esta opcin el cul puede usarse para algn evento en particular.

void glutAddSubMenu(char *nombre, int valor): permite adicionar un submen al men del
nivel superior, este submen se le llama por nombre y est asociada al entero valor.

void glutAttachMenu(int boton): indica que evento asociado al mouse ser empleado, para
esto, boton puede ser el estado GLUT_RIGHT_BUTTON, GLUT_LEFT_BUTTON o
GLUT_MIDDLE_BUTTON.

Por ejemplo el cdigo:

glutCreateWindow(Modelo alambrico);

int submenu=glutCreateMenu(menu2);
// glutAddMenu(lo que desees);
glutAddMenuEntry(cubo,1);
glutAddMenuEntry(esfera,2);
glutAddMenuEntry(toroide,3);

// men para las rotaciones


glutCreateMenu(menu1);;
glutAddSubMenu(Modelos
alambricos,submenu);
glutAddMenuEntry(Eje X,1);
glutAddMenuEntry(Eje Y,2);
glutAddMenuEntry(Eje Z,3);
glutAddMenuEntry(Salir (esc),4);

// usaremos el boton derecho del mouse


glutAttachMenu(GLUT_RIGHT_BUTTON);

1
Microsoft Foundation Classes provee un acceso ms sencillo a la API de Windows

Mg. Johnny R. Avendao Q. Pag. No. 2


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Manejo de mens jerrquicos con OpenGL

permite desplegar ventanas como se muestra en el grfico superior.

3. PROGRAMA EJEMPLO CON OPENGL

Implemente un programa sobre el Ejercicio 01 del Taller 02 (cubo rotando con respecto a los 3
ejes coordenados), en esta implementacin el usuario podr escoger entre la esfera, el cubo y el
toroide (o algn otro objeto grfico) usando modelos almbricos definidos en OpenGL, adems podr
escoger el eje de rotacin como se sugiere en el grfico que se anexa:

#include <stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include <gl/glut.h>

GLdouble const pi = 3.141592654;


GLdouble angulo=0;
GLint modelo=1;
GLdouble const radio=1.0;
static GLfloat theta[] = {0.0,0.0,0.0};
static GLint axis = 2 ;
GLfloat L=1.5,R,alfa;

void iniciar(void)
{
glClearColor (1.0, 1.0, 1.0, 0.0);
glColor3f (1.0, 0.0, 0.0);
glLineWidth(2.0);
glShadeModel (GL_FLAT);
}

void estructura(void)
{
R=L/sin(M_PI/8);
alfa=45; //M_PI/4;
glScalef(0.25,0.25,0.25);
for(float i=0;i<8;i++)
{
glPushMatrix();
glRotatef(i*alfa,0,0,1);
glTranslatef(R*cos(M_PI/8)+L,0,0);
glutWireCube(2*L);
glPopMatrix();
}
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

gluLookAt(0,0.0,5,0,0.0,4,0,1,0);
glRotatef(theta[0],1.0,0.0,0.0);
glRotatef(theta[1],0.0,1.0,0.0);
glRotatef(theta[2],0.0,0.0,1.0);

switch(modelo){
case 1: glutWireCube(2); break;
case 2: glutWireSphere(1,10,10); break;
case 3: glutWireTorus(0.2,1.5,10,10); break;

Mg. Johnny R. Avendao Q. Pag. No. 3


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Manejo de mens jerrquicos con OpenGL

case 4: estructura();break;
}
glFlush();
glutSwapBuffers();
}

void CubeSpin()
{
theta[axis] += 0.1;
if(theta[axis]>360) theta[axis] -= 360.0;
display();
}

void myReshape(int w, int h)


{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h,0.1, 30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void menu_rotaciones(int opcion)


{
switch(opcion){
case 1: axis = 0; break;
case 2: axis = 1; break;
case 3: axis = 2; break;
case 4 : exit(0); break;
}
}

void menu_modelos_alambricos(int opcion)


{
switch(opcion){
case 1: modelo=4; break;
case 3 : exit(0); break;
}
}

void menu_glut(int opcion)


{
switch(opcion){
case 1: modelo=1; break;
case 2: modelo=2; break;
case 3: modelo=3; break;
}
}

void menu_color(int opcion)


{
switch(opcion){
case 1: glColor3f (1.0, 0.0, 0.0); break;
case 2: glColor3f (0.0, 1.0, 0.0); break;
case 3: glColor3f (0.0, 0.0, 1.0); break;
}
}
void menu_primi_propia(int opcion)
{

Mg. Johnny R. Avendao Q. Pag. No. 4


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Manejo de mens jerrquicos con OpenGL

switch(opcion){
case 1: modelo=4; break;
//case 2: modelo=5; break; para el cilindro
}
}

void menu_principal(int opcion)


{
switch(opcion){
//case 1: int i=0;break;
case 4: exit( -1 );
}
}

int main(int argc, char **argv)


{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500,500);

glutCreateWindow("Modelos Alambricos usando menus jerarquicos con Glut ");

int submenu_glut=glutCreateMenu(menu_glut);
glutAddMenuEntry("cubo",1);
glutAddMenuEntry("Esfera",2);
glutAddMenuEntry("Toroide",3);

int submenu_primi_propia=glutCreateMenu(menu_primi_propia);
glutAddMenuEntry("Estructura",1);
glutAddMenuEntry("Cilindro",2);

int submenu_modelos_alambricos=glutCreateMenu(menu_modelos_alambricos);
glutAddSubMenu("Libreria glut",submenu_glut);
glutAddSubMenu("Libreria propia",submenu_primi_propia);

int submenu_rotaciones=glutCreateMenu(menu_rotaciones);
glutAddMenuEntry("Eje X",1);
glutAddMenuEntry("Eje Y",2);
glutAddMenuEntry("Eje Z",3);

int submenu_color=glutCreateMenu(menu_color);
glutAddMenuEntry("Rojo",1);
glutAddMenuEntry("Verde",2);
glutAddMenuEntry("Azul",3);

int menu=glutCreateMenu(menu_principal);
glutAddSubMenu("Modelos Alambricos",submenu_modelos_alambricos);
glutAddSubMenu("Rotaciones",submenu_rotaciones);
glutAddSubMenu("Colores",submenu_color);
glutAddMenuEntry("Esc",4);

// usaremos el boton derecho del mouse


glutAttachMenu(GLUT_RIGHT_BUTTON);

iniciar();
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutIdleFunc(CubeSpin);
glEnable(GL_DEPTH_TEST);
glutMainLoop();

Mg. Johnny R. Avendao Q. Pag. No. 5


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Manejo de mens jerrquicos con OpenGL

return 0;
}

4. EJERCICIOS PROPUESTOS

Ejercicio 01:

Modifique el anterior programa modelo insertando mens y ventanas desplegables para que el
usuario pueda cambiar el sentido de la rotacin en cada eje para cada grafico (cubo esfera y toroide).

Ejercicio 02:

Modifique el anterior programa (Ejercicio 01) insertando los mens y ventanas desplegables
necesarios de tal manera que adems de tener el control de las rotaciones, tambin se pueda mostrar
otras primitivas geomtricas definidas por OpenGL (revise la documentacin necesaria, Taller 02).

Ejercicio 03:

Implemente el cdigo necesario para cambiar atributos a una determinada grafica en cualquiera
de los talleres anteriores, estos pueden ser, el color, el grosor del pxel, as como tambin la activacin
de los ejes coordenados o desactivacin.

Ejercicio 04:

Implemente el cdigo necesario para mostrar las grficas de diferentes superficies, las cules
puedan ser activadas y desactivadas mediante opciones en un men jerrquico. Considere como
2 2 sen(+)
mnimo tres superficies diferentes, por ejemplo las grficas de + , , y 2 + 2 , adems

de la silla de montar. Como sugerencia, considere una malla rectangular [5; 5] [5; 5] para los
valores de e , luego evale segn la funcin. Finalmente puede incorporar transformaciones
geomtricas en ella.

Observe ambas grficas, trate de obtener la malla visualmente ms apropiada; ambas representan a
la funcin exponencial. Tambin note que en ambos casos no existe ocultamiento de caras no visibles.

Mg. Johnny R. Avendao Q. Pag. No. 6


Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2016-2
Manejo de mens jerrquicos con OpenGL

Ejercicio 05 (opcional como proyecto):

Una aplicacin interesante, sera aquella en la cual el usuario pueda ingresar por consola (teclado)
cualquier funcin elemental o combinacin de ellas, de tal manera que esta se pueda graficar sin
limitacin alguna; claro la nica restriccin sera aquella en donde la funcin no estuviese definida y
finalmente poder interactuar con ella.

5. REFERENCIAS

OpenGL Superbible. R. Wright and M. Sweet. Waite Group, Inc 1996

OpenGL Programming Guide: The Official Guide to Learning OpenGL. D. Sheiner, M.


Wood, J. Neider and T. Davis. Addison Wesley, 2007

The OpenGL Utility Toolkit (GLUT) Programming Interface (API Version 3). Mark J. Kilgard,
Silicon Graphics, Inc 1996

The OpenGL Graphics System: A Specification (Version 1.2). Mark segal & Kurt Akeley.
Silicon Graphics, Inc 1998.

Mg. Johnny R. Avendao Q. Pag. No. 7

También podría gustarte