Contenido
• Interacción.
• Dispositivos de Entrada.
• Clientes y Servidores.
• Listas de Despliegue.
• Programación de Manejo de Eventos.
• Menús.
• 1963 Ivan Sutherland presentó con su tesis doctoral en el MIT, Sketchpad, uno de los primeros sistemas gráficos interactivos.
• Sutherland introduce un paradigma simple: El usuario puede interactuar con un dispositivo a través de gráfica con el sistema.
• Los 2 temas más importantes desde la presentación de Sketchpad son:
– La interfaz hombre-computador y
– las estructuras de datos para implementaciones eficientes.
• El tema de la interfaz no es apoyado por OpenGL, para eso existen herramientas como GLUT.
• GLUT permite el manejo de ventanas, el teclado, el mouse y de simples menús.
• Los dispositivos de entrada se separan en:
– dispositivos físicos
– dispositivos lógicos
• Esta separación permite el desarrollo de programas independientemente de las características de un dispositivo físico específico.
• Existen 2 tipos de dispositivos de entrada físicos:
– dispositivos para apuntar (Mouse y Trackball)
– dispositivos teclados (Tableta Gráfica)
• Los dispositivos para apuntar permiten al usuario indicar una posición en la pantalla y casi siempre incorporan uno o más botones para el envío de señales o interrupciones al computador.
• Los dispositivos teclados son generalmente los conocidos teclados, pero se puede generalizar a cualquier dispositivo que retorna códigos de caracteres.
De Velocidad a Posición
• Las velocidades de los movimientos del mouse en las direcciones X e Y son integradas para obtener una posición relativa X e Y.
Tableta Gráfica: Se obtienen posiciones absolutas.
Lápiz de Luz: Dispositivo que usó Sutherland en Sketchpad.
Joystick: Se puede agregar elementos mecánicos que dan la sensación de fuerza y resistencia. Se usa para simuladores de vuelo y juegos.
Spaceball: Dispositivo de entrada 3D con 6 grados de libertad. Sensores de presión miden las fuerzas aplicadas por el usuario.
Dispositivos de Entrada Lógicos
En general se pueden observar 6 clases de dispositivos lógicos de entrada:
1. String: provee texto.
2. Locator: provee una posición en coordenadas del mundo a la aplicación.
3. Pick: retorna el identificador de un objeto.
4. Choice: selecciona una opción de varias alternativas.
5. Dial: provee entrada análoga.
6. Stroke: retorna un arreglo de posiciones.
• La manera en la cual dispositivos físicos y lógicos proveen entradas a programas de aplicación se puede describir en términos de 2 entidades:
– un proceso de “medida” y
– un “gatillador” del dispositivo
•
• Gatillador es la operación física que inicia la entrada.
– Ejemplo-1: string y tecla enter
– Ejemplo-2: posición y tecla del mouse
Se distinguen 3 tipos de modos de entrada: (Revisar gráficos sobre estos 3)
1. Request
2. Sample
3. Event
• Servidores Gráficos
Listas de Despliegue
Arquitectura de los años 60
Arquitectura Display-Processor
Hay 2 modos para desplegar primitivas gráficas:
• Modo Inmediato
– La primitiva es definida y enviada directamente al servidor gráfico, no queda almacenada en la memoria. Para un nuevo despliegue, se debe redefinir la primitiva.
• Modo Retenido
– La primitiva es definida y enviada a una memoria – la lista de despliegue (display list). La primitiva puede ser desplegada nuevamente sin una nueva definición desde la lista de despliegue.
glNewList(BOX, GL_COMPILE); // Alternativa: GL_COMPILE_AND_EXECUTE
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-1.0, -1.0);
glVertex2f( 1.0, -1.0);
glVertex2f( 1.0, 1.0);
glVertex2f(-1.0, 1.0);
glEnd();
glEndList();
glCallList(BOX); // Para desplegar el elemento BOX de color rojo
glMatrixMode(GL_PROJECTION);
for(int i = 1; i <>
glLoadIdentity();
gluOrtho2D(-2.0*i, 2.0*i, -2.0*i, 2.0*i);
glCallList(BOX);}
Programación de Eventos de
• Eventos de Mouse:
– Botón presionado
– Botón soltado
– Movimiento
glutMouseFunc( mouse_callback_func );
void mouse_callback_func( int button, int state, int x, int y)
{
if ( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
exit(0);
}
Programación de Eventos de
• Eventos de Ventana: Eventos de Ventana:
– Cambio de tamaño.
glutReshapeFunc( reshape );
Programación de Eventos de
• Eventos de Ventana: Eventos de Ventana:
void myReshape(GLsizei w, GLsizei h){
/* Adjust clipping box */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,(GLdouble)w, 0.0,(GLdouble)h, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
/* Adjust viewport and clear */
glViewport(0,0,w,h);
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
Programación de Eventos de
• Eventos de Teclado: Eventos de Teclado:
– Tecla presionada Tecla presionada
glutKeyboardFunc glutKeyboardFunc( keyboard keyboard); );
void void keyboard keyboard( unsigned unsigned char char key key, int int x, x, int int y) y)
{
if if( key key == == ‘q’ || || key key == == ‘Q’) exit exit(0); (0);
}
Programación de Eventos de
• Eventos de Eventos de Display Display e Idle Idle:
– Display Display: redibujado redibujado de la ventana. de la ventana.
– Idle Idle: cuando no ocurren eventos : cuando no ocurren eventos.
glutDisplayFunc glutDisplayFunc( display display ); );
glutIdleFunc glutIdleFunc( idle idle ); );
• GLUT dispone de men GLUT dispone de menús pop s pop-up: up:
– Id_menu Id_menu = glutCreateMenu glutCreateMenu( menu_func menu_func )
– glutAddMenuEntry glutAddMenuEntry( “nombre nombre”, valor ); , valor );
– glutAddSubMenu glutAddSubMenu (“nombre nombre”, Id_menu Id_menu ); );
– glutAttachMenu glutAttachMenu( button button ); );
No hay comentarios:
Publicar un comentario