Primitive grafiche e interazione Daniele Marini Corso Di Programmazione Grafica e Laboratorio.

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
Dipartimento di Ingegneria Idraulica e Ambientale - Universita di Pavia 1 Caduta non guidata di un corpo rettangolare in un serbatoio Velocità e rotazione.
1 Tutto su liceoclassicojesi.it 1° Incontro sulla gestione di liceoclassicojesi.it.
TAV.1 Foto n.1 Foto n.2 SCALINATA DI ACCESSO ALL’EREMO DI SANTA CATERINA DEL SASSO DALLA CORTE DELLE CASCINE DEL QUIQUIO Foto n.3 Foto n.4.
1 Pregnana Milanese Assessorato alle Risorse Economiche Bilancio Preventivo P R O P O S T A.
Massa Laura Mela Enrica
GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari
Frontespizio Economia Monetaria Anno Accademico
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++
Implementazione dell algortimo di Viterbi attraverso la soluzione del problema di cammino mi- nimo tramite software specifico. Università degli studi di.
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.
Programmazione 1 9CFU – TANTE ore
Texture Mapping.
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.
Ufficio Studi UNIONCAMERE TOSCANA 1 Presentazione di Riccardo Perugi Ufficio Studi UNIONCAMERE TOSCANA Firenze, 19 dicembre 2000.
Realizzazione e caratterizzazione di una semplice rete neurale per la separazione di due campioni di eventi Vincenzo Izzo.
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Master universitario di II livello in Ingegneria delle Infrastrutture e dei Sistemi Ferroviari Anno Accademico 2012/2013 Cultura dimpresa, valutazione.
La partita è molto combattuta perché le due squadre tentano di vincere fino all'ultimo minuto. Era l'ultima giornata del campionato e il risultato era.
Dipartimento di Ingegneria Idraulica e Ambientale - Universita di Pavia 1 Scritte scritte scritte scritte scritte scritte scritte Scritte scritte Titolo.
DHTML: Modello degli Eventi 1. 2 Sommario Introduzione Evento onclick Evento onload Gestione errori con onerror Gestione mouse con levento onmousemove.
Progetto di applicazioni grafiche. Disegno di forme complesse Prassi : un classe per ciascuna forma Progetta la forma individuando le componenti base.
Interazione utente-programma
Strutture di controllo in C -- Flow Chart --
Lezione 6 Encoder ottici
I File.
Introduzione alle basi di dati
1 Programmazione grafica: lInterazione Daniele Marini.
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
Contatore: esempio di circuito sequenziale
1 Negozi Nuove idee realizzate per. 2 Negozi 3 4.
Protocollo informatico: interoperabilità e PEC
Esercitazioni di Meteorologia da satellite
Le proiezioni e la prospettiva
21 marzo 2002 (ri-)Avvisi: Giovedi 28 marzo la lezione e sospesa. Nuovo indirizzo di Spedire messaggi e esercizi solo.
1 Ly-LAB Sistema di gestione dei dati analitici di laboratorio.
Dal modello alla visualizzazione: Verso il foto realismo Daniele Marini.
Primitive grafiche e interazione Daniele Marini Corso Di Programmazione Grafica e Laboratorio.
Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione.
14 marzo 2002 Avvisi:.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Le proiezioni e la prospettiva
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.
1 Ottimizzazione della scena: culling (decimazione) Daniele Marini.
Controllare le proiezioni
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.
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
Primitive OpenGL Corso di Programmazione Grafica e Laboratorio Daniele Marini.
1 Programmazione grafica: l’Interazione Daniele Marini.
Ottimizzazione della scena: culling (decimazione) Daniele Marini.
Ottimizzazione della scena: culling (decimazione) Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.
TRASFORMATA DI FOURIER
A.P. cat. B - 1 Per chi vuole: Libro di testo D.P. Curtis, K. Foley, K. Sen, C. Morin Informatica di base 2° edizione Mc Graw-Hill Companies.
Ingresso e uscita in Java F. Bombi 10 ottobre 2002.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
Transcript della presentazione:

Primitive grafiche e interazione Daniele Marini Corso Di Programmazione Grafica e Laboratorio

2 Primitive OpenGL - 1 Supporto per diversi tipi di primitive di base –Punti –Linee –Quadrilateri –Poligoni (convessi) Tutte le primitive sono specificate tramite una sequenza di vertici

3 Primitive OpenGL - 2 Le primitive vengono dichiarate mediante la coppia di funzioni glBegin(GLenum mode); glEnd(); mode specifica la primitiva che sarà definita tramite la lista di vertici che seguirà

4 Primitive OpenGL - 3

5 Esempio GLfloat pt[2] = {3.0, 4.0}; glBegin(GL_POINTS); glVertex2f(1.0, 2.0); // x=1, y=2 glVertex2f(2.0, 3.0); // x=2, y=3 glVertex2fv(pt); // x=3, y=4 glVertex2i(4,5); // x=4, y=5 glEnd();

6 Primitive e oggetti complessi Gli oggetti complessi vengono costruiti a partire dagli elementi di base Tipicamente OpenGL visualizza gli oggetti definiti per mezzo di strumenti avanzati

7 Orientamento delle facce Poligoni e triangoli sono orientati –Percorrendo in senso antiorario i vertici la normale e’ rivolta verso l’osservatore e identifica la faccia esterna –Per decidere l’orientamento si valuta il segno dell’area:

8 Orientamento delle facce OGL permette di controllare l’orientamento delle facce: glFrontFace(GL_CCW|GL_CW) Si possono eliminare le facce autonascoste con la funzione: glCullFace(GL_BACK|GL_FRONT_AND_BACK) Il culling può essere abilitato o disabilitato: glEnable(GL_CULLFACE) glDisable()

9 Definizione dei vertici glVertex2fv() Numero di coordinate del punto (2,3,4) Formato dei dati (f,d,i,s) Opzionale: Indica che le componenti sono memorizzate all’interno di un array

10 Tipi di dati b integer a 8 bit s short integer 16 bit i integer 32 bit f floating point 32 bit d floating point doppia precisione 64 bit ub unsigned integer (char) 8 bit us unsigned short 16 bit ui unsigned integer 32 bit

11 Vertici e Colori OpenGL consente di assegnare colori diversi ai vertici di una primitiva (esempio poligono o quadrilatero) I colori “intermedi” vengono calcolati per interpolazione in modo automatico Il colore è definito secondo il modello R,G,B

12 Vertici e Colori glBegin(GL_QUADS); glColor3f(1,0,0); glVertex3d(-3, -3, -3); glColor3f(0,1,0); glVertex3d(3, -3, -3); glColor3f(0,0,1); glVertex3d(3, 3, -3); glColor3f(1,0,1); glVertex3d(-3, 3, -3); glEnd();

13 Interazione L’interazione dipende dalle caratteristiche dei dispositivi fisici e del sistema operativo OpenGL si appoggia al window manager (X- Window, Microsoft Windows, Mac OSX,..) Per interfacciare OpenGL al window manager faremo uso della libreria speciale standard GLUT, indipendente dallo specifico WM

14 Dispositivi di input Distinguiamo tra dispositivi logici e dispositivi fisici Nell’interazione elementare si puo’ leggere o scrivere su file, stampante, display, tastiera trasferendo caratteri o interi file Nella grafica è più complesso: non sono solo caratteri o generici file di dati!

15 Dispositivi di input grafico 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

16 Mouse/trackball Non trasmettono posizione ma velocità posizione relativaI due valori rilevati dal movimento della sferetta sono incrementi relativi, posti in relazione all’intervallo 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

17 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

18 lightpen Un sensore ottico rileva la presenza di luce dal display, invia un interrupt all’host, che ricava la posizione conoscendo l’istante di rilevazione dell’interrupt e il tempo di scansione della figura; può identificare l’oggetto grafico indicato se conosce l’intera 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!

19 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”

20 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

21 Dispositivi avanzati Dataglove, body tracking, haptic Localizzatori magnetici, acustici, ottici

22 Dispositivi avanzati Localizzatori in radio frequenza Phidgets (widget fisici): sensori di temperatura, pressione, inerzia …

23 Dispositivi logici - classificazione GKS e PHIGS Gli standard GKS e PHIGS (ormai obsoleti) definiscono sei logical device: String - es. tastiera Locator - fornisce coordinate mondo (WC) es. mouse con conversione da SC (coordinate schermo) a WC Pick - restituice l’identificatore di un oggetto Choice - seleziona una opzione Dial - input analogico (potenziometri) Stroke - array di locazioni

24 Dispositivi logici - 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 chiamato 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 l’invio di sequenze di valori attivando e terminando lo stream ad es. col bottone del mouse

25 Menu pull-down e menu pop-up

26 Misura e trigger misuratriggerL’input di un dispositivi fisico è caratterizzato da misura e trigger – Misura : è il valore restituito dal dispositivo – Trigger : è un input fisico con cui l’utente 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 (es: il cursore è fuori dalla window …)

27 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)

28 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 l’utente determina il flusso del programma, è piuttosto il programma che guida l’utente (es. scelte di menu, word processing) In un simulatore di volo possono esserci input da moltissimi dispositivi

29 Event mode Permette di trattare situazioni complesse In ogni istante ogni dispositivo può generare un evento Le measure 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

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

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

32 Le librerie di OGL GLU GL GLUT GLX Applicazione Frame Buffer Frame Buffer Window System

33 GLUT - 1 Glut –Libreria per: la creazione di finestre in cui OpenGL possa disegnare La gestisce dell'interazione con l'utente su tali finestre. –Non fornisce dispositivi di interazione sofisticati (bottoni, campi di testo, ecc.).

34 GLUT –2 Includes –#include // OpenGL decl. –#include // GUI funcs Interfaccia grafica e librerie GLUT –Descrizione degli oggetti forniti da GLUT Finestre Menu Interazione: Mouse, Tastiera, etc…

35 Inizializzazione di GLUT - 1 int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB ); glutInitWindowSize(200, 200); glutCreateWindow(“Window Title"); glutReshapeFunc(reshapeFunc); glutDisplayFunc(displayFunc); glutMainLoop(); return 0; }

36 Inizializzazione di GLUT - 2 Funzioni di Reshape e Display glutReshapeFunc(reshapeFunc); glutDisplayFunc(displayFunc); Reshape –Gestisce il ridimensionamento della finestra Display –Contiene il codice per la visualizzazione

37 ReshapeFunc Imposta la viewport glViewport(0, 0, w, h); Imposta la camera glMatrixMode(GL_PROJECTION) // camera settings... glMatrixMode(GL_MODELVIEW);//ritorna alla matrice di modellazione

38 DisplayFunc Disegna la scena (o chiama le display list) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // drawing code glFlush(); glutSwapBuffers(); // If double-buffered

39 Programmazione dell’interazione event driven Uso del puntatore Terminazione programma Resize della finestra Gestione della finestra Menu Picking

40 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!)

41 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

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

43 Disegnare un quadratino 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, nell’esempio in myinit

44 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(); }

45 Disegno del quadrato L’origine del sistema di riferimento nel WM è in alto a sinistra, con y verso il basso, in OGL è in basso a sinistra con y verso l’alto - 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(); }

46 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

47 Window events in caso di resize, che fare? –Ridisegnare tutto? –Che fare se l’aspect ratio cambia? –Si cambiano le dimensioni degli oggetti se la finestra cambia dimensioni? Nell’esempio si ridisegna tutto, mantenendo i rapporti degli oggetti (quadrati restano quadrati) e si applica il clipping L’evento di resize restituisce altezza e larghezza della window

48 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(); }

49 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

50 Finestre multiple id=glutCreateWindow(“second window”); L’intero 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”);

51 Menu Pull-down e pop-up menu 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(); }

52 Menu pop-up gerarchici sub_menu = glutCreateMenu(size_menu); glutAddMenuEntry(“increase square size”,2); glutAddMenuEntry(“decrease square size”,3); glutCreateMenu(top_menu); glutAddMenuEntry(“quit”,1); glutAddSubMenu(“Resize”, sub_menu); glutAttachMenu(GLUT_RIGHT_BUTTON); Esercizio: scrivere le callback function di: size_menu top_menu