ANDROID ALGEMEEN Met het Android gedeelte moet de gebruiker toegang krijgen tot het verhaal. De gebruiker moet dit op een fijne en natuurlijke manier kunnen doen. Wij gebruiken de Google Cardboard SDK om hierbij een VR ervaring mogelijk te maken. De gebruiker moet een poster kunnen scannen om aan de hand van die poster tot een hoofdstuk toe te kunnen treden, vervolgens kijkt de grebruiker door de ogen van het hoofdpersonage uit het verhaal. Om dit technisch te realiseren kwamen de onderstaande onderdelen aan bod. VERSIE BEHEER Om ervoor te zorgen dat we met meerdere mensen aan een project kunnen werken hebben we Git aangemaakt. Dit systeem was voor veel mensen uit de groep nieuw, hierdoor hebben we niet teveel met Branches gewerkt, maar zijn we alleen op de master bezig geweest. Het fijne aan git is dat je code niet overschreven wordt maar samen aan dezelfde code kunt werken. Hiervan hebben we als groep een hoop geleerd en is dit een techniek die we in het vervolg van onze opleiding en carrière nog vaak terug gaan zien. De repository staat op de Git van Fontys: https://github.com/ccappuccino/aneesha
IMAGE RECOGNITION Wanneer de gebruiker een poster scant moeten wij weten welke poster ze gescand hebben zodat het juiste onderdeel/hoofdstuk opstart. Afgezonderd van de cardboard moeten we deze techniek kunnen gebruiken, dit hebben we gedaan door een camera app te gebruiken die een foto kan maken en daarna deze foto verzend naar een server die gaat kijken of het overeen komt met een van de foto s op deze zelfde server. Wanneer de foto verzonden is krijgen we een response van de server of het correct of incorrect overeenkomt met de van te voren ingevoerde afbeelding. Om dit te kunnen doen gebruiken wij Recognize, een toegankelijke derde partij die het herkennen van foto s serverside regelt. Op de volgende link staat de documentatie van deze API service. https://www.recognize.im/site/howtouse#android_sample_application Voor Android hebben wij de juiste code uit de documentatie weten te halen en deze bij ons in de applicatie gezet binnen Android Studios in JAVA. Nu we een foto kunnen maken vanuit de camera en deze vervolgens zo kunnen verzenden naar de Recognize server zijn we zover om door te gaan naar het volgende.
CARDBOARD SDK ANDROID STUDIO S We willen de gebruiker de luxe geven dat ze nooit de Cardboard af moeten doen om iets te moeten klikken op het scherm. Hierdoor hopen we ze betrokken te houden binnen de applicatie en een extra beleving te geven. Om dit te doen moet het beeld dus vanaf de start verdeeld worden over twee views. Deze views zijn per oog verschillend om zo perspectief te creëren in de elementen op het scherm. Online is er een hoop documentatie te vinden over de google cardboard SDK, om deze te gebruiken zijn we ook gaan kijken naar wat andere projecten op Github. De reden hiervan is dat we de Google SDK moeten combineren met een Camera view. Een aantal voorbeelden van deze projecten zijn: - https://github.com/yangweigbh/libgdx-cardboard-extension - https://github.com/sveder/cardboardpassthrough Het CardboardPassthrough project was een geschikt project waarin de camera view op de juiste manier werkte, echter had dit project een verlopen google cardboard SDK en andere verlopen code die een hoop verbeteringen nodig hebben. Deze verbeteringen kunnen we oplossen door de documentatie van google te gebruiken. UNITY
Zodra de gebruiker een poster gescand heeft met de image Recognition komt de gebruiker in het verhaal terecht. Over deze ervaring staat later in dit document nog meer in detail uitgelegd, voor nu gaan we kijken naar welke rol Android hierin speelt. Unity heeft een eigen SDK gedeelte van de Google Cardboard, deze zorgt ervoor dat de camera in de Unity wereld verandert van een naar twee views die een perspectiefcorrectie toevoegen. Om deze wereld te exporteren naar Android heeft Unity een eigen exportoptie geïntegreerd. CODE STRUCTUUR LIBRARIES & FRAMEWORKS De eerste Libary is de carboard.jar. Deze wordt aangeboden door Google om de gebruiker door de lenzen van de Carboard te laten kijken in twee aparte views, per oog één. Een groot probleem dat we zijn tegengekomen is dat de automatisch gegenereerde code van Unity ook met deze Cardboard.jar werkt. Hierdoor kregen we verschillende fouten tijdens het bouwen van het project. Om dit probleem op te lossen hebben we een aantal bestanden binnen de Library moeten verwijderen. Dit omdat deze bestanden al in de automatische gegenereerde Unity bestanden zaten. ItraffApi_v2.jar is de Libary die Recognize.im aanbiedt. Wat deze Library doet bestaat uit twee belangrijke dingen: 1. Het comprimeren van afbeeldingen om deze te kunnen versturen in de API call. Hoe dit gedaan wordt is door de gemaakte image te comprimeren tot een ByteArray. Zie bijlage 1 aan het eind van dit document voor de complete functie.
2. Een itraffapi class waarin alle functies zitten om zowel data te verzenden en binnen te halen. De response na het maken van de juiste call met daarin de image, wordt terug verstuurd als JSON Response. Om deze te kunnen ophalen gebruiken we de itrafficapihandler. Dit is een Handler die op een andere Thread (Async Task) de response van de call binnenhaalt en kijkt naar het resultaat. CLASSES & ACTIVITIES MainActivity.java De MainActivity wordt verlengt met de functie gegevens van de CardboardActivity. Een aantal functies hiervan zijn: oncardboardtrigger, onsurfacecreated, onnewframe, ondraweye, onframeavailable en onfinishframe. Methoden OnCreate(); In deze functie wordt de contentview opgehaald waarin de lay-out staat om mee te gaan werken. Deze worden doormiddel van de CardboardView bepaald volgens de richtlijnen van de Google Cardboard documentatie. Ook wordt in de OnCreate de itraffapihandler benoemd zodat deze klaar is wanneer er een foto verstuurd wordt. createtexture(); Geeft de texture terug voor de cameraview zodat de camera verdeeld wordt over de twee ooggaten. startcamera(int Texture); Start de camera preview met daarin de afmeting die bepaald zijn in de createtexture functie zodat de preview wordt weergegeven per oog. Door deze functie ziet de gebruiker door de camera van het toestel. oncardboardtrigger(); Een functie die wordt aangeroepen wanneer de gebruiker de cardboard knop aan de zijkant naar beneden trekt. Zodra deze wordt aangeroepen wordt de wordt in de Camera klasse de takepicture functie aangeroepen.
Camera.OnPictureTaken(); Een Listener van de Camera die wacht totdat er een foto is gemaakt. Zodra deze klaar is en is verwerkt wordt deze file op de juiste plek neergezet zodat we hierna de foto kunnen versturen door de makeapicall functie. makeapicall(); Kijkt of de gemaakte foto aanwezig is en als die aanwezig is, wordt deze gecomprimeerd tot een ByteArray en vervolgens verstuurd via de ItraffApi.CardboardOverlayView.java De Cardboardoverlayview klasse wordt gebruikt om ervoor te zorgen dat alles binnen de lay-out diepte krijgt. Deze klasse heeft een subklasse CardboardOverlayEyeView waarin iedere view ook links en rechts de juiste parameters meekrijgt om diepte in de afbeeldingen te krijgen. Let hierbij op de camera view die in de MainActivity is neergezet, deze heeft immers geen perspectief hierin (omdat er maar één camera is), maar zowel de objecten als het logo en tekst die voorbij komt hebben dat wel.