La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

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

Presentazioni simili


Presentazione sul tema: "Primitive grafiche e interazione Daniele Marini Corso Di Programmazione Grafica e Laboratorio."— Transcript della presentazione:

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

2 Programmazione Grafica aa2007/20082 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 Programmazione Grafica aa2007/20083 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 Programmazione Grafica aa2007/20084 Primitive OpenGL - 3

5 Programmazione Grafica aa2007/20085 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 Programmazione Grafica aa2007/20086 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 Programmazione Grafica aa2007/20087 Orientamento delle facce Poligoni e triangoli sono orientati –Percorrendo in senso antiorario i vertici la normale e rivolta verso losservatore e identifica la faccia esterna –Per decidere lorientamento si valuta il segno dellarea:

8 Programmazione Grafica aa2007/20088 Orientamento delle facce OGL permette di controllare lorientamento 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 Programmazione Grafica aa2007/20089 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 allinterno di un array

10 Programmazione Grafica aa2007/200810 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 Programmazione Grafica aa2007/200811 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 Programmazione Grafica aa2007/200812 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 Programmazione Grafica aa2007/200813 Interazione Linterazione 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 Programmazione Grafica aa2007/200814 Dispositivi di input Distinguiamo tra dispositivi logici e dispositivi fisici Nellinterazione 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 Programmazione Grafica aa2007/200815 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 Programmazione Grafica aa2007/200816 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

17 Programmazione Grafica aa2007/200817 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 Programmazione Grafica aa2007/200818 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; può identificare loggetto grafico indicato se conosce 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!

19 Programmazione Grafica aa2007/200819 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 Programmazione Grafica aa2007/200820 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 Programmazione Grafica aa2007/200821 Dispositivi avanzati Dataglove, body tracking, haptic Localizzatori magnetici, acustici, ottici

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

23 Programmazione Grafica aa2007/200823 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 lidentificatore di un oggetto Choice - seleziona una opzione Dial - input analogico (potenziometri) Stroke - array di locazioni

24 Programmazione Grafica aa2007/200824 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 linvio di sequenze di valori attivando e terminando lo stream ad es. col bottone del mouse

25 Programmazione Grafica aa2007/200825 Menu pull-down e menu pop-up

26 Programmazione Grafica aa2007/200826 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 (es: il cursore è fuori dalla window …)

27 Programmazione Grafica aa2007/200827 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 Programmazione Grafica aa2007/200828 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

29 Programmazione Grafica aa2007/200829 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 Programmazione Grafica aa2007/200830 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

31 Programmazione Grafica aa2007/200831 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 Programmazione Grafica aa2007/200832 Le librerie di OGL GLU GL GLUT GLX Applicazione Frame Buffer Frame Buffer Window System

33 Programmazione Grafica aa2007/200833 Librerie principali OGL

34 Programmazione Grafica aa2007/200834 Run-Time support (Apple)

35 Programmazione Grafica aa2007/200835 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.).

36 Programmazione Grafica aa2007/200836 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…

37 Programmazione Grafica aa2007/200837 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; }

38 Programmazione Grafica aa2007/200838 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

39 Programmazione Grafica aa2007/200839 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

40 Programmazione Grafica aa2007/200840 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

41 Programmazione Grafica aa2007/200841 Programmazione dellinterazione event driven Uso del puntatore Terminazione programma Resize della finestra Gestione della finestra Menu Picking

42 Programmazione Grafica aa2007/200842 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!)

43 Programmazione Grafica aa2007/200843 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

44 Programmazione Grafica aa2007/200844 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 dallutente Ogni programma deve avere una display callback, anche vuota: void display() {}

45 Programmazione Grafica aa2007/200845 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, nellesempio in myinit

46 Programmazione Grafica aa2007/200846 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(); }

47 Programmazione Grafica aa2007/200847 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(); }

48 Programmazione Grafica aa2007/200848 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

49 Programmazione Grafica aa2007/200849 Window events in caso di 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

50 Programmazione Grafica aa2007/200850 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(); }

51 Programmazione Grafica aa2007/200851 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

52 Programmazione Grafica aa2007/200852 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);

53 Programmazione Grafica aa2007/200853 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(); }

54 Programmazione Grafica aa2007/200854 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


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

Presentazioni simili


Annunci Google