Silverlight 3D engine
Cristian Merighi ()

Primo abbozzo di un engine 3D per il real-time software rendering in Silverlight 2. Nell'attesa magari che vengano implementate, a breve, funzionalità come quelle dell'"Astro" nascente Flash 10.
Questo articolo è da considerarsi obsoleto. Alcune funzionalità potrebbero non essere più disponibili e non è possibile aggiungere commenti.
Il 3D sta diventando di massima importanza nella comunicazione visuale che il web impone oggigiorno.
Penso sia assolutamente il futuro dell'interfaccia da qui a breve.
Per condividere i nostri ambienti, oggetti e personaggi tridimensionali attraverso internet abbiamo un disperato bisogno
di plug-ins che si occupino del gravoso processo di rendering magari, ripeto ed enfatizzo "magari!", appoggiandosi
sull'hardware dei nostri ninja PC's. Suvvia! Siamo o no nel 2008?!...
Recentemente Adobe® è uscita allo scoperto in tal senso proponendo la nuova versione del Flash Player (la 10 in beta)
e la tecnologia
Astro in esso contenuta, con tanto di rendering 3D GPU-based!
Gran roba, allettante davvero.
Purtroppo Silverlight non sembra mostrare la stessa volontà di perseguire tale strada (almeno per ora non si sente nulla, vediamo che succede nel
prossimo futuro), d'altra parte le enormi possibilità di estensibilità permesse dal DLR e da Visual Studio come IDE possono far venire in testa
a qualcuno di cimentarsi con il puro software rendering per produrre qualche effettuccio tridimensionale... "qualcuno" annovera anche me adesso!
E' la prima volta che provo a creare un engine 3D per il rendering real-time e devo ammetterlo: è davvero divertente.
Ci sono talmente tanti aspetti di cui tenere conto e tanta matematica da tirare in ballo che un progetto di tal fatta non può non
risultare intrigante e coinvolgente!
Nel diagramma sopra c'è un estratto di ciò che sono riuscito a mettere insieme, mancano
le struct relative a vettori, matrici, quaternioni e così via ma quelle sono piuttosto simili a quelle che trovate nell'assembly
PresentationCore del .Net 3 e riguardano aspetti di matematica/geometria ormai comuni e noti ai più.
Come primo esempio applicativo di questo mio embrionale engine
è possibile visionare il seguente link (figura sotto).
Relazioni gerarchiche tra elementi, trasformazioni affini, movimenti di camera, luce direzionale sono aspetti
gestiti e trattati in tale micro-applicativo.
Penso sia utile rendervi informati sul fatto che il sistema di coordinate che ho adottato è levogiro: con
l'asse x che corre da sinistra a destra lungo lo schermo, l'asse y dal basso in alto mentre l'asse z esce perpendicolarmente dal piano
individuato dal monitor.
Instruzioni per l'uso:
- utilizzare le frecce destra e sinistra per ruotare il gruppo di poliedri attorno all'asse y.
- utilizzare le frecce su e giù per muovere la camera lungo una circonferenza il cui piano è sovrapposto a quello yz.
Dati di riscontro sulla "situazione" complessiva della camera sono evidenziati in alto a sinistra nell'interfaccia.
- è possibile testare aspetti interattivi di roll-over sul dodecaedro per vederne mutare il materiale.
Ok, "dov'è il codice?" direte voi... mi piacerebbe davvero postarne, ma:
- Non riesco a risolvere un problema di memory leaking che mi fa uscire pazzo...
- Potete sempre hack-are lo xap file! ;)
Memory leak issue:
il problema è riscontrabile dal fatto che la memoria utilizzata dall'istanza del browser nella quale corre
l'applicazione si gonfia di diversi kB ogni qual volta che una trasformazione occorre. Poiché, per quanto ne so,
non esistono performance tool per Silverlight, ho tradotto tutta la mia libreria per il porting su WPF e, meraviglia, tutto
sembra funzionare correttamente, anche utilizzando WPFPerf non riesco ad individuare i "pozzi" che vado cercando!
Spero si tratti di un problema di questa prima beta e che venga risolto nelle successive release.
Come prova per ciò che dico, vi propongo la medesima versione (compilata in debug mode) dell'applicativo Silverlight
in WPF (distribuita via ClickOnce).
Notate come il mio engine, se eseguito in debug mode, mostri alcuni utili elementi quali
- gli spigoli delle varie facce (segmenti neri),
- il view frustum (rettangolo rosso),
- le normali alle singole facce (vedi linee rosse sulle facce del dodecaedro),
- le congiungenti il punto di vista della camera ed i baricentri delle facce del solido
(linee verdi sempre relative al dodecaedro)
- informazioni numeriche con le coordinate dei baricentri nel sistema di riderimento assoluto e la distanza dall'"occhio" della camera.
Step successivi nello sviluppo di questo Pacem.Silverlight3D engine:
- gestione della mappatura delle textures (bitmaps),
- migliorare gli aspetti di performance.
A presto...
Take care. Bye.