Gerarchie di Oggetti

Tutti i sistemi avanzati di grafica (PHIGS,
OpenGL, DirectDraw, …) permettono di definire
un modello come una gerarchia di oggetti.

Il libro usa come riferimento il sistema SPHIGS
(Simplified PHIGS), noi useremo OpenGL.

Una gerarchia è una collezione di oggetti
organizzata in una struttura ad albero o DAG
Modellazione Gerarchica
Informatica Grafica
1
Modellazione Geometrica

Per rappresentare i nostri oggetti useremo un
modello geometrico.

Utile a rappresentare:
» Organizzazioni nello spazio e forma di componenti
» Connessioni e topologia degli oggetti
» Valori e proprietà dei componenti

I modelli spesso hanno struttura gerarchica legata
alla loro costruzione bottom-up o top-down.
Modellazione Gerarchica
Informatica Grafica
2
Modelli Gerarchici

Ogni oggetto è composto da altri oggetti più
semplici. Esempio robot con struttura a DAG (a) od
albero (b):
Modellazione Gerarchica
Informatica Grafica
3
Retained-Mode Graphics

OpenGL lavora in immediate-mode (eccetto le
display lists):
1) definizione primitiva
2) visualizzazione
3) cancellazione primitiva

Molti altri sistemi (PHIGS, OpenInventor, …)
tengono traccia (in un database interno) di tutte le
primitive (retained-mode). Questo permette
modifiche ed aggiornamenti successivi che sono
meno immediati con OpenGL.
Modellazione Gerarchica
Informatica Grafica
4
Modelli Gerarchici in
OpenGL

Modelli gerarchici si modellano in OpenGL usando
la matrice GL_MODELVIEW, il suo stack e
(spesso) le display lists.

Ogni oggetto semplice viene modellato nelle sue
coordinate e poi immesso nel disegno complessivo
applicandogli una serie di trasformazioni.

Permette di riutilizzare una stessa primitiva in più
parti del modello
Modellazione Gerarchica
Informatica Grafica
5
Display List (1)


Gruppo di comandi OpenGL memorizzati per
essere usati in seguito. Utili sia per efficienza che
per poter riutilizzare gli oggetti.
Comandi fondamentali:
int glGenLists(GLsizei range) Alloca range indici di display list
void glNewList(GLuint list, GLenum mode) Specifica l’inizio
di una lista. Tutti i comandi fino a glEndList() finiscono nella
display list.
2 mode possibili:
GL_COMPILE e
GL_COMPILE_AND_EXECUTE.
Modellazione Gerarchica
Informatica Grafica
6
Display List (2)



I comandi in una display lists non possono essere
modificati, poiche la display list viene “compilata”
per efficienza. Nella lista vengono memorizzati solo
i valori delle espressioni.
Una display list viene eseguita con il comando:
glCallList(Gluint list), che esegue tutti i comandi
memorizzati nella display list list.
Le display list possono contenere al loro interno
altre display list in maniera gerarchica.
Modellazione Gerarchica
Informatica Grafica
7
Strada con 3 Case Diverse
Vogliamo disegnare un modello dove abbiamo 3 case.
Assumiamo di avere creato, nella funzione init,
una display list casa che disegna la casa 1.
Modellazione Gerarchica
Informatica Grafica
8
Programma
void display( void )
{ glCallList(casa);
glLoadIdentity();
glTranslatef(8.0, 0.0, 0.0);
glRotatef(90.0, 0.0, 1.0, 0.0);
glScale3f(2.0, 3.0, 1.0);
glCallList(casa);
glLoadIdentity();
glTranslatef(3.5, 0.0, -2.5);
glScalef(0.75, 0.75, 0.75);
glCallList(casa);
glFlush();
}
Modellazione Gerarchica
Informatica Grafica
9
Strutture a 3 Livelli
Se vogliamo avere le tre case con un camino
possiamo usare display list gerarchiche
Assumiamo di avere creato, nella funzione init, anche
una display list camino che disegna il caminetto.
Modellazione Gerarchica
Informatica Grafica
10
Programma OpenGL
void display( void )
{ GLuint casaEcamino = glGenLists(1);
glNewList(casaEcamino, GL_COMPILE);
glCallList(casa);
glTranslatef(0.25, 2.0, -2.0);
glScalef(0.25, 0.25, 0.25);
glCallList(camino);
glEndList();
glCallList(casaEcamino); glLoadIdentity();
glTranslatef(8.0, 0.0, 0.0);glRotatef(90.0, 0.0, 1.0, 0.0); glScalef(2.0, 3.0, 1.0);
glCallList(casaEcamino);
glLoadIdentity();
glTranslatef(3.5, 0.0, -2.5);
glScalef(0.75, 0.75, 0.75);
glCallList(casaEcamino);
glFlush();
}
Modellazione Gerarchica
Informatica Grafica
11
Nuovo Programma
// Senza usare ulteriori display lists.
void disegna_casa ()
{ glCallList(casa);
glTranslatef(0.25, 2.0, -2.0);
glRotatef(-90.0, 0.0, 1.0, 0.0); glScalef(0.25, 0.25, 0.25);
glCallList(camino);
}
void display( void )
{ disegna_casa();
glTranslatef(8.0, 0.0, 0.0);
glRotatef(90.0, 0.0, 1.0, 0.0); glScalef(2.0, 3.0, 1.0);
disegna_casa();
glTranslatef(3.5, 0.0, -2.5);
glScalef(0.75, 0.75, 0.75);
disegna_casa();
glFlush();
}
Modellazione Gerarchica
Informatica Grafica
12
(S)vantaggi uso display list

Era possibile disegnare lo stesso oggetto senza
usare alcuna display list. Le display list sono
efficienti, ma non possono essere modificate.

Molto utili per disegnare parti non modificabili di
un disegno, ma non per parti in movimento.

Per disegnare oggetti che si congiungono, useremo
spesso le operazioni sullo stack della matrice
MODELVIEW.
Modellazione Gerarchica
Informatica Grafica
13
Braccio Robot
Esempio di un semplicissimo braccio di robot
snodato e ruotabile in 2 punti
Modellazione Gerarchica
Informatica Grafica
14
Programma Robot (1)
#include <GL/glut.h>
#include <stdlib.h>
static int shoulder = 0, elbow = 0;
int main(int argc, char** argv)
{ glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
Modellazione Gerarchica
Informatica Grafica
15
Programma Robot (2)
void init(void)
{ glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); }
void display(void) { glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef (-1.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (2.0, 0.4, 1.0); glutWireCube (1.0);
glPopMatrix();
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (2.0, 0.4, 1.0); glutWireCube (1.0);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
Modellazione Gerarchica
Informatica Grafica
16
Programma Robot (3)
void reshape (int w, int h)
{ glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0, 0.0, -5.0);
}
Modellazione Gerarchica
Informatica Grafica
17
Programma Robot (4)
void keyboard (unsigned char key, int x, int y)
{ switch (key) {
case 's': shoulder = (shoulder + 5) % 360; glutPostRedisplay();
break;
case 'S': shoulder = (shoulder - 5) % 360; glutPostRedisplay();
break;
case 'e': elbow = (elbow + 5) % 360; glutPostRedisplay();
break;
case 'E': elbow = (elbow - 5) % 360; glutPostRedisplay();
break;
case 27: exit(0); break;
default: break; }
}
Modellazione Gerarchica
Informatica Grafica
18
Robot Completo
Costruiamo un modello di robot composto da:
- Tronco
- Testa (rotabile sul collo)
- 2 Braccia con mano (rotabili sulla spalla)
- Pollice indipendente per ogni mano
Modellazione Gerarchica
Informatica Grafica
19
Robot

Composizione delle
parti:
Modellazione Gerarchica
Informatica Grafica
20
Attenzioni



Problemi: siccome ogni pezzo è nelle sue coordinate
devo traslare e scalare.
Dove penso che un’operazione sia possibile in
futuro metto una matrice da subito.
Es.: rotazione della testa.
Nota: il pollice opponibile è dalla stessa parte, ed
alla stessa distanza nelle due braccia. Per avere la
simmetria il sinistro deve essere ruotato di 180°
sull’asse delle Y.
Modellazione Gerarchica
Informatica Grafica
21
Gestione Attributi

Determinati dinamicamente durante la visita.

Ogni specifica di un attributo ha valore per tutto il
programma, a meno di una riassegnazione.

In OpenGL è possibile, allo stesso modo delle
matrici, salvare gli attributi in uno stack per poi
recuperarli.
Modellazione Gerarchica
Informatica Grafica
22
Comandi per Attributi

I comandi per salvare e recuperare i valori degli
attributi sono:
void glPushAttrib(GLbitfield mask);
void glPopAttrib(void);
Ci sono oltre 20 mask diverse che servono a
specificare diversi insiemi di attributi. Esempio:
GL_COLOR_BUFFER_BIT, GL_ALL_ATTRIB_BIT
Modellazione Gerarchica
Informatica Grafica
23
Scarica

4-gerarchie