Questo articolo descrive come OpenGL realizza le
primitive geometriche. Tutte le primitive geometriche sono descritte
in base ai loro vertici, coordinate che descrivono i punti stessi, e
i termini dei segmenti agli angoli dei poligoni. La sezione
successiva descrive come queste primitive sono visualizzate e quale
controllo si ha su questa operazione.
Cosa sono punti, linee e poligoni?
E' molto probabile che si abbia una buona idea in
termini matematici della definizione di punto, linea e poligono. In
OpenGL il significato è simile. La sola differenza è data dai
limiti del calcolo basato sul computer. In ogni istruzione OpenGL, i
calcoli a virgola mobile hanno dei limiti di precisione, e possono
avere errori di routine; di conseguenza le coordinate di punti, linee
e poligoni in OpenGL soffrono degli stessi problemi. Un altra
differenza importante sorge dalle limitazioni del sistema di
visualizzazione grafica. In uno schermo, l'unità visualizzabile
minima è il pixel, che può valere meno di un centesimo di pollice ,
ma è molto lontano dal concetto matematico di infinitamente piccolo
(per il punto) o infinitamente sottile (per la linea). Quando OpenGL
effettua dei calcoli si assume che i punti siano vettori di numeri a
virgola mobile. Comunque un punto è tipicamente ma non sempre
disegnato come un singolo pixel. E molti punti con coordinate
leggermente diverse possono essere disegnate sullo stesso pixel.
Punti
Un punto è rappresentato da un insieme di numeri in virgola mobile che rappresentano un vertice. Tutti i calcoli interni sono fatto come se i vertici fossero tridimensionali. Vertici specificati dall'utente come bidimensionali (cioè con solo coordinate x ed y) vengono assegnati a coordinata z pari a zero da OpenGL.
Avanzato
OpenGL lavora nelle coordinate omogenee della geometria proiettiva tridimensionale, quindi per calcoli interni, tutti i vertici sono rappresentati con quattro coordinate virgola mobile (x, y, z, w). Se w è diverso da zero, queste coordinate corrispondono al punto tridimensionale euclideo (x / w, y / w, z / w). È possibile specificare la coordinata w nei comandi OpenGL, ma di fatto avviene raramente. Se la coordinata w non è specificato, ottiene il valore 1,0.
Linee
In OpenGL, la linea terminata, si riferisce ad un segmento di linea, non la sua versione matematica che si estende all'infinito in entrambe le direzioni. Ci sono semplici modi per specificare una serie di segmenti di linea collegati, o anche un poligono, formato da serie di segmenti legati. In tutti i casi, però, le linee che costituiscono la serie connesse, sono specificate in termini di vertici come loro punti terminali.
Punti
Un punto è rappresentato da un insieme di numeri in virgola mobile che rappresentano un vertice. Tutti i calcoli interni sono fatto come se i vertici fossero tridimensionali. Vertici specificati dall'utente come bidimensionali (cioè con solo coordinate x ed y) vengono assegnati a coordinata z pari a zero da OpenGL.
Avanzato
OpenGL lavora nelle coordinate omogenee della geometria proiettiva tridimensionale, quindi per calcoli interni, tutti i vertici sono rappresentati con quattro coordinate virgola mobile (x, y, z, w). Se w è diverso da zero, queste coordinate corrispondono al punto tridimensionale euclideo (x / w, y / w, z / w). È possibile specificare la coordinata w nei comandi OpenGL, ma di fatto avviene raramente. Se la coordinata w non è specificato, ottiene il valore 1,0.
Linee
In OpenGL, la linea terminata, si riferisce ad un segmento di linea, non la sua versione matematica che si estende all'infinito in entrambe le direzioni. Ci sono semplici modi per specificare una serie di segmenti di linea collegati, o anche un poligono, formato da serie di segmenti legati. In tutti i casi, però, le linee che costituiscono la serie connesse, sono specificate in termini di vertici come loro punti terminali.
Poligoni
I poligoni sono aree
chiuse formate da anelli di segmenti, ove i segmenti sono specificati
mediante i loro vertici come punti terminali. I poligoni sono
riempiti con pixel di colore, ma possono anche essere disegnati come
linee di contorno o insiemi di punti. I poligoni sono oggetti
complessi, pertanto OpenGL pone dei limiti a ciò che può costituire
un poligono. Per prima cosa i bordi dei poligoni non possono
intersecarsi tra loro ( in matematica si parla di poligono semplice).
Per seconda cosa, i poligoni devono essere convessi, e non possono
avere tacche al loro interno. OpenGL non restringe il numero di
segmenti che possono costituire un poligono convesso; ma un poligono
con un foro non può essere descritto. Essi sono non convessi
pertanto, non viene disegnato come lo si immagina. In alcuni sistemi
i poligoni poco meno che convessi possono essere riempiti.
La ragione per cui
OpenGL restringe i tipi di poligoni validi, è che più semplice
fornire calcoli di rendering veloce solo per poche classi di
poligoni. Per massimizzare le performance, OpenGL assume che tutti i
poligoni siano semplici. Tuttavia molte superfici reali consistono di
poligoni non semplici, e non convessi, o poligoni con fori. Sicché
tutti i poligoni complessi possono essere generati da poligoni
semplici, per costruire oggetti complessi, esistono funzioni nella
libreria GLU.
Rettangoli
Dato che i rettangoli
sono molti utilizzati nelle applicazioni grafiche, OpenGL fornisce
una funzione per disegnare rettangoli pieni, questa istruzione viene
chiamata glRect*(). La sintassi può essere:
void glRect{sifd}(
valore x1, valore y1, valore x2, valore y2);
void glRect{sifd}(
vettore *v1, vettore *v2);
Disegna un rettangolo
definito dai punti degli angoli (x1, y1) e (x2,y2). Il rettangolo
giace sul piano z=0, e i lati sono paralleli agli assi x e y. Se
viene usata la forma vettoriale, i vertici sono definiti dai
puntatori ai due vettori, i quali contengono le coppie di x, y.
Curve
e superfici curve
Ogni
linea curva può
essere approssimata come una serie di rette collegate tra loro.
Quindi suddividendo le linee curve e le superfici si approssimano
usando una serie di segmenti piatti o poligoni, alcuni di dimensioni
inferiori al pixel visualizzato sullo schermo. Anche se non esistono
funzioni primitive per le curve, OpenGL consente un supporto diretto
alla suddivisione e le disegna.
Nessun commento:
Posta un commento