Le esperienze d’utilizzo date dai dispositivi a realtà aumentata non cambieranno solo il modo in cui funzionano i videogame, ma anche l’interazione coi computer in generale. Ecco alcuni esperimenti e idee di Damian Mehers a riguardo.
Una delle idee è nata dalla necessità di dover impiegare i sensori di orientamento di un device Android Wear: perché non sfruttarli come input per un’innovativa esperienza VR? Cosa succederebbe se si “importasse” una parte del proprio corpo del mondo reale nel VR World, come ad esempio un braccio?
Dopo numerose ore di sperimentazione, ecco la risposta:
httpvh://youtu.be/8ywn21ValCA
The experience is nowhere near good enough for games. But I don’t care about games. I want to create genuinely useful VR experiences for interacting with computers in general, and I think this is good enough. I can point to objects, and have them light up. I can wear smart watches on both wrists (because I really am that cool) and have two arms available in the VR world.
Con la combinazione di tapping e swiping – direttamente dal display dei dispositivi Android Wear – è quindi possibile attivare la funzionalità in-world, senza esserne “tirato fuori”.
It sure beats sliding a magnet on the side of my face, because it is my arm I am seeing moving in the virtual world.
Ecco ora una serie di sfide tecniche dietro all’implementazione di quanto visto nel video, ricche di dettagli sul superamento di esse e sulle risorse usate.
Strumenti
Ecco il workspace indispensabile: Android Studio (a sinistra), Unity (in alto a destra) e MonoDevelop (in basso a destra):
Sviluppare questa soluzione ha richiesto numerose schede reference (non ha senso scrivere da capo snippet già costruiti che possono fare al proprio caso), e ovviamente una grande confidenza con Android, Java e C#. L’autore ha dichiarate di essere “relativamente un principiante” con Unity.
Creazione di un plugin Unity in Java per sovrascrivere il plugin di Google Cardboard
La documentazione di Unity Android Plugin descrive come è possibile creare dei plugin estendendo la classe Java UnityPlayerActivity.
I experimented with this a little. I created an Android Library using Android Studio, and implemented my own UnityPlayerActivity derived class.
After a little hassle, I discovered that Unity now supports the “aar” files generated when compiling libraries in Android Studio, although I found the documentation a little out of date on the matter in places. It was simply a question of copying my generated “aar” file into Unity under Assets|Plugins|Android.
Per quanto riguarda il progetto Unity di Google Cardboard, Damian si è accorto che Big G era arrivata prima di lui: i suoi ingegneri avevano già creato il loro UnityPlayerActivity chiamato GoogleUnityActivity. Vi era dunque necessità di effettuare un @override.
Ecco come sono state incluse le classi modificate dal colosso di Mountain View nelle librerie del progetto dell’artefice di questa implementazione:
Once I’d copied the aar file into the Unity Android Plugins folder and ran the test app, I was delighted to see my activity say “Cooey” in the log.
La citazione si riferisce al corretto funzionamento della riga di codice Log.d(“Override Activity”, “onCreate called! Cooey!!!”); , che evoca un log a scopi di debug.
Ricevere l’orientamento dello smartwatch dallo smartphone
Lo step successivo era ricevere segnali mandati dallo smartwatch Android Wear che contenessero informazioni sull’orientamento del dispositivo.
Damian ha quindi ricreato il proprio progetto, includendo anche il supporto per Android Wear:
First I used the Capabilities mechanism to tell other Android Wear devices that this device (the phone) was interested in arm orientation messages:
… and I set it up to receive Android Wear messages and pass them over to Unity using UnitySendMessage:
Inviare l’orientamento dello smartwatch allo smartphone
A questo punto era solo una questione di cercare i Nodes Android Wear che avessero la capacità necessaria, che inviassero i cambi rilevati dal sensore d’orientamento, e che inviassero messaggi Android Wear al giusto Node. Ecco il codice per lo smartwatch:
Nel mentre, Damian ha scoperto che alcuni dispositivi Wear non supportano i sensori richiesti, ma molto probabilmente lo snippet funziona su tutti i device più moderni.
Sfruttare l’orientamento del watch per animare un blocco sullo schermo
Inside Unity I created a cube which tweaked into a rectangle, and made it a child of the CardboardMain’s camera, so that it moved when I moved:
Vedete la sezione “Script“, in basso a destra? Vi è uno script chiamato “WristController.cs” (per gestire il movimento del “polso”, che per ora è rappresentato da un cubo bianco). Lì è dove – grazie alla classe Java UnityPlayerActivity custom – vengono ricevute le informazioni relative all’orientamento dello smartwatch inviate da esso stesso.
I started off simply assigning the received orientation to the block’s orientation by assigning to transform.eulerAngles
A quanto pare funzionava, ma era eccessivamente scattoso. Ecco la risorsa che, implementato col precedente codice, lo ha migliorato notevolmente. Ecco il sourcecode aggiornato:
Animare un braccio al posto del blocco cubico
I was pleased to be smoothly animating a block, but my arm doesn’t quite look like that. It is more armish. I went looking for a model of an arm that I could import and use instead. I found a YouTube Unity video called ADDING ARMS by Asbjørn Thirslund, in which he explains how to to import and use a free arms model by eafg.
httpvh://www.youtube.com/watch?v=OUQuHf8M9XQ
Si è trattato di una semplice questione di dimensionamento e posizionamento degli arti come un oggetto figlio della videocamera Unity principale, ai quali si è aggiunto lo script utilizzato precedentemente per animare il blocco.
I also removed the right-hand arm, since it looked a little weird to have a zombie arm doing nothing.
Lo script ArmController visibile nello screenshot ha lo stesso contenuto di WristController.cs di prima.
Considerazioni finali
Ci vorrà molto prima che questa tecnica sia a tutti gli effetti praticabile per i giochi mobile, ma per i tipi di esperienze utente desiderati da Damian i tempi sono già maturi.
I’d also need to add calibration, since the watch may be pointing in any direction initially – if I assume it always starts straight out, that would be good enough. Detecting where the arm is pointing shouldn’t be too hard, since the cardboard code already does gaze detection – so many possibilities, but so little time for side-projects such as this!
This has been a fun interlude on my way to creating what I hope to be a genuinely useful VR experience based around browsing books your friends have read … more on that later.
Cosa ne pensate di questo fantastico lavoro preparato da Damian Mehers? Ditecelo nei commenti.