Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di...

22
Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale

Transcript of Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di...

Page 1: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

Display list e scene graph

Daniele MariniDipartimento di Informatica e

Comunicazione

Corso di Programmazione Grafica per il Tempo Reale

Page 2: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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!

2PGTR aa 2010/2011

Page 3: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

Display list - origini

• Origine nei sistemi grafici pre-workstation• Registrare in una memoria dedicata (display memorydisplay memory)

del display processor le istruzioni a basso livello (nella forma di diplay filediplay file o display listdisplay 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

3PGTR aa 2010/2011

Page 4: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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 modeimmediate 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 moderetained mode)

4PGTR aa 2010/2011

Page 5: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

Display list - client server • Modo differito (retained moderetained 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

5PGTR aa 2010/2011

Page 6: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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;

6PGTR aa 2010/2011

Page 7: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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

7PGTR aa 2010/2011

Page 8: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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

8PGTR aa 2010/2011

Page 9: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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)

9PGTR aa 2010/2011

Page 10: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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

10PGTR aa 2010/2011

Page 11: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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)

11PGTR aa 2010/2011

Page 12: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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)

12PGTR aa 2010/2011

Page 13: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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

}13PGTR aa 2010/2011

Page 14: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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 child

14PGTR aa 2010/2011

Page 15: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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

15PGTR aa 2010/2011

Page 16: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

Attraversamento dell’albero

• Struttura antropomorfa:

• Albero gerarchico:

16PGTR aa 2010/2011

Page 17: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

Matrici

17PGTR aa 2010/2011

Page 18: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

Attraversamento dell’alberoantropos();

{ glPushMatrix();torso();glTranslate(…);glRotate3(…);head();

glPopMatrix(); glPushMatrix();

glTranslate(…);glRotate3(…);left_upper_leg();glTranslate(…);glRotate3(…);left_lower_leg();

glPopMatrix(); glPushMatrix();

glTranslate(…);glRotate3(…);right_upper_leg();…

18PGTR aa 2010/2011

Page 19: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

Gestione dell’albero

• La struttura dell’albero viene gestita dal programma applicativo, OGL non offre primitive.

• La struttura generale:

19PGTR aa 2010/2011

Page 20: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

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

20PGTR aa 2010/2011

Page 21: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

Scene graph

Per distinguere le sottostrutture occorre inserire un nodo “separatore”

separator separator

21PGTR aa 2010/2011

Page 22: Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione Corso di Programmazione Grafica per il Tempo Reale.

Gestione del Scene graph

• OGL non offre primitive• Esistono API che supportano scene

graph, es: VRML, Inventor, Java3D, OpenSceneGraph, Ogre3D

• In alternativa occorre sviluppare un proprio codice

22PGTR aa 2010/2011