primitive grafiche e interazione daniele marini corso di programmazione grafica e laboratorio
TRANSCRIPT
Primitive grafiche e interazione
Daniele Marini
Corso Di Programmazione Grafica e Laboratorio
Programmazione Grafica aa2007/2008 2
Primitive OpenGL - 1
• Supporto per diversi tipi di primitive di base– Punti– Linee– Quadrilateri– Poligoni (convessi)
• Tutte le primitive sono specificate tramite una sequenza di vertici
Programmazione Grafica aa2007/2008 3
Primitive OpenGL - 2
• Le primitive vengono dichiarate mediante la coppia di funzioni
glBegin(GLenum mode);
glEnd();
• mode specifica la primitiva che sarà definita tramite la lista di vertici che seguirà
Programmazione Grafica aa2007/2008 4
Primitive OpenGL - 3
Programmazione Grafica aa2007/2008 5
Esempio
GLfloat pt[2] = {3.0, 4.0};
glBegin(GL_POINTS); glVertex2f(1.0, 2.0); // x=1, y=2 glVertex2f(2.0, 3.0); // x=2, y=3 glVertex2fv(pt); // x=3, y=4 glVertex2i(4,5); // x=4, y=5
glEnd();
Programmazione Grafica aa2007/2008 6
Primitive e oggetti complessi
• Gli oggetti complessi vengono costruiti a partire dagli elementi di base
• Tipicamente OpenGL visualizza gli oggetti definiti per mezzo di strumenti avanzati
Programmazione Grafica aa2007/2008 7
Orientamento delle facce
• Poligoni e triangoli sono orientati– Percorrendo in senso antiorario i vertici la normale e’ rivolta verso l’osservatore e identifica la faccia esterna
– Per decidere l’orientamento si valuta il segno dell’area:
€
a =1/2 (x iy i+1 − x i+1y i)i= 0
n−1
∑
Programmazione Grafica aa2007/2008 8
Orientamento delle facce
• OGL permette di controllare l’orientamento delle facce:
glFrontFace(GL_CCW|GL_CW)• Si possono eliminare le facce autonascoste con la funzione:
glCullFace(GL_BACK|GL_FRONT_AND_BACK)
• Il culling può essere abilitato o disabilitato:
glEnable(GL_CULLFACE)glDisable()
Programmazione Grafica aa2007/2008 9
Definizione dei vertici
glVertex2fv()
Numero di coordinate del punto (2,3,4) Formato dei dati
(f,d,i,s)
Opzionale:
Indica che le componenti sono memorizzate all’interno di un array
Programmazione Grafica aa2007/2008 10
Tipi di dati
• b integer a 8 bit• s short integer 16 bit• i integer 32 bit• f floating point 32 bit• d floating point doppia precisione 64 bit
• ub unsigned integer (char) 8 bit• us unsigned short 16 bit• ui unsigned integer 32 bit
Programmazione Grafica aa2007/2008 11
Vertici e Colori
• OpenGL consente di assegnare colori diversi ai vertici di una primitiva (esempio poligono o quadrilatero)
• I colori “intermedi” vengono calcolati per interpolazione in modo automatico
• Il colore è definito secondo il modello R,G,B
Programmazione Grafica aa2007/2008 12
Vertici e Colori
glBegin(GL_QUADS);
glColor3f(1,0,0);
glVertex3d(-3, -3, -3);
glColor3f(0,1,0);
glVertex3d(3, -3, -3);
glColor3f(0,0,1);
glVertex3d(3, 3, -3);
glColor3f(1,0,1);
glVertex3d(-3, 3, -3);
glEnd();
Programmazione Grafica aa2007/2008 13
Interazione
• L’interazione dipende dalle caratteristiche dei dispositivi fisici e del sistema operativo
• OpenGL si appoggia al window manager (X-Window, Microsoft Windows, Mac OSX, ..)
• Per interfacciare OpenGL al window manager faremo uso della libreria speciale standard GLUT, indipendente dallo specifico WM
Programmazione Grafica aa2007/2008 14
Dispositivi di input
Distinguiamo tra dispositivi logici e dispositivi fisici
Nell’interazione elementare si puo’ leggere o scrivere su file, stampante, display, tastiera trasferendo caratteri o interi file
Nella grafica è più complesso: non sono solo caratteri o generici file di dati!
Programmazione Grafica aa2007/2008 15
Dispositivi di input grafico
• Dispositivi di puntamento: per indicare una posizione su uno schermo, comprende bottoni per inviare interrupt o segnali
• Mouse• Trackball• Tablet• Light pen• Joystick• Spaceball• …
• Tastiera: invia caratteri
Programmazione Grafica aa2007/2008 16
Mouse/trackball
• Non trasmettono posizione ma velocità• I due valori rilevati dal movimento della sferetta sono incrementi relativi, posti in relazione all’intervallo di tempo danno luogo al calcolo di una velocità, la cui integrazione restituisce una posizione relativaposizione relativa
• Permette di ottenere movimenti lenti o veloci del cursore
Programmazione Grafica aa2007/2008 17
tablet
• Fornisce posizione assoluta• La posizione viene rilevata con interazione elettromagnetica della punta di una penna speciale con una maglia di fili annegati nella superficie
• Touch screen ha funzioni analoghe
Programmazione Grafica aa2007/2008 18
lightpen
• Un sensore ottico rileva la presenza di luce dal display, invia un interrupt all’host, che ricava la posizione conoscendo l’istante di rilevazione dell’interrupt e il tempo di scansione della figura; può identificare l’oggetto grafico indicato se conosce l’intera struttura dati e il modo di attraversamento della struttura
• Limiti dovuti alla complessità e alla soglia di illuminazione: se punta lo sfondo non rileva luce!
Programmazione Grafica aa2007/2008 19
Joystick
• Anche il joystick rileva velocità, che vengono integrate per calcolare posizioni relative
• Può avere componenti meccaniche che simulano effetti di resistenza con stimolazione “cinestesica”
Programmazione Grafica aa2007/2008 20
Spaceball
• Dotata di sensori di pressione, ha sei gradi di libertà ed è adatta ad input 3D:
•Front-back left-right top-bottom•Rotazioni su tre assi
Programmazione Grafica aa2007/2008 21
Dispositivi avanzati
• Dataglove, body tracking,
• haptic
• Localizzatori magnetici, acustici, ottici
Programmazione Grafica aa2007/2008 22
Dispositivi avanzati
• Localizzatori in radio frequenza
• Phidgets (widget fisici): sensori di temperatura, pressione, inerzia …
QuickTime™ e undecompressore TIFF (Non compresso)
sono necessari per visualizzare quest'immagine.
QuickTime™ e undecompressore TIFF (Non compresso)
sono necessari per visualizzare quest'immagine.
Programmazione Grafica aa2007/2008 23
Dispositivi logici - classificazione GKS e
PHIGS
•Gli standard GKS e PHIGS (ormai obsoleti) definiscono sei logical device:
• String - es. tastiera• Locator - fornisce coordinate mondo (WC) es. mouse con conversione da SC (coordinate schermo) a WC• Pick - restituice l’identificatore di un oggetto• Choice - seleziona una opzione• Dial - input analogico (potenziometri)• Stroke - array di locazioni
Programmazione Grafica aa2007/2008 24
Dispositivi logici - OpenGL
• string - supportata dal Window Manager (WM), OGL non distingue tra dispositivo fisico e logico (tastiera)• locator - OGL converte da SC a WC con dati da mouse ecc.• Pick - OGL usa il processo chiamato selectionselection• choice - OGL usa widgets (gadget: (gadget:
congegno, dispositivo; aggeggio, arnese)congegno, dispositivo; aggeggio, arnese) del WM (menu, scrollbar, bottoni ecc.)• dial - OGL usa widgets del WM (sliders)• stroke - OGL simula l’invio di sequenze di valori attivando e terminando lo stream ad es. col bottone del mouse
Programmazione Grafica aa2007/2008 25
Menu pull-down e menu pop-up
Programmazione Grafica aa2007/2008 26
Misura e trigger• L’input di un dispositivi fisico è caratterizzato da misuramisura e triggertrigger– Misura: è il valore restituito dal dispositivo
– Trigger: è un input fisico con cui l’utente invia un segnale al sistema•String: measure = caratteri battuti, trigger = CR
•Locator: measure = posizione, trigger = click su bottone
• Si può anche considerare un valore di stato (es: il cursore è fuori dalla window …)
Programmazione Grafica aa2007/2008 27
Modi di input
• Request mode– La misura viene ritornata al sistema quando il trigger viene attivato
request_locator(device_id, &measure)
• Sample mode– Input immediato, non c’è triggersample_locator(device_id, &measure)
Programmazione Grafica aa2007/2008 28
• Request mode - tipico di programmi non grafici, es. input da tastiera con scanf– Oppure per posizionare il cursore in WM e selezionare con click
• Sample mode e request mode non sono adatti ad applicazioni in cui l’utente determina il flusso del programma, è piuttosto il programma che guida l’utente (es. scelte di menu, word processing)
• In un simulatore di volo possono esserci input da moltissimi dispositivi
Programmazione Grafica aa2007/2008 29
Event mode• Permette di trattare situazioni complesse
• In ogni istante ogni dispositivo può generare un evento
• Le measure del dispositivo, con identificatore associato, sono poste in una coda di eventi (event queue) indipendentemente da ciò che sta eseguendo il programma - il programma esamina la coda e decide che fare, se la coda è vuota resta idle
Programmazione Grafica aa2007/2008 30
Event mode
• Alternativamente si associa a ogni tipo di evento una callbackcallback
• L’approccio con callback è il più usato nei sistemi di WM e in OGL, e si presta a situazioni client-server
Programmazione Grafica aa2007/2008 31
Client-server• Servizi distribuiti in LAN (printer, file server, graphics server, computational server, ..)
• Un programma applicativo OGL e’ un processo client che usa un graphics server, i due processi possono risiedere sul medesimo sistema o essere distribuiti
Programmazione Grafica aa2007/2008 32
Le librerie di OGL
GLUGLU
GLGL
GLUTGLUT
GLXGLX
ApplicazioneApplicazione
Frame
Buffer
Frame
Buffer
Window SystemWindow System
Programmazione Grafica aa2007/2008 33
Librerie principali OGL
Programmazione Grafica aa2007/2008 34
Run-Time support (Apple)
Programmazione Grafica aa2007/2008 35
GLUT - 1
• Glut – Libreria per:
•la creazione di finestre in cui OpenGL possa disegnare
•La gestisce dell'interazione con l'utente su tali finestre.
– Non fornisce dispositivi di interazione sofisticati (bottoni, campi di testo, ecc.).
Programmazione Grafica aa2007/2008 36
GLUT –2
• Includes– #include <GL/gl.h> // OpenGL decl.– #include <GL/glut.h> // GUI funcs
• Interfaccia grafica e librerie GLUT– Descrizione degli oggetti forniti da GLUT•Finestre•Menu•Interazione: Mouse, Tastiera, etc…
Programmazione Grafica aa2007/2008 37
Inizializzazione di GLUT - 1
int main(int argc, char *argv[]){
glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB );glutInitWindowSize(200, 200);glutCreateWindow(“Window Title");
glutReshapeFunc(reshapeFunc);glutDisplayFunc(displayFunc);
glutMainLoop();return 0;
}
Programmazione Grafica aa2007/2008 38
Inizializzazione di GLUT - 2
• Funzioni di Reshape e DisplayglutReshapeFunc(reshapeFunc);glutDisplayFunc(displayFunc);
• Reshape – Gestisce il ridimensionamento della finestra
• Display– Contiene il codice per la visualizzazione
Programmazione Grafica aa2007/2008 39
ReshapeFunc
• Imposta la viewportglViewport(0, 0, w, h);
• Imposta la cameraglMatrixMode(GL_PROJECTION) // camera settings ...
glMatrixMode(GL_MODELVIEW);//ritorna alla matrice di modellazione
Programmazione Grafica aa2007/2008 40
DisplayFunc
• Disegna la scena (o chiama le display list) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();
// drawing code
glFlush();glutSwapBuffers(); // If double-buffered
Programmazione Grafica aa2007/2008 41
Programmazione dell’interazione event
driven• Uso del puntatore• Terminazione programma• Resize della finestra• Gestione della finestra• Menu • Picking
Programmazione Grafica aa2007/2008 42
Uso puntatore• Il puntatore può essere usato per la terminazione del programma; distinguiamo tra– move eventmove event: il mouse viene mosso col bottone premuto
– passive move eventpassive move event: mosso con bottone alzatoDopo un move event la “measure” del device (posizione del mouse) è resa disponibile
– mouse eventmouse event - un bottone del mouse è premuto o rilasciato (il bottone mantenuto premuto non genera eventi, è la transizione che conta!)
Programmazione Grafica aa2007/2008 43
Terminazione programma
glutMouseFunction(mouse_callback_func);
void mouse_callback_func(int button, int state, int x, int y,);
int x, int y;
{
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
exit();
}
Altri bottoni o uno stato differente del mouse non provocano nulla, non ci sono callback registrateregistrate col WM
Programmazione Grafica aa2007/2008 44
main
int main(int argc, char **argv){
glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutCreateWindow(“square”);myinit();glutReshapeFunc(myReshape);glutMouseFunc(mouse);glutDisplayFunc(display);glutMainLoop();
}
Reshape è invocato quando la finestra viene modificata dall’utenteOgni programma deve avere una display callback, anche vuota:void display() {}
Programmazione Grafica aa2007/2008 45
Disegnare un quadratino al click del mouse
void mouse(int button, int state, int x, int y);{
if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) drawSquare(x,y);
if(button==GLUT_MIDDLE_BUTTON && state==GLUT_DOWN) exit();
}
La drawSquare si limita a disegnare, gli attributi del disegno vanno definiti altrove, nell’esempio in myinit
Programmazione Grafica aa2007/2008 46
myinit
/* globals */
Glsizei wh = 500, ww = 500; /* dim finestra iniziale */Glfloat size = 3.0; /* metà del lato del quadrato */
void myinit(void){
glViewport(0,0,ww,wh);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0.0, (GLdouble) ww , 0.0, (GLdouble) wh , -1.0,
1.0);glMatrixModel(GL_MODELVIEW);glClearColor (0.8, 0.8, 0.8, 1.0);glClear(GL_COLOR_BUFFER_BIT);glFlush();
}
Programmazione Grafica aa2007/2008 47
Disegno del quadratoL’origine del sistema di riferimento nel WM è in alto a sinistra, con y verso il basso, in OGL è in basso a sinistra con y verso l’alto - bisogna “flippare” la y ritornata dal mouse:void drawSquare(int x, int y){
y=wh-y; /* flippa y */ glColor3ub( (char) random()%256, (char) random()%256, (char) random()%256); glBegin(GL_POLYGON); glVertex2f(x+size, y+size); glVertex2f(x-size, y+size); glVertex2f(x-size, y-size); glVertex2f(x+size, y-size); glEnd();}
Programmazione Grafica aa2007/2008 48
Il programma è completo
• Inizializza una finestra, disegna un quadrato di colore casuale nel punto selezionato dal mouse col tasto di sinistra; termina premendo il tasto di mezzo del mouse
• Non ha menu, se la finestra viene modificata (resizeresize) il programma non sa che fare
Programmazione Grafica aa2007/2008 49
Window events
• in caso di resize, che fare?– Ridisegnare tutto?– Che fare se l’aspect ratio cambia?– Si cambiano le dimensioni degli oggetti se la finestra cambia dimensioni?
• Nell’esempio si ridisegna tutto, mantenendo i rapporti degli oggetti (quadrati restano quadrati) e si applica il clipping
• L’evento di resize restituisce altezza e larghezza della window
Programmazione Grafica aa2007/2008 50
myReshapevoid myReshape(GLsizei w, GLsizei h){
/* adjust clipping box */
glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
/* adjust viewport and clear */
glViewport(0,0,w,h); glClearColor (0.8, 0.8, 0.8, 1.0); glClear(GL_COLOR_BUFFER_BIT); display(); glFlush();}
Programmazione Grafica aa2007/2008 51
Display callback
La glutDisplayFunc (display) viene eseguita quando GLUT determina che la finestra va ridisegnata, certamente alla prima apertura; in questo caso è utile disegnare le parti statiche della finestraLa display callback può essere usata per animazione, quando cambiano parametri nel programmaPer iconizzare una finestra si usa la glutPostDisplay()Per disabilitare una callback si può settare la sua callback function a NULL
Programmazione Grafica aa2007/2008 52
Finestre multiple
id=glutCreateWindow(“second window”);
L’intero ritornato permette di attivare la prima o la seconda finestra:
glutSetWindow(id);
Si possono modificare parametri e proprietà della seconda finestra prima di definirla:
glutInitDisplayMode( …);id=glutCreateWindow(“third window”);
Programmazione Grafica aa2007/2008 53
MenuPull-down e pop-up menu
glutCreateMenu(demo_menu);glutAddMenuEntry(“quit”,1);glutAddMenuEntry(“increase square size”,2);glutAddMenuEntry(“decrease square size”,3);glutAttachMenu(GLUT_RIGHT_BUTTON);
void demo_menu(int id);{
if(id==1) exit();else if (id==2) size = 2*size;else if (id==3) size=size/2;glutPostRedisplay();
}
Programmazione Grafica aa2007/2008 54
Menu pull-down gerarchici
sub_menu = glutCreateMenu(size_menu);glutAddMenuEntry(“increase square size”,2);glutAddMenuEntry(“decrease square size”,3);glutCreateMenu(top_menu);glutAddMenuEntry(“quit”,1);alutAddSubMenu(“Resize”, sub_menu);glutAttachMenu(GLUT_RIGHT_BUTTON);
Esercizio: scrivere le callback function di: size_menutop_menu