Architettura e implementazione dell’editor
4.1.3 Visualizzazione delle anteprime (la tecnologia XVR)
L’editor che andiamo a sviluppare necessita ovviamente di un sistema di visualizzazione delle anteprime del modello a due dimensioni e mezzo che si sta costruendo. Ogni piccola modifica deve, infatti, essere visualizzata, per apportare ulteriori correzioni o per verificare che essa sia corretta. Per fare questo è logico pensare che all’intero dell’editor sia presente un componente che possa essere visualizzato in tre dimensioni.
70 Microsoft fornisce un insieme di strumenti per la realizzazione di applicazioni a due o tre dimensioni, utilizzando il linguaggio C# nell’ambiente di sviluppo Visual Studio. Questo insieme di strumenti è chiamato Microsoft XNA (che non è acronimo di niente, avendo il nome scherzoso XNA is Not an Acronym), è stato basato su DirectX e nasce soprattutto per lo sviluppo di videogiochi per le piattaforme Microsoft: Xbox 360, PC e Windows Phone 7.
Un’alternativa a XNA, è l’utilizzo di un wrapper di un componente OpenGL. Un wrapper è sostanzialmente un oggetto che contiene altri oggetti, ossia un oggetto istanziato che permette l’utilizzo all’applicazione, nel nostro caso l’editor, delle funzioni presenti in librerie esterne.
CsGL11 (C sharp Graphics Library) è una libreria open source che implementa un wrapper per la libreria OpenGL, che la rende utilizzabile ad ogni linguaggio del framework .Net. La libreria utilizza OpenGL 1.4 e ha un gestore degli input generati da mouse e tastiera. Un’evoluzione della libreria è Tao Framework12, un’interfaccia .Net che implementa ulteriori funzionalità rispetto a CsGL. Entrambe queste librerie comunque sono rimaste non aggiornate rispetto all’evoluzione di OpenGL e il loro sviluppo si è nel tempo interrotto.
Nell’ambito dello sviluppo di applicazioni tridimensionali esistono ulteriori strumenti di sviluppo. XVR13 (eXtreme Virtual Reality) è un ambiente di sviluppo integrato per la veloce implementazione di
11 http://cgsl.sourceforge.net
12 http://sourceforge.net/projects/taoframework 13 http://www.vrmedia.it
71 applicazioni per ambienti virtuali sviluppato da VRMedia, azienda spin- off dell’Università Sant’Anna di Pisa. Usando un’architettura modulare e un linguaggio di scripting proprio, attualmente, XVR è una componente ActiveX che può essere incorporata in molte applicazioni, come ad esempio il browser web Internet Explorer. ActiveX è infatti una tecnologia che permette l’estensione di potenzialità di applicazioni, come comandi, funzionalità e caratteristiche. Il linguaggio di programmazione di XVR è simile al C++ e possiede vari costrutti e comandi appositamente creati per applicazioni di realtà virtuale, come animazioni tridimensionali, effetti sonori posizionali e interazioni dell’utente. XVR è diviso concettualmente in due moduli principali: il controllo ActiveX, che ospita il componente di base di XVR (come il controllo della versione in uso e il plug-in di interfaccia), e la Virtual Machine, che contiene il motore grafico tridimensionale, il motore multimediale e tutti i moduli software gestiti da XVR. In generale, un programma XVR può essere rappresentato come un loop che integra al suo interno altri cicli dedicati a grafica, fisica,
networking, traking e, eventualmente, all’interazione con le interfacce aptiche. Ogni loop interno viene eseguito con la frequenza che caratterizza il ciclo.
L’applicazione XVR è un programma basato su sette
72 principali callback che vengono eseguite automaticamente, così definite:
• OnDownload(), che viene eseguita all’inizio dell’esecuzione e
gestisce l’eventuale download di risorse necessarie all’esecuzione dell’applicazione XVR.
• OnInit(), che viene eseguita immediatamente dopo la OnDownload() al fine di inizializzare il codice per l’applicazione.
Le altre funzioni non sono attive finché la OnInit() non ha
terminato la propria esecuzione.
• OnFrame(), che ha il compito di gestire l’output grafico, è l’unica
funzione in cui è visibile il contesto grafico. Il framerate della funzione è impostabile.
• OnTimer(), che viene eseguita in modo indipendente rispetto
all’OnFrame(), ed è utile per gestire comandi indipendenti dalle
operazioni di rendering. Anche in questo caso è possibile impostare il time step.
• OnEvent(), che viene eseguita quando l’applicazione riceve un
messaggio, sia esso esterno (generato da altre applicazioni o dal sistema operativo) o interno (generato dallo stesso programma XVR). Ovviamente anche questa funzione è indipendente dalle due precedenti, ed è utile per aggiungere maggiore flessibilità all’ambiente nei casi in cui eventuali timer prefissati non sono l’opzione migliore.
• OnExit(), che è lanciata quanto l’applicazione viene chiusa.
• DownloadReady(), che ha il compito di gestire l’evento di
73 Questa funzione può essere usata per il download asincrono di più risorse, non necessarie finché non viene eseguito il programma XVR.
Oltre a queste funzioni, XVR offre un insieme di classi, funzioni e strutture predefinite e fornisce la possibilità al programmatore di definirne di nuove. Chiaramente le classi e le funzioni principali sono legate alla gestione dell’ambiente tridimensionale, attraverso la gestione della camera e della scena (classe CVmCamera), della fonte di luce e della
luminosità (CVmLight), dei modelli tridimensionali (CVmMesh, CVmNewMesh per la gestione delle proprietà geometriche e CVmObject
per la gestione del sistema di riferimento e delle trasformazioni geometriche), di avatar (CVmAvatar e CVmCharacter), dell’aspetto
(CVmMaterial e CVmTexture) e altre ancora.
Il motore grafico tridimensionale integrato in XVR è costruito su OpenGL, utile per gestire l’output sia su dispositivi video standard come i monitor, sia su dispositivi avanzati come gli Stereo Projection System. Usando la libreria OpenGL, il programmatore è in grado di usarne le capacità per gestire le tecniche in uso come back-face culling, normal mapping, displacement mapping e altre ancora, migliorando quindi le prestazioni in tempo reale, nonostante si possano usare anche modelli particolarmente complessi. XVR è inoltre dotato di una serie di funzioni wrapper per la programmazione OpenGL a basso livello, che possono essere usate contemporaneamente alle funzioni XVR a più alto livello, e sono utili per l’utilizzo di effetti speciali non implementati direttamente in XVR, come, ad esempio, l’effetto nebbia. XVR, inoltre, supporta il
74 linguaggio GLSL per programmare gli shader di OpenGL nella versione 2.1. Ogni shader può essere collegato a una o più mesh o oggetti, per fornire gli effetti desiderati. XVR non supporta GLSL versione 3, che introduce i geometry shader, strumenti che possono migliorare le prestazioni e fornire la possibilità di modificare direttamente le geometrie presenti nella forma rappresentata.
Altre classi importanti usate comunemente sono quella per la gestione degli input da mouse (CVmMouse), per lo scambio di informazioni in rete
sia con il servizio TCP che UDP, e altre funzionalità ancora.
XVR, in sostanza, offre un controllo ActiveX per la visualizzazione di un programma che sfrutta la libreria OpenGL e ha, a sua volta, varie funzioni che permettono una semplice e rapida implementazione di un visualizzatore. I controlli ActiveX possono, inoltre, essere importati nei linguaggi di programmazione del framework .Net; nel caso in questione, è possibile fare questo utilizzando l’XVRControl, il wrapper dell’ActiveX di XVR, dotato di vari metodi per la comunicazione tra l’applicativo contenente e il programma XVR contenuto.
Il fulcro principale del controllo XVR è la gestione degli eventi di comunicazione. Il controllo infatti scatena l’evento DataOut(), in modo
che l’applicazione in C# possa gestire le informazioni legate all’evento stesso. Il programma contenitore invece può inviare informazioni tramite il metodo DataIn(), che genera eventi che vengono gestiti nella
funzione OnEvent() di XVR. Il nome In-Out è, quindi, dal punto di
vista del programma XVR contenuto nel wrapper. Il controllo XVR inoltre, gestisce automaticamente i comandi del mouse come se fosse un
75 programma indipendente, per esempio la gestione dello spostamento della camera, semplificando notevolmente il compito del programmatore.
XVR, avendo un proprio linguaggio, possiede propri editor14, che forniscono agli utenti comodi ambienti di sviluppo per la creazione di progetti, il compilatore, l’highlighting delle parole chiave e molto altro ancora. Gli editor, in continua evoluzione, forniscono anche gli strumenti per creare codice per i programmi GLSL.