1 Programmazione grafica: lInterazione Daniele Marini.

Slides:



Advertisements
Presentazioni simili
Training On Line - CONP. 2 Richiesta Da Menu: Conferimenti ad inizio anno termico > Agosto > Pluriennali > Nuova Richiesta Si accede alla pagina di Richiesta.
Advertisements

INFORMATICA Altre Istruzioni di I/O
1 Tutto su liceoclassicojesi.it 1° Incontro sulla gestione di liceoclassicojesi.it.
LINGUAGGIO DI PROGRAMMAZIONE C
1 Introduzione ai calcolatori Parte II Software di base.
Interazione Uomo - Macchina
STRUTTURA DEL PERSONAL COMPUTER
GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari
Training On Line – CONA. 2 Richiesta Da Menu: Conferimenti ad inizio anno termico > Agosto > Annuali > Nuova Richiesta Si accede alla pagina di Richiesta.
Programmazione Procedurale in Linguaggio C++
1 9: Progettazione Architetturale Obiettivo: stabilire la struttura globale di un sistema software Descriveremo diversi tipi di modello di architettura,
Caratteri e stringhe di caratteri
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Gerarchie di Oggetti Tutti i sistemi avanzati di grafica (PHIGS, OpenGL, DirectDraw, …) permettono di definire un modello come una gerarchia di oggetti.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
2 Sistema composto da un numero elevato di componenti, in cui ogni componente svolge una sua funzione elaborazione dati memorizzazione dati trasferimento.
Costruzione di Interfacce Lezione 6 Esercitazione Trasformazioni
1 Costruzione di Interfacce Primi passi in OpenGL
1 Costruzione di Interfacce Primi passi in OpenGL
1 Corso di Informatica (Programmazione) Lezione 4 (24 ottobre 2008) Architettura del calcolatore: la macchina di Von Neumann.
Corso di Informatica (Programmazione)
eliana minicozzi linguaggi1a.a lezione2
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Struttura dei sistemi operativi (panoramica)
I Thread.
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
DHTML: Modello degli Eventi 1. 2 Sommario Introduzione Evento onclick Evento onload Gestione errori con onerror Gestione mouse con levento onmousemove.
Interazione utente-programma
Strutture di controllo in C -- Flow Chart --
I File.
Le funzioni.
Labortaorio informatica 2003 Prof. Giovanni Raho 1 INFORMATICA Termini e concetti principali.
Introduzione alle basi di dati
1 Gestione della Window Daniele Marini. 2 Definire una Window: GLUT o altro WM /* Standard GLUT initialization */ glutInit(&argc,argv); glutInitDisplayMode.
Lavorare con le matrici in OGL
Portale Capacità STOGIT
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
L' ARCHITETTURA DI VON NEUMANN
Bando Arti Sceniche. Per poter procedere è indispensabile aprire il testo del Bando 2ROL - Richieste On Line.
Esercitazioni di Meteorologia da satellite
Primitive grafiche e interazione Daniele Marini Corso Di Programmazione Grafica e Laboratorio.
Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione.
Architettura di OGL e pipe-line Daniele Marini Corso Di Programmazione Grafica.
Trasformazioni in OGL Daniele Marini.
14 marzo 2002 Avvisi:.
Documentazione Tecnica
Programmazione grafica 1
1 Visualizzazione scientifica Daniele Marini. 2 Visualizzazione scientifica Trovare un modo per rendere i risultati di un calcolo scientifico, o rilevati.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
Complessità di un algoritmo
1 Il Sistema Operativo: Esempio n Le operazioni effettuate sembrano abbastanza semplici ma … n Provocano una serie di eventi in cui vengono coinvolte sia.
Controllare le proiezioni
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Trasformazioni in OGL Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.
Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.
Primitive grafiche e interazione Daniele Marini Corso Di Programmazione Grafica e Laboratorio.
Picking - OpenGL Disegno della scena (display) Impostazione parametri selezione Ripristino parametri Loop Selezione.
Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione.
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Display list e picking Daniele Marini Corso Di Programmazione Grafica e Laboratorio.
Controllare la prospettiva
Architettura di OGL e pipe-line Daniele Marini Davide Gadia Davide Selmo Corso Di Programmazione Grafica aa2005/2006.
Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione.
1 Programmazione grafica: l’Interazione Daniele Marini.
Modulo 6 Test di verifica
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
1 Input/Output. 2 Livelli del sottosistema di I/O Hardware Gestori delle interruzioni Driver dei dispositivi Software di sistema indipendente dal dispositivo.
Operatori di incremento e decremento
1 Input/Output. 2 Livelli del sottosistema di I/O Hardware Gestori delle interruzioni Driver dei dispositivi Software di sistema indipendente dal dispositivo.
Transcript della presentazione:

1 Programmazione grafica: lInterazione Daniele Marini

2 Generalità Linterazione dipende dalle caratteristiche dei dispositivi fisici e del sistema operativo OpenGL si appoggia sul window manager (X- Window, Microsoft Windows, Mac,..) Per interfacciare OpenGL al window manager faremo uso di GLUT, indipendente dallo specifico WM

3 Dispositivi di input Dispositivi logici e dispositivi fisici: analogo al rapporto indotto da funzioni come: printf, scanf, getchar, putchar : si puo leggere o scrivere su file, stampante, display, tastiera ecc. Nella grafica è più complesso: non sono solo caratteri!

4 Dispositivi di input Dispositivi di puntamento: per indicare una posizione su uno schermo, comprende bottoni per inviare interrupt o segnali Mouse Trackball Tablet Light pen Joystick Spaceball Tastiera: invia caratteri

5 Mouse/trackball Non trasmettono posizione ma velocità posizione relativaI due valori rilevati dal movimento della sferetta sono incrementi relativi, posti in relazione allintervallo di tempo danno luogo al calcolo di una velocità, la cui integrazione restituisce una posizione relativa Permette di ottenere movimenti lenti o veloci del cursore

6 tablet Fornisce posizione assoluta La posizione viene rilevata con interazione elettromagnetica della punta di una penna speciale con una maglia di fili annegati nella superficie Touch screen ha funzioni analoghe

7 lightpen Un sensore ottico rileva la presenza di luce dal display, invia un interrupt allhost, che ricava la posizione conoscendo listante di rilevazione dellinterrupt e il tempo di scansione della figura; identifica loggetto grafico indicato conoscendo lintera struttura dati e il modo di attraversamento della struttura Limiti dovuti alla complessità e alla soglia di illuminazione: se punta lo sfondo non rileva luce!

8 Joystick Anche il joystick rileva velocità, che vengono integrate per calcolare posizioni relative Può avere componenti meccaniche che simulano effetti di resistenza con stimolazione cinestesica

9 Spaceball Dotata di sensori di pressione, ha sei gradi di libertà ed è adatta ad input 3D: Front-back left-right top-bottom Rotazioni su tre assi

10 Dispositivi logici - classificazione GKS e PHIGS Secondo lo standard GKS e PHIGS sei logical devices: String - es. tastiera Locator - fornisce coordinate mondo (WC) es. mouse con conversione da SC (ccordinate schermo) a WC Pick - restituice lidentificatore di un oggetto Choice - seleziona una opzione Dial - input analogico (potenziometri) Stroke - array di locazioni

11 Logical devices - OpenGL string - supportata dal Window Manager (WM), OGL non distingue tra dispositivo fisico e logico (tastiera) locator - OGL converte da SC a WC con dati da mouse ecc. selection Pick - OGL usa il processo selection (gadget: congegno, dispositivo; aggeggio, arnese) choice - OGL usa widgets (gadget: congegno, dispositivo; aggeggio, arnese) del WM (menu, scrollbar, bottoni ecc.) dial - OGL usa widgets del WM (sliders) stroke - OGL simula linvio di sequenze di valori attivando e terminando lo stream ad es. col bottone del mouse

12 Misura e trigger misuratriggerLinput di un dispositivi fisico è caratterizzato da misura e trigger –Misura: è il valore restituito dal dispositivo –Trigger: è un input fisico con cui lutente invia un segnale al sistema String: measure = caratteri battuti, trigger = CR Locator: measure = posizione, trigger = click su bottone Si può anche considerare un valore di stato (il cursore è fuori dalla window …)

13 Modi di input Request mode –La misura viene ritornata al sistema quando il trigger viene attivato request_locator(device_id, &measure) Sample mode –Input immediato, non cè trigger sample_locator(device_id, &measure)

14 Request mode - tipico di programmi non grafici, es. input da tastiera con scanf –Oppure per posizionare il cursore in WM e selezionare con click Sample mode e request mode non sono adatti ad applicazioni in cui lutente determina il flusso del programma, è piuttosto il programma che guida lutente (es. scelte di menu, word processing) In un simulatore di volo possono esserci input da moltissimi dispositivi

15 Event mode Permette di trattare situazioni complesse In ogni istante ogni dispositivo può generare un evento Le measures del dispositivo, con identificatore associato, sono poste in una coda di eventi (event queue) indipendentemente da ciò che sta eseguendo il programma - il programma esamina la coda e decide che fare, se la coda è vuota resta idle

16 Event mode callbackAlternativamente si associa a ogni tipo di evento una callback Lapproccio con callback è il più usato nei sistemi di WM e in OGL, e si presta a situazioni client-server

17 Client-server Servizi distribuiti in LAN (printer, file, graphics,..) Un programma applicativo OGL e un processo client che usa un graphics server, i due processi possono risiedere sul medesimo sistema o essere distribuiti

18 Display List Per poter gestire eventi e interazione è necessario tener traccia della struttura dati grafica generata dal programma e modificata dalla interazione È più difficile cancellare che disegnare!

19 Display list - origini Origine nei sistemi grafici pre-workstation display memory diplay filedisplay listRegistrare in una memoria dedicata (display memory) del display processor le istruzioni a basso livello (nella forma di diplay file o display list) per generare il disegno sul monitor Si distingueva tra monitor a memoria (storage) e monitor refresh (raster) Negli storage la DL poteva essere rimossa, nei refresh la DL doveva venire attraversata a 50 Hz

20 Display list - client server Oggi il display processor è un server grafico e il programma applicativo può essere in esecuzione su un client Il bottleneck non è tra host e DP, ma tra server e client - due modalità di display: immediate modeModo immediato (immediate mode)- la primitiva grafica viene spedita al server al momento in cui è definita, e non se ne conserva memoria; per ridisegnarla il programma deve eseguire nuovamente listruzione che genera la primitiva retained modeModo differito (retained mode)

21 Display list - client server retained modeModo differito (retained mode) - la descrizione della primitiva viene posta in una display list che risiede nel server grafico, la DL viene attraversata su richiesta del client per ridisegnare la figura Vantaggi: »minor traffico di rete »Il client sfrutta le performance grafiche del server »Si tiene memoria della figura per successive modifiche e interazione Svantaggi: »Costo di memoria

22 OGL e Display list Creazione: glNewList, glEndList #define BOX 1 /* definisce un quadrato, attribuisce il nome BOX e il numero 1 */ glNewList(BOX, GL_COMPILE); 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;

23 GL_COMPILE flag - indica al sistema di inviare la display list al server ma di non visualizzare la struttura BOX GL_COMPILE_AND_EXECUTE il display è immediato Per disegnare la struttura si esegue la funzione: glCallList(BOX); Cambiando attributi alla struttura o modificando i parametri di window, viewport, o di proiezione ed eseguendo la glCallList la figura viene disegnata modificata

24 La display list viene usata in modo massiccio per programmi di modellazione geometrica, per trasformare la geometria degli oggetti si usano matrici, attributi e trasformazioni possono essere nidificate con una gestione a stack: glPushAttrib(GL_ALL_ATTRIB_BITS); glPushMatrix(); e recuperati con: glPopAttrib(); glPopMatrix(); Si possono gestire più liste contemporaneamente: glGenLists(number); permette di creare liste con identificatori consecutivi, restituendo il primo intero di number disponibile, sono consecutivi corrispondenti a label non ancora usate; glCallLists permette di eseguire, visualizzandole contemporaneamente, tutte le liste definite (es. gestione del testo con display list, paragrafo Angel - pag )

25 Programmazione dellinterazione event driven Uso del puntatore Terminazione programma Resize della finestra Gestione della finestra Menu Picking

26 Uso puntatore Il puntatore può essere usato per la terminazione del programma; distinguiamo tra –move event –move event: il mouse viene mosso col bottone premuto –passive move event –passive move event: mosso con bottone alzato Dopo un move event la measure del device (posizione del mouse) è resa disponibile –mouse event –mouse event - un bottone del mouse è premuto o rilasciato (il bottone mantenuto premuto non genera eventi, è la transizione che conta!)

27 Terminazione programma glutMouseFunction(mouse_callback_func); void mouse_callback_func(int button, int state, int x, int y,); int x, int y; { if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) exit(); } registrate Altri bottoni o uno stato differente del mouse non provocano nulla, non ci sono callback registrate col WM

28 main int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLLUT_RGB); glutCreateWindow(square); myinit(); glutReshapeFunc(myReshape); glutMouseFunc(mouse); glutDisplayFunc(display); glutMainLoop(); } Reshape è invocato quando la finestra viene modificata dallutente Ogni programma deve avere una display callback, anche vuota: void display() {}

29 Disegnare un rettangolo al click del mouse void mouse(int button, int state, int x, int y); { if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) drawSquare(x,y); if(button==GLUT_MIDDLE_BUTTON && state==GLUT_DOWN) exit(); } La drawSquare si limita a disegnare, gli attributi del disegno vanno definiti altrove, nellesempio in myinit

30 myinit /* globals */ Glsizei wh = 500, ww = 500; /* dim finestra iniziale */ Glfloat size = 3.0; /* metà del lato del quadrato */ void myinit(void) { glViewport(0,0,ww,wh); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, (GLdouble) ww, 0.0, (GLdouble) wh, -1.0, 1.0); glMatrixModel(GL_MODELVIEW); glClearColor (0.8, 0.8, 0.8, 1.0); glClear(GL_COLOR_BUFFER_BIT); glFlush(); }

31 Disegno del quadrato Lorigine del sistema di riferimento nel WM è in alto a sinistra, con y verso il basso, in OGL è in basso a sinistra con y verso lalto - bisogna flippare la y ritornata dal mouse: void drawSquare(int x, int y) { y=wh-y; /* flippa y */ glColor3ub( (char) random()%256, (char) random()%256, (char) random()%256); glBegin(GL_POLYGON); glVertex2f(x+size, y+size); glVertex2f(x-size, y+size); glVertex2f(x-size, y-size); glVertex2f(x+size, y-size); glEnd(); }

32 Il programma è completo Inizializza una finestra, disegna un quadrato di colore casuale nel punto selezionato dal mouse col tasto di sinistra; termina premendo il tasto di mezzo del mouse resizeNon ha menu, se la finestra viene modificata (resize) il programma non sa che fare

33 Window events Es: resize, che fare? –Ridisegnare tutto? –Che fare se laspect ratio cambia? –Si cambiano le dimensioni degli oggetti se la finestra cambia dimensioni? Nellesempio si ridisegna tutto, mantenendo i rapporti degli oggetti (quadrati restano quadrati) e si applica il clipping Levento di resize restituisce altezza e larghezza della window

34 myReshape 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 (0.8, 0.8, 0.8, 1.0); glClear(GL_COLOR_BUFFER_BIT); display(); glFlush(); }

35 Display callback La glutDisplayFunc(display) viene eseguita quando GLUT determina che la finestra va ridisegnata, certamente alla prima apertura; in questo caso è utile disegnare le parti statiche della finestra La display callback può essere usata per animazione, quando cambiano parametri nel programma Per iconizzare una finestra si usa la glutPostDisplay() Per disabilitare una callback si può settare la sua callback function a NULL

36 Finestre multiple id=glutCreateWindow(second window); Lintero ritornato permette di attivare la prima o la seconda finestra: glutSetWindow(id); Si possono modificare parametri e proprietà della seconda finestra prima di definirla: glutInitDisplayMode( …); id=glutCreateWindow(third window);

37 Menu Pull-down e pop-up menus glutCreateMenu(demo_menu); glutAddMenuEntry(quit,1); glutAddMenuEntry(increase square size,2); glutAddMenuEntry(decrease square size,3); glutAttachMenu(GLUT_RIGHT_BUTTON); void demo_menu(int id); { if(id==1) exit(); else if (id==2) size = 2*size; else if (id==3) size=size/2; glutPostRedisplay(); }

38 Menu pull-down gerarchici sub_menu = glutCreateMenu(size_menu); glutAddMenuEntry(increase square size,2); glutAddMenuEntry(decrease square size,3); glutCreateMenu(top_menu); glutAddMenuEntry(quit,1); alutAddSubMenu(Resize, sub_menu); glutAttachMenu(GLUT_RIGHT_BUTTON); Esercizio: scrivere le callback function di: size_menu top_menu