La computer grafica tridimensionale ha avuto e sta ancora avendo una larghissima diffusione, anche grazie alle schede video in grado di accelerare le applicazioni che la usano: videogiochi, titoli multimediali ad alta risoluzione, programmi di progettazione assistita ( CAD ) e software per l’elaborazione grafica di dati scientifici e medici. Alla base di tutte queste applicazioni risiede un motore grafico 3D che è un software in grado di visualizzare una scena tridimensionale in tempo reale. Il motore deve visualizzare la scena tridimensionale in tempo reale nella maniera più fluida possibile, altrimenti si parla di software di rendering. In questa serie di articoli costruiremo un motore tridimensionale passo dopo passo, in questa prima puntata vedremo gli aspetti teorici che deve avere il nostro framework. Sono richieste le tipiche conoscenze di programmazione in VC/C++ ed un po’ di geometria analitica.
Il motore 3D deve visualizzare nel minor tempo possibile una scena tridimensionale. Ogni scena è composta da oggetti e ciascuno di questi è composto da poligoni, in genere si utilizzano triangoli perché sono più veloci da disegnare. Un poligono è caratterizzato dai vertici, ossia i punti nello spazio tridimensionale, il classico esempio x, y, z con la mano destra che ci hanno insegnato a scuola. Un motore tridimensionale deve ricevere i dati della scena e disegnarla effettuando il cosiddetto rendering. La scena è frutto dell’elaborazione di vari oggetti, si parla infatti di pipeline grafica, come di una serie di passaggi per costruire il prodotto finale. Il primo passaggio serve per determinare la parte visibile della superficie, poi abbiamo le trasformazioni geometriche, l’illuminazione della scena, il posizionamento della telecamera ed infine il disegno dei poligoni.
Determinazione della parte visibile della scena
Una tipica scena tridimensionale è formata da decine di oggetti, nel caso più semplice, ognuno di questi oggetti è formato a sua volta da migliaia di poligoni. Dover costruire una scena formata da milioni di poligoni e soprattutto in tempo reale metterebbe a dura prova qualsiasi CPU e GPU, per questo si invia alla pipeline soltanto la porzione della scena visibile, potentially visible set ( PVS ). L’operazione che porta ad individuare il PVS si chiama visible surface determination ( VSD ), alcune di queste tecniche sono: frustum culling, binary space partitioning tree, octree e portal rendering.
Le trasformazioni geometriche
Dopo aver selezionato le parti da rendere visibili occorre disegnarle, queste sono costruite utilizzando un sistema di riferimento locale, solo successivamente subiranno traslazioni, rotazioni e trasformazioni di scala per poterle inserire all’interno della scena, chiamata anche mondo virtuale.
Illuminazione della scena
Per rendere il più realistico possibile il mondo virtuale occorre simulare un’illuminazione, ci sono varie tecniche per illuminare gli oggetti con diversi tipi di luce, argomenti già presi in esame in questo blog nella categoria grafica. In generale si prendono le normali di ciascun vertice dei poligoni, si calcola l’intensità luminosa di ciascun vertice e si ottiene il colore del poligono in base alla mescolanza dei colori dei suoi vertici.
Posizionamento della telecamera
La visuale al nostro mondo virtuale è ottenuta attraverso 2 vettori, view ed up. Il primo ha l’origine nel punto in cui si trova la telecamera e si dirige verso lo sguardo dell’osservatore, il secondo si origina sempre dal punto della telecamera, ma punta verso il punto più alto nel piano verticale. Normalmente il vettore up ha la direzione dell’asse y, ma è possibile ruotarlo per fare in modo da simulare la rotazione della testa.
Disegno dei poligoni
Il nostro mondo virtuale è tridimensionale, ma il monitor è bidimensionale. Occorre quindi effettuare una proiezione prospettica dei vertici degli oggetti della scena.
In questo articolo ho affrontato la parte teorica di quello che andremo a creare in termini di codice sorgente. Vi invito pertanto a studiare questi aspetti, solamente introdotti da me, facendo delle ricerche su internet ( Googlando o Bingando ), non mi venite a commentare che non ho spiegato bene qualcosa. A seconda degli appassionati che vedrò leggere questo articolo deciderò di continuare il corso a mio insindacabile giudizio.