Computer graphics: produzione di immagini mediante elaboratore.
Sviluppo della Computer Graphics parallelo a quello della tecnologia hardware.
Man mano che avanza la tecnica, si cercano di produrre immagini sempre piu' sofisticate (3D, illuminazione, texture, animazione...) che richiedono sempre piu' memoria e potenza di calcolo.
La storia inizia con l'introduzione del tubo a raggi catodici, dispositivo che trasforma impulsi elettrici in immagini, cioe' con l'invenzione dello schermo.
Dagli anni '60 fino a meta' degli anni '80.
Un fascio di elettroni mobile colpisce
la superficie dello schermo disegnando linee.
E' grafica 2D. Si guida il fascio a disegnare figure.
Figura: esempi di primitive grafiche
Dagli anni '70 in poi.
Lo schermo e' organizzato come una griglia di elementi di immagine
o pixel (picture element).
Un fascio di elettroni scandisce lo schermo sequenzialmente riga
per riga potendo variare intensita' ad ogni pixel.
E' grafica 2D o 3D.
In entrambi i casi prima si traduce la scena in una matrice di pixel
(raster) in memoria, e poi la si trasferisce su schermo.
Per ottenere il colore si usano tre fasci di
elettroni per i tre colori primari (rosso, verbe, blu).
Figura: immagine raster e la stessa ingrandita per mostrare la
struttura a matrice di pixel
![]() | ![]() |
Uso della comunicazione visuale in sostituzione o aggiunta al linguaggio parlato o scritto.
Uso di strumenti grafici interattivi nella progettazione assistita da calcolatore (CAD).
Generazione di immagini sofisticate in tempo reale.
Interazione con l'elaboratore tramite paradigma visuale (finestre, menu', icone...).
Sistemi a finestre, interfacce grafiche, interfaccia di sistema.
Cinque componenti principali:
Area di memoria in genere implementata con chip di memoria speciali (Video Random-Access Memory, VRAM, o Dynamic Random-Access Memory, DRAM).
E' una matrice, controparte in memoria dell'area rettangolare dello schermo (finestra) dove avviene la visualizzazione.
Le dimensioni del frame buffer corrispondono a larghezza ed altezza in pixel della finestra su schermo.
Ospita l'immagine cosi' come e' visualizzata nella finestra.
Il contenuto del frame buffer e' detto matrice o raster di pixel, pixmap (pixel map) o bitmap.
Figura: immagine raster e la stessa a 1/4 della risoluzione
(ingrandita alla stessa dimensione)
![]() | ![]() |
In genere il frame buffer e' composto da piu' buffer, fra cui
Color buffer: contiene informazione sul colore dei pixel.
Color buffer profondo 1 bit permette solo 2 colori,
color buffer profondo 8 bit permette 2^8 colori.
Sistemi full color in genere 24 bit per pixel: 8 per ciascuno dei
colori primari red, green, blue (R,G,B).
Depth buffer: contiene informazione sulla distanza
dall'osservatore della porzione di scena visualizzata nel pixel.
Serve per effettuare eliminazione di parti nascoste in
visualizzazione di scene 3D.
Spesso finestre grafiche hanno double buffer:
Alcuni sistemi grafici hanno hardware specializzato per specifiche funzioni grafiche.
Forniscono funzionalita' relative a:
primitive | primitive con attributi | trasformazioni di una primitiva |
![]() | ![]() |
![]() |
Compiuta dal programmatore che scrive il codice dell'applicazione grafica.
Il programmatore specifica la geometria degli oggetti da visualizzare mediante primitive geometriche.
Le primitive geometriche corrispondono a oggetti elementari che il sistema "conosce". Sono espresse in forma vettoriale (linee, cerchi, poligoni...).
Assieme alla geometria il programmatore imposta informazioni accessorie che influiranno sulla resa grafica delle primitive:
Il risultato di questa fase e' una scena che esiste in memoria, pronta per essere visualizzata, cioe' per essere trasformata in immagine.
Compiuta dal sistema grafico elaborando le primitive, gli attributi e le trasformazioni.
Tramite calcoli, il sistema grafico genera un'immagine raster
(determina i valori di colore per i pixel nel frame buffer).
La conversione di primitive vettoriali 2D in immagine raster e'
detta rasterizzazione o scan conversion.
Nella grafica 3D, prima della rasterizzazione si ha una traduzione da 3D a 2D fatta in base alla posizione dell'osservatore e alle proprieta' della telecamera. E' un processo complesso che passa attraverso varie fasi. La rasterizzazione avviene solo alla fine.
Attributi e trasformazioni sono parte dello stato del sistema,
non sono associati alle primitive.
Non e' una primitiva che e' rossa, ma e' il sistema che sta disegnando
con il rosso!
Il codice e' un'alternanza di:
Durante il flusso di esecuzione:
Nei sistemi grafici esiste la possibilita' di salvare lo stato corrente,
questo permette di
modificare lo stato temporaneamente per poi ripristinarlo.
Es: cambiare il colore in rosso, disegnare qualcosa (che sara' rosso)
e poi tornare al colore di prima (qualsiasi esso fosse) per disegnare
quel che segue.
Il colori sono espressi in un sistema di riferimento detto spazio o modello dei colori (color space o color model).
Si specifica come formare un colore mischiando alcuni colori considerati primari:
Modello di colore additivo in cui si considerano tre colori primari (rosso, verde, blu) che sono mischiati per formare il colore desiderato.
Un colore C e' definito come somma pesata di tre componenti:
C = T1 R + T2 G + T3 B dove
R = red, G = green, B = blue, e Ti = intensita' di colore.
A seconda del sistema, le intensita' Ti possono essere espresse
Possiamo vedere un colore come un punto nel cubo dei colori:
![]() |
nero = (0,0,0) bianco = (1,1,1) rosso = (1,0,0) verde = (0,1,0) blu = (0,0,1) giallo = (1,1,0) ciano = (0,1,1) magenta = (1,0,1) |
Tutti i colori sulla diagonale = toni di grigio.
Estensione del modello RGB con componente A detta alpha channel. Il valore di A corrisponde a livello di opacita' o trasparenza, convenzionalmente:
In 2D permette di disegnare immagini con sfondo trasparente.
In 3D permette di disegnare oggetti semitrasparenti (es: vetro).
Permettono di spostare, cambiare dimensioni, deformare le primitive prima di disegnarle.
Il sistema di coordinate finale in cui la scena sara' visualizzata come immagine e' quello della finestra. Tali coordinate della finestra sono espresse in pixel: numeri interi compresi tra 0 e le dimensioni x,y della finestra.
E' comodo "pensare" la scena in un sistema di riferimento
"astratto", indipendente dalla dimensione in pixel della
finestra nella quale sara' visualizzata.
Per esempio posso "pensare" le mie primitive in un sistema
con coordinate reali x,y, tra -100 e 100.
Poi uso trasformazioni per tradurre queste coordinate astratte
in coordinate della finestra, qualunque sia la dimensione della finestra.
Le trasformazioni servono anche
per comporre una scena formata da piu' oggetti.
Nel caso di scene complesse, puo' essere utile "pensare"
alcune sotto-componenti della scena come definite in un loro
proprio sistema di coordinate indipendente,
e poi trasportarle nella scena globale mediante trasformazioni.
Addirittura la stessa sotto-componente puo' apparire
nella scena finale piu' volte, ogni volta posizionata
mediante trasformazioni diverse.
Per esempio se devo disegnare varie case e vari alberi,
mi conviene definire la casa e l'albero in un loro proprio
sistema di coordinate (per es. con l'origine nel punto
in basso al centro della casa o dell'albero).
E poi inserire nella scena varie copie, ciascuna traslata
nel punto opportuno.
La scena finale cosi' ottenuta poi sara' sottoposta
globalmente ad altre trasformazioni che la trasportino nel
sistema di riferimento in pixel della finestra.
In 3D le trasformazioni sono usate anche per posizionare l'osservatore e impostare le proprieta' della telecamera (apertura e profondita' del campo visivo...).
Traslazioni, rotazioni, scalature.
Sono trasformazioni rigide: mantengono rette le linee rette e parallele le linee parallele.
Noi le vediamo brevemente solo in 2D. Sono trattate molto piu' diffusamente, in 3D, e con tutta la teoria, nel corso di Grafica Interattiva.
I nostri oggetti (primitive geometriche) sono descritti in termini di vertici, basta applicare la trasformazione ai vertici.
Traslare un punto = spostarlo di una certa distanza in una certa
direzione.
Traslare un oggetto = traslare solidalmente tutti i suoi punti.
Parametro = vettore di traslazione (tx,ty).
Se P = (x,y) e' un punto, il punto traslato e'
P' = (x+tx,y+ty) = (x,y) + (tx,ty).
Nota: la traslazione inversa corrisponde al vettore di traslazione cambiato di segno (-tx,-ty).
Scelto un punto C che rimane fermo,
scalare un punto = riposizionarlo ricalcolando le sue distanze
(nella direzione di ciascun asse coordinato) da C in base
ad una nuova unita' di misura.
Scalare un oggetto = scalare (riposizionare rispetto al punto fermo C)
tutti i suoi punti.
Vediamo scalatura con punto fermo l'origine.
Parametri = fattori di scala (sx,sy).
Se P = (x,y) e' un punto, il punto scalato e' P' = (sx*x,sy*y).
La scalatura tenendo fermo un punto generico C diverso dall'origine si ottiene come combinazione di trasformazioni (ved. dopo).
Nota: se i fattori di scala sono negativi, ottengo una riflessione speculare.
Scelto un punto R ed un verso di rotazione (orario o antiorario), ruotare un punto = muoverlo attorno ad R di un certo angolo nel verso assegnato.
Ruotare un oggetto = muovere ciascun punto dell'oggetto solidalmente dello stesso angolo attorno al punto R.
Vediamo la rotazione attorno all'origine.
Parametri di questo specifico caso:
angolo di rotazione alfa (alfa > 0 per senso
antiorario, alfa < 0 per senso orario).
Se P = (x,y) e' un punto, il punto ruotato e' P' = (x',y'),
dove:
La rotazione attorno ad un punto diverso dall'origine si ottiene come combinazione di trasformazioni (ved. dopo).
Tutte le trasformazioni rigide si ottengono per composizione a partire da un insieme minimale di trasformazioni di base:
Traslazione dato il vettore di traslazione (tx,ty)
Scalatura con punto fermo l'origine dati i fattori di scala (sx,sy)
Rotazione attorno all'origine dato l'angolo di rotazione alfa
Composizione = eseguire le trasformazioni in sequenza.
Esempio: Scalatura tenendo fermo un punto generico.
Sia C=(x0,y0) il punto che deve restare fermo.
Esempio:
Rotazione attorno ad un asse passante per un punto generico.
Si fa in modo analogo alla scalatura.
La composizione di trasformazioni in generale non e' commutativa. Esempio:
La composizione di trasformazioni dello stesso tipo e' commutativa (traslazioni con traslazioni, scalature con fermo lo stesso punto, rotazioni attorno allo stesso punto).
Le coordinate astratte della scena hanno sia x che y
nell'intervallo -100,100. I valori delle y come di consueto
crescono dal basso verso l'alto.
La finestra grafica e' larga w pixel e alta h.
Le coordinate di finestra sono tra 0 e w-1 in orizzontale e
tra 0 e h-1 in verticale. Nelle finestre l'origine e'
in alto a sinistra, quindi
i valori delle y crescono dall'alto verso il basso.
Dato un punto P di coordinate astratte (x,y), trovare le sue coordinate di finestra (x',y').