La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Gestione di Interfacce con OpenGL

Presentazioni simili


Presentazione sul tema: "Gestione di Interfacce con OpenGL"— Transcript della presentazione:

1 Gestione di Interfacce con OpenGL
Claudio Rocchini

2 Aspetti di OpenGL Vedremo alcuni aspetti di OpenGL che risultano utili nello sviluppo di interfacce. Inoltre vedremo come si possono implementare alcune funzioni utili per l’interazione con l’untente. 13/11/2018 Claudio Rocchini

3 Picking di un Punto 3D Un’operazione tipica e’ la lettura delle coordinate spaziali di un punto, ad esempio dopo che l’utente ha cliccato sulla finestra OpenGL. Passi fondamentali: Recupero matrici di trasformazione correnti Lettura Z-Buffer Proiezione inversa 13/11/2018 Claudio Rocchini

4 Picking di un Punto 3D GLdouble modelMatrix[16];
GLdouble projMatrix[16]; GLint viewport[4]; // Recupero matrici e viewport glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix); glGetDoublev(GL_PROJECTION_MATRIX,projMatrix); glGetIntegerv(GL_VIEWPORT,viewport); // ATTENZIONE: ribaltamento Y!!!!! sy = viewport[3]-1-sy; 13/11/2018 Claudio Rocchini

5 Picking di un Punto 3D // Lettura z buffer GLfloat qz;
// Seleziono il buffer corretto glReadBuffer(GL_FRONT); glReadPixels(sx,sy,1,1,GL_DEPTH_COMPONENT, GL_FLOAT,&qz); 13/11/2018 Claudio Rocchini

6 Picking di un Punto 3D if(qz==1.0){ // Proiezione inversa
x = y = z = 0.0; return false; } else { GLdouble objz = qz; GLdouble tx,ty,tz; gluUnProject( GLdouble(sx), GLdouble(sy), objz, modelMatrix, projMatrix, viewport, &tx, &ty, &tz); return true; } 13/11/2018 Claudio Rocchini

7 Picking di un Punto 3D Il codice di picking puo’ essere ottimizzato leggendo le matrici di proiezione e la viewport solo nel momento in cui cambiano: La viewport e la projection matrix, di solito, vengono aggiornate solo al resize della finestra La modelview viene aggiornata quando si cambia punto di visuale (rotazione, zoom, etc). 13/11/2018 Claudio Rocchini

8 Picking di un Punto 3D In alcuni casi e’ impossibile eseguire il picking: Se non si usa lo z-buffer (Solo per le schede 3D di ultima generazione), se si e’ attivato l’antialiasing delle immagini (lo z-buffer e’ incosistente). 13/11/2018 Claudio Rocchini

9 Selezione Per selezione si intende l’identificazione di un oggetto OpenGL a partire dalla sua visualizzazione. Per realizzarla si usano le funzionalita’ native di OpenGL. Utilizzo tipico: dopo il click dell’utente e’ necessario identificare l’oggetto puntato. 13/11/2018 Claudio Rocchini

10 Selezione Il Meccanismo della selezione OpenGL e’ il seguente:
Si sceglie la zona su cui operare la selezione (tipicamente un cono di vista centrato sulla posizione di click del mouse). Si renderizza solo la zona interessata, badando a dare un nome ad ogni oggetto renderizzato. Tutti i nome degli oggetti renderizzati nella zona selezionata sono memorizzati in un buffer. 13/11/2018 Claudio Rocchini

11 Selezione 1 // Definizione del buffer di selezione
const GLsizei MAXSBUF = 512; GLuint sbuf[MAXSBUF]; GLint buflen; // Preparativi generali // Seleziona il buffer di picking glSelectBuffer( MAXSBUF, sbuf ); glRenderMode( GL_SELECT ); // Modalita' select 13/11/2018 Claudio Rocchini

12 Selezione 2 // Rovesciamento coordinate
y = viewport[3] - viewport[1] y; // Preparazione matrice di selezione glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPickMatrix(x, y, wx,wy, wextra.viewport); gluPerspective(prospAngle,aspect,nearPlane,farPlane); glMatrixMode( GL_MODELVIEW ); 13/11/2018 Claudio Rocchini

13 Selezione 3 glInitNames(); glLoadName(0); // Rendering con nome …
// Chiusura modalita' selezione buflen = glRenderMode( GL_RENDER ); // Interpretazione dei risultati 13/11/2018 Claudio Rocchini

14 Selezione 4 // Esempio di rendering con nome (oggetto) Int name = 7;
glPushName(name); glBegin(GL_TRIANGLES); glVertex3fv(v[0]); glVertex3fv(v[1]); glVertex3fv(v[2]); glEnd(); glPopName(); 13/11/2018 Claudio Rocchini

15 Selezione 5 // Esempio di rendering con nome (triangoli)
glBegin(GL_TRIANGLES); for(int I=0;I<v.size();++I) { glPushName(I+1); glVertex3fv(v[I][0]); glVertex3fv(v[I][1]); glVertex3fv(v[I][2]); glPopName(); } glEnd(); 13/11/2018 Claudio Rocchini

16 Selezione Intepretazione del buffer risultato: // Parsing dello stack
pr.resize(buflen); int j = 0; for(int i=0;i<buflen;++i){ int n = sbuf[j++]; // Namestack size pr[i].minDepth = sbuf[j++]/double(UINT_MAX); pr[i].maxDepth = sbuf[j++]/double(UINT_MAX); pr[i].nameStack.resize(n); for(int k=0;k<n;++k) pr[i].nameStack[k] = sbuf[j++]; } 13/11/2018 Claudio Rocchini

17 Dragging in OpenGL E’ utile implementare la funzione di dragging, passi fondamentali: Salvare lo stato OpenGL attuale Selezionare la modalita’ di disegno diretta (front buffer) e in modalita’ xor Selezionare modalita’ di proiezione diretta (coordinate 2d = coordinate pixel) Eseguire il disegno del drag senza glClear (lo sfondo e’ disegnato una sola volta) 13/11/2018 Claudio Rocchini

18 Dragging 1 // Salvataggio stato opengl
glGetIntegerv( GL_DRAW_BUFFER, &oldDrawBuffer ); glGetIntegerv( GL_DEPTH_FUNC, &oldDepthFunc ); glGetIntegerv( GL_LINE_STIPPLE_PATTERN, &oldLineStippleP ); glGetIntegerv( GL_LINE_STIPPLE_REPEAT , & oldLineStippleR ); 13/11/2018 Claudio Rocchini

19 Dragging 2 glDrawBuffer( GL_FRONT ); // Modalita’ disegno
glDepthFunc( GL_ALWAYS ); glLineStipple( 1, 0xF6F6 ); glMatrixMode( GL_MODELVIEW ); // Vista glPushMatrix(); glLoadIdentity(); glMatrixMode( GL_PROJECTION ); // Proiezione glOrtho( 0, vport[2], 0, vport[3], 0, 1 ); 13/11/2018 Claudio Rocchini

20 Dragging 3 // Colore disegno: bianco
glGetMaterialfv( GL_FRONT, GL_EMISSION ,oldEColor ); glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, white ); // Abilitazione motalita’ xor tramite la funzione // blending: colore = 1 – colore_sfondo; BlendingIsE = glIsEnabled( GL_BLEND ); glEnable( GL_BLEND ); glGetIntegerv( GL_BLEND_SRC, & BlendFun1 ); glGetIntegerv( GL_BLEND_DST, & BlendFun2 ); glBlendFunc( GL_ONE_MINUS_DST_COLOR, GL_ZERO ); 13/11/2018 Claudio Rocchini

21 Dragging 4 // Dragging vero e proprio glBegin(GL_LINE_LOOP);
glVertex2i( ox,oy ); glVertex2i( ox,dy ); glVertex2i( dx,dy ); glVertex2i( dx,oy ); glEnd(); dx = x; dy = y; glFinish(); 13/11/2018 Claudio Rocchini

22 Dragging 5 // End drag: ripristino stato OpenGL
glDrawBuffer( oldDrawBuffer ); glDepthFunc( oldDepthFunc ); glLineStipple( oldLineStippleR, oldLineStippleP ); glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, oldEC ); if( !BlendingIsE ) glDisable( GL_BLEND ); glBlendFunc( BlendFun1, BlendFun2 ); glPopMatrix(); glMatrixMode( GL_MODELVIEW ); 13/11/2018 Claudio Rocchini

23 Stampa di testi Per visualizzare stringhe sul render OpenGL:
Se si utilizza glut c’e’ la funzione apposita In MFC, si puo’ utilizzare il codice: SelectObject(we.ghDC, GetStockObject (SYSTEM_FONT)); wglUseFontBitmaps(we.ghDC, 0, 256, FONT_BASE); glListBase(FONT_BASE); CallLists (strlen(str), GL_UNSIGNED_BYTE,str); 13/11/2018 Claudio Rocchini

24 Librerie OpenGL ad alto livello
Nel corso degli anni sono state sviluppate una serie di librerie ad alto livello per l’utilizzo di OpenGL. Quasi tutte si basano sulla definizione di un grafo di scena, che rappresenta gli oggetti da visualizzare, le loro propieta’ ed eventuali azioni su di essi. Lo sviluppatore storico di queste librerie e la Silicon Graphics. Negli ultimi tempi la crisi finanziaria della SGI ha lascito aperto il campo. 13/11/2018 Claudio Rocchini

25 Pregi e difetti Tutte le librerie HL OpenGL hanno pregi e difetti:
Sviluppo veloce di applicazioni complesse Presenza di tool non banali da implementare (manipolatori tridimensionali, semplificatori automatici di geometrie, …) Difetti: Incremento della memoria utilizzata (Per SGI forte incremento!) Scarsa flessibilita’: difatto per lo sviluppo di applicazioni commerciali, risulta spesso piu’ semplice ripartire da OpenGL. 13/11/2018 Claudio Rocchini

26 Storiografia Sviluppo SGI:
OpenInventor ( -> VRML 1.0 -> VRML 2.0) CosmoSoftware (CosmoPlayer) SGI Performer SGI Optimizer SGI Volumizer Vari tentativi da parte di altre ditte di porting o risviluppo del codice (TGS,…) 13/11/2018 Claudio Rocchini

27 Storiografia Sviluppi OpenSource, Shareware: infiniti.
Google: “opengl scene graph”: 7500 hits Solo su sourceforge ci sono decine di progetti in corso di sviluppo. In realta’ realizzare una libreria decente comporta una grossa mole di lavoro. 13/11/2018 Claudio Rocchini

28 Un esempio di HL OpenGL GCR: libreria grafica OpenGL ad alto livello.
Implementa uno scene graph simile ad OpenInventor Caratteristiche salienti: E’ freeware, open source, ed e’ a disposizione di questo corso per studio o modifica E’ parzialmente implementata E’ infinitamente rozza 13/11/2018 Claudio Rocchini

29 Contatti Claudio Rocchini Visual Computing Group ISTI-CNR,
Area della Ricerca di Pisa Web: 13/11/2018 Claudio Rocchini


Scaricare ppt "Gestione di Interfacce con OpenGL"

Presentazioni simili


Annunci Google