Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione
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! 2Programmazione grafica a.a. 2007/2008
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 3Programmazione grafica a.a. 2007/2008
Display list - client server Oggi il display processor è un server grafico (GPU) e il programma applicativo può essere in esecuzione su un client Il bottleneck non è tra host e DP, ma tra server e client, occorre ottimizzare il traffico - due modalità di display: immediate modeModo immediato (immediate mode)- la primitiva grafica viene inviata al server al momento in cui è definita, e non se ne conserva memoria; per ridisegnarla il programma deve eseguire nuovamente l’istruzione che genera la primitiva retained modeModo differito (retained mode) 4Programmazione grafica a.a. 2007/2008
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 5Programmazione grafica a.a. 2007/2008
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; 6Programmazione grafica a.a. 2007/2008
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, es: glMatrixMode(GL_PROJECTION; For (i=1 ; i<5 ; i++) { glLoadIdentity(); gluOrtho(-2.0*i.2.0*i,-2.0*i;2.0*i); glCallList(BOX); } Ad ogni iterazione il BOX viene ridisegnato con una differente finestra di clipping 7Programmazione grafica a.a. 2007/2008
La display list viene usata in modo massiccio per programmi di modellazione geometrica, per modificare gli oggetti si usano matrici e attributi che possono essere nidificate con una gestione a stack: glPushAttrib(GL_ALL_ATTRIB_BITS); glPushMatrix(); Occorre ricordare la struttura a stati del sistema ed evitare che gli atttributi e le trasformazioni modificate si ripercuotano su oggetti in modo indesiderato perciò si sfrutta la struttura a stack: glPopAttrib(); glPopMatrix(); 8Programmazione grafica a.a. 2007/2008
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) 9Programmazione grafica a.a. 2007/2008
Modelli gerarchici Una scena complessa può essere descritta da un grafo (es. un albero) ad ogni nodo del grafo sono associate trasformazioni e proprietà di apparenza degli oggetti della scena 10Programmazione grafica a.a. 2007/2008
Istanze Un modello gerarchico può essere composto da più parti uguali poste asemblati in posizioni diverse L’oggetto è definito in un sistema di riferimento locale (local coordinate system - object frame) e posizionato nel riferemento globale (world coordinate system - world frame) 11Programmazione grafica a.a. 2007/2008
Istanze Per passare da local a world si usa la concatenazione di trasformazioni M=TRS glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslate(dx,dy,dz); glRotate(angle,rx,ry,rz); glScale(sx,sy,sz); gluSolidCUbe(side); Per ogni istanza occorre salvare lo stato globale e recuperarlo dopo averla istanziata con push e pop matrix (ed eventualmente attribute ) 12Programmazione grafica a.a. 2007/2008
Strutture gerarchiche Si pensi a un semplice braccio articolato composto da una base su cui può ruotare con due gradi di libertà un primo braccio legato al quale può ruotare (con due gradi di libertà) un secondo braccio: display() { glRotate(theta,0.0,1.0,0.0); base(); glTranslate(0.0,h1,0.0); glRotate(phi,0.0,0.0,1.0); lower_arm(); glTranslate(0.0,h2,0.0); glRotate(psi,0.0,0.0,1.0); upper_arm(); } 13Programmazione grafica a.a. 2007/2008
Strutture gerarchiche La struttura può essere simbolicamente rappresentata come albero Ogni nodo ha una struttura: puntatore alla funzione, trasformazione omogenea, puntatore al figlio base lower_arm upper_arm Draw M child 14Programmazione grafica a.a. 2007/2008
Strutture gerarchiche Per disegnare una struttura gerarchica occorre attraversare l’albero, a ogni nodo si applica la trasformazione omogenea e si visualizza l’oggetto Le trasformazioni devono essere gestite con lo stack 15Programmazione grafica a.a. 2007/2008
Attraversamento dell’albero Struttura antropomorfa: Albero gerarchico: 16Programmazione grafica a.a. 2007/2008
Matrici 17Programmazione grafica a.a. 2007/2008
Attraversamento dell’albero antropos(); { glPushMatrix(); torso(); glTranslate(…); glRotate3(…); head(); glPopMatrix(); glPushMatrix(); glTranslate(…); glRotate3(…); left_upper_leg(); glTranslate(…); glRotate3(…); left_lower_leg(); glPopMatrix(); glPushMatrix(); glTranslate(…); glRotate3(…); right_upper_leg(); … 18Programmazione grafica a.a. 2007/2008
Gestione dell’albero La struttura dell’albero viene gestita dal programma applicativo, OGL non offre primitive. La struttura generale: 19Programmazione grafica a.a. 2007/2008
Scene graph Una scena complessa oltre alla struttura gerarchica di modellazione e relative matrici, comprende attributi degli oggetti (colore, texture etc.) Anche gli attributi vengono gestiti nella struttura ad albero 20Programmazione grafica a.a. 2007/2008
Scene graph Per distinguere le sottostrutture occorre inserire un nodo “separatore” separator 21Programmazione grafica a.a. 2007/2008
Gestione del Scene graph OGL non offre primitive Esistono API che supportano scene graph, es: VRML, Inventor, Java3D, OpenSceneGraph In alternativa occorre sviluppare un proprio codice 22Programmazione grafica a.a. 2007/2008