Informatica Grafica ][ Primitive 3D Fino ad ora abbiamo utilizzato solamente triangoli singoli. In questa lezione vedremo come disegnare primitive composte da piu' triangoli. Prima pero' dovremo attivare lo Z-Buffer. Marco Gribaudo marcog@di.unito.it Cominciamo ad aumentare il numero di vertici da memorizzare. With Triangle(0).X = -1:.Y = -1:.z = 0.color = &HFFFF0000 Definiamo quindi 3 nuovi triangoli, spostando di 0.5 unita' la coordinata Z di ogni nuova figura, e variandone il colore. With Triangle(3).X = -1:.Y = -1:.z = 0.5.color = &HFF00FF00 With Triangle(6).X = -1:.Y = -1:.z = -0.5.color = &HFF0000FF With Triangle(9).X = -1:.Y = -1:.z = 1.color = &HFFFF00FF With Triangle(1).X = 1:.Y = -1:.z = 0.color = &HFFFF0000 With Triangle(4).X = 1:.Y = -1:.z = 0.5.color = &HFF00FF00 With Triangle(7).X = 1:.Y = -1:.z = -0.5.color = &HFF0000FF With Triangle(10).X = 1:.Y = -1:.z = 1.color = &HFFFF00FF With Triangle(2).X = -1:.Y = 1:.z = 0.color = &HFFFF0000 With Triangle(5).X = -1:.Y = 1:.z = 0.5.color = &HFF00FF00 With Triangle(8).X = -1:.Y = 1:.z = -0.5.color = &HFF0000FF With Triangle(11).X = -1:.Y = 1:.z = 1.color = &HFFFF00FF Modifichiamo infine la procedura di visualizzazione in modo che disegni 4 triangoli invece che 1. L'applicazione mostra ora 4 triangoli, ma l'ordine di visualizzazione e' scorretto: esso rispetta infatti l'ordinamento di scrittura su video, e non quello spaziale
Affinche l'ordine di visualizzazione dei poligoni sullo schermo sia corretto, occorre attivare lo Z-Buffer Per abilitare lo Z-Buffer, bisogna innanzi tutto richiedere alla scheda video di riservarne lo spazio necessario. memorizza, oltre al colore dei Pixel, anche la distanza dei punti dall'osservatore. Sfruttando questa informazione, la libreria grafica puo' decidere se visualizzare o no un nuovo tirangolo, in base alla sua minore o maggiore distanza dal punto di osservazione. Quindi biosogna impostare la libreria in modo che lo sfrutti. Ed infine occorre modificare - all'interno del ciclo di rendering - il comando di cancellazione dello schermo in modo che ripulisca anche lo Z-Buffer I 4 triangoli verranno quindi visualizzati nel modo corretto, indipendentemente dal loro ordine di scrittura a video. Gli oggetti in grafica tridimensionale, come visto in precedenza, vengono suddivisi in triangoli prima di essere visualizzati. Il compito piu' difficile nella visualizzazione di un triangoli in 3D e' determinare le proiezioni dei sui vertici. Le librerie grafiche mettono a disposizione delle "scorciatoie" per ridurre il lavoro necessario a visualizzare triangoli adiacenti.
Due triangoli sono caratterizzati da 6 vertici. 2 4 5 Ma se questi sono adiacenti (condividono un lato), 4 vertici possono essere sufficienti a definirli entrambi. 2 4 1 3 6 1 3 Le librerie DirectX codificano i triangoli che compongono le primitive grafiche, memorizzandone i vertici in un array. Quindi, attraverso una strategia di collegamento, uniscono i vertici presenti nell'array, in modo da definire un numero elevato di triangoli. Ogni primitiva, prevede la specifica della strategia di collegamento e del numero di triangoli che si vogliono rappresentare. Strategia di collegamento Numero di Triangoli DirectX prevede 3 differenti strategie di collegamento: Liste di triangoli Ventagli di triangoli
Liste di Triangoli Le liste di triangoli codificano un insieme di triangoli disgiunti. Liste di Triangoli 3 vertici consecutivi dentro l'array definiscono un triangolo. N triangoli, sono codificati con 3N vertici. Vengono utilizzate per codificare figure complesse dove non vi siano condivisioni di spigoli. v1 v2 v3 v4 v6 v5 Liste di Triangoli Le Liste di Triangoli sono la strategia di collegamento piu' potente, in quanto meno restrittiva. Sono pero' anche quelle piu' dispendiose in quanto necessitano la definizione esplicita di tutti vertici. Le liste strisce di triangoli, codificano un insieme di triangoli che condividono due spigoli (tranne il primo col secondo, e l'ultimo con il penultimo che ne condividono uno solo). N triangoli, sono codificati con N + 2 vertici. Vengono utilizzate per codificare figure a forma di "Striscia", dove i triangoli si ripetono in sequenza. I primi 3 vertici definiscono un triangolo. Il quarto definisce il triangolo costituito dai vertici 2, 3 e 4; il quinto definisce il triangolo costituito dai vertici 3,4 e 5; e cosi' via. Le Striscie di Triangoli sono una strategia piuttosto potente, che riesce a definire oggettti complessi con pochi punti.
Ventagli di Triangoli I ventagli di triangoli, definiscono un insieme di triangoli adiacenti che condividono un vertice. N triangoli, sono codificati con N + 2 vertici. Vengono appunto utilizzati per definire oggetti a forma di ventaglio. Ventagli di Triangoli Il primo vertice definisce il centro del ventaglio. I vertici seguenti identificano la parte piu' esterna del ventaglio. Ventagli di Triangoli I ventagli di triangoli vengono principalmente utilizzati per definire poligoni regolari, o per approssimare circonferenze. Il comando delle DirectX che visualizza una primitiva e' DrawPrimitiveUP. I suoi parametri sono la strategia di collegamento, l'array contenente i vertici, il numero di triangoli da disegnare, e per ultimo la dimensione degli elementi dell'array. Quest'ultimo argomento e' necessario poiche', come visto in precedenza, i vertici possono essere specificati con formati di lunghezza differente. Strategia di collegamento: D3DPT_TRIANGLELIST D3DPT_TRIANGLESTRIP D3DPT_TRIANGLEFAN Lista di triangoli Striscia di triangoli Ventaglio di triangoli Il comando DrawPrimitiveUP e' anche in grado di disegnare oggetti non tridimensionali, attraverso altre tre strategie di collegamento: Liste di punti Liste di segmenti Strisce di segmenti Array dei vertici Dimensione dei vertici Numero di triangoli
Le liste di punti (D3DPT_POINTLIST), codificano un insieme di punti sullo schermo. Ogni vertice rappresenta un punto differente. Le liste di segmenti (D3DPT_LINELIST), codificano un insieme di segmenti disgiunti. Ogni coppia di vertici consecutivi rappresenta un nuovo segmento. Le strisce di segmenti (D3DPT_LINESTRIP), codificano un insieme di segmenti consecutivi. Ogni vertice viene collegato al precedente attraverso un nuovo segmento. Il loro funzionamento e' analogo alle primitive tridimensionali. In questo caso pero' il numero di primitive indica il numero di punti (per le liste di punti), oppure il numero di segmenti (per le liste o le strisce di segmenti)