3.1 Implementazioni e strumenti nel Museo Virtuale in VR
3.1.10 Funzionalità per la fruizione dei beni culturali
La visualizzazione dell’ambiente virtuale con le opere d’arte non basta per poter permettere all’utente di fruire dei beni culturali attraverso la tecnologia; l’utente deve anche poter interagire con le opere che ha davanti e deve poter servirsi delle informazioni che esse contengono. Per questo motivo sono state aggiunte diverse funzionalità in modo da permettere all’utente di interagire con l’ambiente virtuale che lo circonda, personalizzando così l’esperienza immersiva e rendere più interessante la visita all’interno del museo virtuale.
3.1.10.1 Selezione dell’opera e visualizzazione dei metadati
Una funzionalità fondamentale riguarda quella della selezione dell’opera e la visualizzazione dei metadati correlati. Per poter consentire ciò all’utente sono stati seguiti i seguenti passi:
Per prima cosa sono stati aggiunti dei nuovi oggetti invisibili che potessero essere riconosciuti da un dispositivo esterno (ad esempio un mouse);
Nel disegnare gli oggetti invisibili, creo alcune condizioni per poterli rendere selezionabili; //creo tanti oggetti quante sono le opere d’arte presenti nel museo
for(var i = 0;i<len(aobj);i++){ ...
//creo un oggetto plane
planeSel = CVmNewMesh(VRP_PLANE); ...
//creo i dati della texture invisibile var vecCol = vector(4);
textSel = CVmTexture(1,1,VR_RGBA_TEXTURE,vecCol); ...
//creo gli oggetti con le proprietà delle opere d’arte objSel = CVmObj(planeSel);
objSel.SetId(i); ...
99
Creo la funzione select() per poter visualizzare i metadati dell’oggetto selezionato che viene usato come parametro in entrata
for(var i = 0; i<len(asel); i++){
//disegno gli oggetti invisibili che si sovrappongono alle //opere d’arte
asel[i].Draw();
//se l’utente passa col mouse sull’opera e se la repository selezionata è Europeana o Wikimedia Commons poiché Google Images non fornisce metadati
if(selection(asel[i], SEL_PASS) && (val(splitParams[2]) ==2
|| val(splitParams[2]) == 3)){
//calcolo la distanza fra l’utente e l’opera d’arte utilizzando la formula della distanza di Euclide var getPos = asel[i].getposition();
var getCamPos = cameragetcurrent().getposition()
var x = (getPos[0]-getcampos[0]);
var y = (getPos[1]-getcampos[1]);
var z = (getPos[2]-getcampos[2]);
var distance = sqrt((x*x)+(y*y)+(z*z));
//l’utente è abbastanza vicino all’opera d’arte if(distance<80.0){
//istruzioni stampate su video
ConsoleText(0.01, 0.035, "Press D and pass to the quad to get description\nPress N to hide description.");
ConsoleText(0.75, 0.02, "Distance: "+str(distance));
//funzione per la visualizzazione dei metadati select(asel[i]);
} }
}
function select(obj){
//l’utente ha premuto il tasto D della tastiera If(Keystatus("D")){
trig_desc=true; }
if(trig_desc){
//recupero il numero identificativo dell’oggetto //corrispondente all’indice dei suoi metadata //nell’array aMetadata
var index = obj.getid();
continua...
var getArtist = aMetadata[index][0];
var getTitle = aMetadata[index][1];
var getDate = aMetadata[index][2];
var getDescription = aMetadata[index][3]; ConsoleText(0.02, 0.95, "Artist: "+getArtist); ConsoleText(0.02, 0.90, "Title: "+getTitle); ConsoleText(0.02, 0.85, "Date: "+getDate); ConsoleText(0.02, 0.80, "Description:
100
3.1.10.2 Navigazione assistita
Questa funzionalità funge da elemento accessorio per facilitare la fruizione del museo virtuale e migliorare l’esperienza dell’utente nella visita dell’ambiente. Il sistema consiste nell’etichettare le stanze del museo con le lettere dell’alfabeto e nel visualizzare quali opere sono presenti nelle diverse stanze, in modo che il visitatore possa muoversi da una stanza all’altra per vedere determinate opere senza dover effettuare tutto il percorso completo. L’aggiunta di questa funzionalità è stata resa possibile con le seguenti implementazioni:
Per prima cosa vengono aggiunti degli oggetti CVmText, ovvero delle lettere dell’alfabeto
tridimensionali, una in ogni stanza per poter etichettare ogni spazio del museo; questa operazione va di pari passo con la costruzione delle stanze del museo:
...
//recupero i metadati dall’array var getArtist = aMetadata[index][0];
var getTitle = aMetadata[index][1];
var getDate = aMetadata[index][2];
var getDescription = aMetadata[index][3]; //stampo i metadati sulla console
ConsoleText(0.02, 0.95, "Artist: "+getArtist); ConsoleText(0.02, 0.90, "Title: "+getTitle); ConsoleText(0.02, 0.85, "Date: "+getDate); ConsoleText(0.02, 0.80, "Description: "+getDescription); } } function callModularity(num){ ...
//creo l’oggetto CVmText e gli assegno proprietà basilari come //font e posizione
textTopLeft = CVmText(charSet[contText], bbTop[0]+((bbTop[3]- bbtop[0])/2), 50.0, "Arial", 0);
//ingrandisco l’oggetto textTopLeft.setscale(5.0);
//creo un CVmObj padre per ospitare la lettera tridimensionale ObjTextTopLeft = CVmObj();
continua... ...
//collego la lettera tridimensionale con l’oggetto ObjTextTopLeft.LinkToText(textTopLeft);
//assegno la posizione
ObjTextTopLeft.SetPosition(bbTop[0]+((bbTop[3]-bbtop[0])/2),
0.0, bbTop[2]+((bbTop[5]-bbtop[2])/2));
//assegno un punto costituente il perno
ObjTextTopLeft.setpivotpoint(bbTop[0]+((bbTop[3]-bbTop[0]))/2,
50.0, bbTop[2]+((bbTop[5]-bbTop[2]))/2);
//aggiungo l’oggetto nell’array aadd(aTextObj, ObjTextTopLeft); ...
101
La seconda operazione da fare è disegnare queste lettere tridimensionali all’interno dell’ambiente virtuale e farle ruotare in modo da essere visibili durante l’esplorazione del museo da parte dell’utente
La terza operazione è controllare se l’utente decide di visualizzare la lista delle opere d’arte presenti nel museo premendo il tasto “H” della tastiera;
if(KeyStatus("H")){
trig_list = !trig_list; }
for(var i = 0; i<len(aTextObj);i++){ //ottengo un timer
var temp = gettime();
var Ltime = 0;
//passati 0.10 secondi if(temp-ltime>10){
//aumento l’angolo di rotazione textAngle += 0.0001;
//ruoto le lettere sull’asse Y
aTextObj[i].Rotate(textAngle, 0,1,0); }
//visualizzo le lettere nell’ambiente tridimensionale aTextObj[i].Draw();
102
Nella OnFrame() viene invocata la funzione viewList() che si occupa di stampare sul video i valori relativi ai metadati delle opere del museo
function viewList(){
//se l’utente ha premuto il tasto H if(trig_list){
//spaziatura dei caratteri su video var spacing = 0.98;
var spacingMetadata = 0.96;
//contatore per elencare tutti i metadati var contUno = 0;
//contatore per elencare i metadati per ogni stanza var contDue = 0;
//accedo nell’array delle lettere tridimensionali for(var i = 0; i<len(aTextObj);i++){
ConsoleText(0.55, spacing, "Quadri presenti nella stanza "+charSet[i]+": "+selectView[i]);
//spaziatura fra i metadati spacing = spacing - 0.13; }
//elenco quattro metadati per stanza for(var i =0; i<len(aMetadata);i++){
//se ho rappresentato tutti i metadati esco dal ciclo
if(contUno == len(aMetadata)){
break; }
//azzero il contatore se completo i metadati di una stanza e inserisco uno spazio maggiore else if(contDue==4){
contDue = 0;
spacingMetadata = spacingMetadata - 0.05; }
//stampo i metadati su video ConsoleText(0.55, spacingMetadata, aMetadata[contUno][0]+" - "+aMetadata[contUno][1]); spacingMetadata = spacingMetadata - 0.02; //aggiorno i contatori contUno++; contDue++; } } }
103
Sempre in OnFrame() è presente la funzionalità che permette all’utente di spostarsi da una stanza all’altra; ogni stanza viene identificata, oltre che con una lettera dell’alfabeto, anche con un numero intero che va da zero a otto, corrispondente al numero massimo di stanze che possono essere presenti nel museo virtuale;
Con questa ultima illustrazione si conclude il paragrafo riguardo le implementazioni e gli strumenti usati per la realizzazione del museo virtuale VR. Il prossimo paragrafo riguarderà le implementazioni e gli strumenti usati per la realizzazione del museo virtuale AR.