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!
Display list - origini
• Origine nei sistemi grafici pre-workstation
• Registrare 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
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:
• Modo 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
• Modo differito (retained mode)
Display list - client server
• Modo 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
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;
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
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();
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 3.4.2 Angel)
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
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)
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)
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();
}
Strutture gerarchiche
base
lower_arm
upper_arm
Draw
M
child
child
• La struttura può essere
simbolicamente
rappresentata come
albero
• Ogni nodo ha una
struttura: puntatore alla
funzione,
trasformazione
omogenea, puntatore al
figlio
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
Attraversamento dell’albero
• Struttura antropomorfa:
• Albero gerarchico:
Matrici
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();
…
Gestione dell’albero
• La struttura dell’albero
viene gestita dal
programma applicativo,
OGL non offre
primitive.
• La struttura generale:
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
Scene graph
Per distinguere le sottostrutture occorre inserire un nodo
“separatore”
separator
separator
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
Scarica

Display list e scen graph - Università degli Studi di Milano