domenica 28 aprile 2013

Descrivere Punti, linee e poligoni

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.


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