scieee AI-readable full text Open interactive document viewer

Implementació de l'entorn Unity a la rehabilitació amb una aplicació 3D

Morancho Gràcia, Albert

Abstract

Les aplicacions multimèdia on es recrea un entorn en tres dimensions (3D) han guanyat molta força durant els últims anys, sobretot en el camp dels videojocs que encara segueix creixent de forma notable. En aquest estudi s’ha realitzat una aplicació en 3D que s’aplicarà al sector mèdic a través de tractaments per a la rehabilitació d’un possible pacient. Els tractaments de rehabilitació seran utilitzats per pacients que hagin desenvolupat una reducció de moviment al braç a causa d’un Ictus, que pot deixar seqüeles motores tant de mobilitat com d’expressió del llenguatge. L’aplicació s’ha basat en el moviment d’un ratolí de l’ordinador, que serveix com a comandament pel pacient i registra la informació corresponent d’aquest. L’objectiu d’aquest treball ha sigut desenvolupar un joc de recollida de fruita que caurà progressivament i de forma aleatòria en una zona de platja, on l’usuari haurà de desplaçar el ratolí de forma vertical i horitzontal per tal de recollir el major nombre de cocos possibles. D’aquesta manera un cop aconseguits els diferents resultats de joc, es registrarà el progrés del pacient i així els fisioterapeutes podran estudiar la seva evolució en el temps. Aquest estudi s’ha dut a terme amb les eines proporcionades per l’entorn de creació d’aplicacions Unity 3D. En aquesta plataforma s’ha pogut programar tots els aspectes del joc i generar els resultats que posteriorment seran analitzats per l’Associació de Diversitat Funcional d’Osona (ADFO). L’aplicació d’aquest projecte s’ha provat per vint-i-cinc voluntaris sans durant el transcurs del treball final de grau i també s’ha fet una enquesta de satisfacció. L’objectiu d’aquesta és millorar el projecte des del punt de vista de l’usuari durant el desenvolupament del projecte. L’objectiu final d’aquest TFG s’ha centrat en el fet que l’aplicació sigui útil per la recuperació dels pacients i a la vegada també útil pels fisioterapeutes assignats a la seva rehabilitació, amb dades lligades al moviment del jugador que s’extrauran en un document de text i futurament es podran analitzar totes les sessions de joc diferents.

Full text

TREBALL FI DE GRAU Grau en Enginyeria Electrònica, Industrial i Automàtica IMPLEMENTACIÓ DE L’ENTORN UNITY A LA REHABILITACIÓ AMB UNA APLICACIÓ 3D Memòria i Annexos Autor: Albert Morancho Gràcia Director: Francisco Alpiste Penalba Co-Director: Jordi Torner Gil Serrancoli Masferrer Convocatòria: Septembre 2020 Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D i Resum Les aplicacions multimèdia on es recrea un entorn en tres dimensions (3D) han guanyat molta força durant els últims anys, sobretot en el camp dels videojocs que encara segueix creixent de forma notable. En aquest estudi s’ha realitzat una aplicació en 3D que s’aplicarà al sector mèdic a través de tractaments per a la rehabilitació d’un possible pacient. Els tractaments de rehabilitació seran utilitzats per pacients que hagin desenvolupat una reducció de moviment al braç a causa d’un Ictus, que pot deixar seqüeles motores tant de mobilitat com d’expressió del llenguatge. L’aplicació s’ha basat en el moviment d’un ratolí de l’ordinador, que serveix com a comandament pel pacient i registra la informació corresponent d’aquest. L’objectiu d’aquest treball ha sigut desenvolupar un joc de recollida de fruita que caurà progressivament i de forma aleatòria en una zona de platja, on l’usuari haurà de desplaçar el ratolí de forma vertical i horitzontal per tal de recollir el major nombre de cocos possibles. D’aquesta manera un cop aconseguits els diferents resultats de joc, es registrarà el progrés del pacient i així els fisioterapeutes podran estudiar la seva evolució en el temps. Aquest estudi s’ha dut a terme amb les eines proporcionades per l’entorn de creació d’aplicacions Unity 3D. En aquesta plataforma s’ha pogut programar tots els aspectes del joc i generar els resultats que posteriorment seran analitzats per l’Associació de Diversitat Funcional d’Osona (ADFO). L’aplicació d’aquest projecte s’ha provat per vint-i-cinc voluntaris sans durant el transcurs del treball final de grau i també s’ha fet una enquesta de satisfacció. L’objectiu d’aquesta és millorar el projecte des del punt de vista de l’usuari durant el desenvolupament del projecte. L’objectiu final d’aquest TFG s’ha centrat en el fet que l’aplicació sigui útil per la recuperació dels pacients i a la vegada també útil pels fisioterapeutes assignats a la seva rehabilitació, amb dades lligades al moviment del jugador que s’extrauran en un document de text i futurament es podran analitzar totes les sessions de joc diferents. Memòria ii Resumen Las aplicaciones multimedia donde se recrea un entorno en tres dimensiones (3D) han ganado mucha fuerza en los últimos años, sobre todo en el campo de los videojuegos que aún sigue creciendo de forma exponencial. En este estudio se ha desarrollado una aplicación en 3D que se aplicará al sector médico mediante tratamientos para la rehabilitación de un posible paciente. Los tratamientos de rehabilitación serán utilizados por pacientes que hayan desarrollado una reducción de movimiento en el brazo a causa de un Ictus, que puede dejar secuelas motoras tanto de movilidad como de expresión del lenguaje. La aplicación ha sido basada en el movimiento de un ratón de mesa, que sirve como controlador para el paciente y registra los datos correspondientes del mismo. El objetivo del trabajo ha sido un juego de recogida de cocos que caerán progresivamente y de forma aleatoria en una zona de playa, donde el usuario tendrá que desplazar el ratón del ordenador de forma vertical y horizontal para conseguir el mayor número de cocos posibles. De este modo, una vez recopilados los diferentes resultados del juego, se registrará el progreso del paciente y así los fisioterapeutas podrán estudiar su evolución en el tiempo. Este estudio se ha llevado a cabo con las herramientas proporcionadas por el entorno de creación de aplicaciones Unity 3D. En esta plataforma se ha podido programar todos los aspectos del juego y generar los resultados que posteriormente serán analizados por la Asociación de Diversidades Físicas de Osona (ADFO). La aplicación de este proyecto se ha probado por veinticinco voluntarios sanos durante el transcurso del trabajo final de grado y también se ha hecho una pequeña encuesta de satisfacción. El objetivo de esta es mejorar el proyecto desde el punto de vista del usuario durante el desarrollo del proyecto. El objetivo final de este TFG se ha centrado en que la aplicación sea útil para la recuperación de los pacientes y a la vez también útil para los fisioterapeutas asignados a su rehabilitación, con datos ligados al movimiento del jugador que se extraerán en un documento de texto y futuramente se analizarán todas las sesiones de juego diferentes. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D iii Abstract Multimedia applications, where a three-dimensional environment is recreated (3D), have gained a lot of strength in recent years, especially in the field of video games, which is still growing exponentially. In this study, a 3D application has been developed that will be applied to the medical sector through treatments for the rehabilitation of a possible patient. Rehabilitation treatments will be used by patients who have developed a reduction in movement in the arm due to a stroke, which can leave motor sequelae in both mobility and expression of language. The application has been based on the movement of a "mouse" (mouse in Spanish), which serves as a controller for the patient and records the corresponding data. The objective of the work has been a game of collecting coconuts that will fall progressively and randomly in a beach area, where the user will have to move the mouse vertically and horizontally to get as many coconuts as possible. In this way, once the different results of the game have been collected, the patient's progress will be recorded and thus the physiotherapists will be able to study their evolution over time. This study has been carried out with the tools provided by the Unity 3D application creation environment. In this platform it has been possible to program all aspects of the game and generate the results that will later be analyzed by the Association of Physical Diversities of Osona (ADFO). The application of this project has been tested by twenty-five healthy volunteers during the course of the final degree project and a small survey has also been done. The objective of this is to improve the project from the user's point of view during the development of the project. The final objective of this TFG has focused on making the application useful for the recovery of patients and at the same time also useful for the physiotherapists assigned to their rehabilitation, with data linked to the movement of the player that will be extracted in a text document and all the different game sessions will be analyzed in the future. Memòria iv Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D v Glossari ADFO: Associació de Diversitat Funcional d’Osona. Assets: Elements del joc ( imatges, objectes, materials…). Canvas: Mostra diferents elements i s’utilitza com a pantalla de joc. EEBE: Escola d’Enginyeria de Barcelona Est. GameObject: Es refereix a un objecte del joc. RV: Realitat Virtual. Script: Arxiu de codi de l’aplicació. TFG: Acrònim de Treball de Final de Grau. UPC: Universitat Politècnica de Catalunya. 2D: Dues dimensions. 3D: Tres Dimensions. Memòria vi Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D vii Índex RESUM ______________________________________________________________ I RESUMEN __________________________________________________________ II ABSTRACT __________________________________________________________ III GLOSSARI ___________________________________________________________ V 1. PREFACI _______________________________________________________ 1 1.1. Origen del treball ................................................................................................................. 1 1.2. Motivació ............................................................................................................................. 1 1.3. Associació Diversitat Funcional d'Osona (ADFO). ............................................................... 2 2. INTRODUCCIÓ __________________________________________________ 3 2.1. Objectius del treball ............................................................................................................. 3 2.1.1. Objectiu principal ...................................................................................................... 3 2.1.2. Objectius específics ................................................................................................... 4 2.2. Abast del treball ……………………………………………………………………………………………………………4 2.3. Planificació del treball……………………………………………………………………………………………………5 2.3.1. Diagrama de Gantt .................................................................................................... 7 3. ESTAT DE L'ART _________________________________________________11 3.1. Accident cerebrovascular (ictus) ........................................................................................... 13 3.1.1. Classificació d'ictus .................................................................................................. 14 3.1.2. Símptomes de l'ictus ............................................................................................... 15 3.1.3. Seqüeles derivades de l'ictus .................................................................................. 16 3.1.4. Tractaments ............................................................................................................ 17 3.2. Aplicacions en 3D i RV ........................................................................................................ 18 3.2.1. Motor de joc ............................................................................................................ 19 3.2.2. Tecnologia 3D aplicada a la rehabilitació ............................................................... 21 4. RECURSOS MATERIALS _ _________________________________________ 24 4.1. Unity ................................................................................................................................... 24 4.1.1. La interfície de Unity ............................................................................................... 25 4.1.2. Llenguatge de Unity ................................................................................................ 29 4.1.3. Requisits previs de Unity ......................................................................................... 30 Pág. 2 Memòria 2 augmenti considerablement. D’aquest forma, no només es beneficiaran els pacients, sinó que també facilitarà les dades de joc obtingudes als fisioterapeutes corresponents, que podran analitzar les dades i el seu progrés a través de sessions de rehabilitació. A més a més, també existeix la motivació de treballar amb tecnologies recents en un sector on cada vegada veiem més aplicacions per a la medicina, així que també és una forma d’ajudar a possibles futurs estudis que es relacionin amb aquest. 1.3. Associació Diversitat Funcional d’Osona (ADFO) ADFO és una entitat sense ànim de lucre declarada d’utilitat pública que treballa per buscar oportunitats per a les persones afectades per algun tipus de discapacitat física, com lesions medul·lars, malalties neurològiques, amputacions, etc[1]. Treballen per la integració universal de les persones amb discapacitat física en diferents àmbits socials: familiar i d’amistats, laboral, formació, oci i lleure, esport adaptat i cultura. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 3 2. Introducció Avui en dia la humanitat utilitza el món virtual com a font principal d’entreteniment o com a forma d’evadir-se de la rutina. Cada vegada més aquest món tecnològic s’està incorporant a diferents camps d’investigació, com per exemple en el sector mèdic, que sempre està en constant evolució. Aquestes millores proporcionen diferents avantatges en comparació a mètodes més antics, com podria ser més precisió, l’agilització en la recollida de dades i més fiabilitat entre d’altres. La rehabilitació i la fisioteràpia és la part de la medicina que ofereix un tractament terapèutic i de rehabilitació no farmacològica per diagnosticar, prevenir i tractar símptomes de múltiples dolors o malalties, siguin agudes o cròniques, per mitjà de diferents rutines o activitats. En aquest estudi s’ha dissenyat una aplicació en tres dimensions per a la rehabilitació utilitzant les tècniques que ens proporciona l’entorn de creació Unity 3D. 2.1. Objectius del treball Inicialment aquest treball tenia com a objectiu principal crear diferents exercicis de rehabilitació a través de la dansa en una aplicació de realitat virtual, on el pacient a través dels controladors de moviment, les ulleres de RV, la música i unes guies de moviment podria aprendre diferents estils de dansa urbana, executant així moviments que podrien ser beneficiosos per a la recuperació de les funcions motores i l’equilibri. Malauradament donades les circumstàncies sanitàries actuals i la suspensió d’activitats docents presencials, els objectius del projecte van ser modificats pels objectius redactats a continuació. 2.1.1. Objectiu principal L’objectiu principal del projecte ha sigut crear una aplicació de recollida de fruita on el pacient executa exercicis de rehabilitació amb el braç afectat per tal de recollir-les. Posteriorment s’exporta un Excel amb les dades obtingudes amb la intenció de ser estudiades per un fisioterapeuta que futurament analitzarà el seu progrés. Memòria 4 2.1.2. Objectius específics • Dissenyar una mecànica de joc senzilla amb el ratolí i treballar exercicis amb diferents moviments beneficiosos per a la recuperació parcial o total del moviment del braç de l’usuari. • Dissenyar un ambient de joc agradable a través de “Assets” gratuïts de la “UnityStore”. • Creació de tres nivells de joc i variar la dificultat d’aquests. • Disseny del coco, l’objecte que s’ha de recollir. • Implementació d’un objecte “bomba” que el pacient haurà d’evitar. • Creació de comptadors que administraran els punts d’encert i els punts d’errada que haurà comés el jugador. • Fer proves i enquestes a voluntaris en cerca de millores per l’aplicació. 2.2. Abast del treball Aquest projecte ha sigut realitzat amb altres treballs similars com a antecessors a l’aplicació. Per tant l’abast d’aquest projecte és millorar la versió anterior, que estava en procés “beta”, afegint dificultats, modificant l’aspecte de la interfície gràfica i exportant dades com a resultats finals que diferents fisioterapeutes puguin analitzar. Els tutors van recomanar diferents exercicis a executar amb el braç durant el transcurs de l’aplicació, i aquest eren: flexió d’espatlla i colze, rotació i desviació radial-cubital. Els moviments s’han de dur a terme amb el ratolí mentre el botó esquerre del mateix es manté clicat, d’aquesta forma es podrà obtenir les dades en format text dels resultats a les diferents coordenades de l’escena de joc. Per últim es va fer unes proves amb voluntaris sans i posteriorment es van analitzar les dades dels resultats obtinguts. Va ser una bona forma de millorar certs aspectes de l’aplicació. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 5 2.3. Planificació del treball Per a la realització d’aquest treball es van assolir uns coneixements previs, ja que era necessari realitzar el “Màster en Programación de Vidiojuegos con Unity 2018 y C#”, que els tutors del treball van enviar tot just va començar el projecte. En aquest màster s’expliquen les diferents funcions i conceptes bàsics de Unity 3D. Després es va concretar una reunió presencial on es va assignar una proposta definitiva pel desenvolupament d’una aplicació de rehabilitació de realitat virtual a través de la dansa. Malauradament aquesta proposta va quedar en estat de congelació davant el protocol d’actuació de la UPC de l’activació de l’alerta sanitària per COVID-19 i la suspensió d’activitats docents/acadèmiques presencials a la universitat. Més endavant es va fer una altra reunió amb els tutors del treball i davant les circumstàncies extraordinàries es va canviar de projecte amb un altre company de grup nou. Posteriorment es va seguir desenvolupant el nou treball mentre es va seguir fent altres cursos de Unity 3D [2][3] per poder dur a terme els nous objectius proposats. En els següents dies els components del treball es van separar i cadascú va decidir fer un treball individual. Posteriorment a aquest fet, es van fixar quines serien les tasques més importants a resoldre durant el transcurs del projecte. Aquestes tasques van servir per estructurar el treball i també a l’hora de la planificació d’aquest. Alguns dels punts més importants van ser: • Creació d’un altre ambient de joc. • Disseny de millores i dificultats afegides a l’aplicació de recollida de fruita. • Millora i canvi de l’aspecte de la interfície gràfica. • Extracció de dades per un posterior anàlisi. • Realització de proves a voluntaris per tal d’obtenir resultats que poguessin beneficiar el desenvolupament de l’aplicació. Un cop es van realitzar totes les tasques, que estan detallades en el diagrama de Gantt de les figures 2.2 i 2.3, es va procedir a analitzar les dades obtingudes de les proves, treure conclusions, analitzar quines podrien ser les línies futures del projecte, fer una anàlisi econòmic i una anàlisi de l’impacte ambiental del projecte. La figura següent mostra un resum de la planificació del projecte: Memòria 6 Figura 2.1. Planificació del treball. INICI TFG Cursos previs i antecedents de l’aplicació Reunions amb els tutors Objectius a desenvolupar i implementar Programació de l’extracció de dades Disseny de la interfície i dels menús de joc Disseny de l’ambient Proves a voluntaris Anàlisi dels resultats Disseny de l’aplicació Resultat final Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 7 2.3.1. Diagrama de Gantt TASQUES DATA D’INICI Primera reunió (Treball RV) – Assignació de grup 20/12/2019 Inici dels cursos en linia de Unity 15/01/2020 Revisar treballs anteriors relacionats amb el projecte 10/02/2020 Segona reunió (Treball RV) – Assignació proposta 24/02/2020 Protocol d’actuació de la UPC davant l’activació de l’alerta sanitària per COVID-19 09/03/2020 Suspensió activitats docents/acadèmiques presencials 12/03/2020 Primera reunió online (Després del COVID-19) i canvi de company de grup. 10/04/2020 Estudi del disseny de l’aplicació del nou company de grup 13/04/2020 Inici de nous cursos de Unity recomanats pel company de grup. 17/04/2020 Primera reunió de grup online (Segon treball) 23/04/2020 Estudi del codi de l’aplicació i preparació de l’estructura de la memòria 28/04/2020 Fi del treball conjunt 04/05/2020 Reunió online per la nova proposta de treball en solitari. 18/05/2020 Inici del treball en solitari definitiu 25/05/2020 Cerca de nous Assets a Unity Store pel l’entorn gràfic 26/05/2020 Disseny gràfic de la pantalla de joc i de l’aspecte de la interfície gràfica 28/05/2020 Canvi del format de text de tota l’aplicació. 02/06/2020 Ajustar el rang d’encerts i errades 03/06/2020 Afegir els plàtans com a objecte bomba (programació) 04/06/2020 Memòria 8 Programació d’un “reset” als comptadors al canviar d’usuari. 05/06/2020 Els plàtans es mantindran en pantalla si són recollits (programació) 08/06/2020 Comentar els Scripts i canvi de textures de l’objecte de joc “coco”. 11/06/2020 Afegir text de regles del joc 12/06/2020 Reunió de seguiment 15/06/2020 Sol·licitud de dipòsit en línia extraordinari (28 sep-1 oct) 16/06/2020 Ajustar els temps de destrucció de la fruita. 18/06/2020 Afegir un pla invisible per recollir els plàtans 20/06/2020 Millora del disseny del plàtan 25/06/2020 Inici de les proves alfa amb voluntaris 30/06/2020 Redacció de la memòria 10/07/2020 Afegir instruccions de controls de moviment 14/07/2020 Extracció de dades 03/08/2020 Integració de fletxes de direcció per indicar la profunditat. 20/08/2020 Integració d’una imatge d’un ratolí per millorar les fletxes de direcció. 29/08/2020 Anàlisi de les dades obtingudes 01/09/2020 Anàlisi de les proves realitzades per voluntaris. 15/09/2020 Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 9 Figura 2.2. Diagrama de Gantt Memòria 10 Figura 2.3. Diagrama de Gantt Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 11 3. Estat de l’art Actualment les tecnologies amb aplicacions 2D i 3D s’han incorporat en gairebé qualsevol mena de tecnologia del món i s’ha explotat en la majoria de camps. Per aconseguir els gràfics en les aplicacions en 3D s’utilitza la representació tridimensional de dades geomètriques i també diferents algoritmes[4], i les aplicacions en 2D són igual però treballen amb objectes d’un entorn virtual en l’eix de coordenades “x, y”, i aquests no tenen profunditat. Aquesta tecnologia de 3D es va aplicar per primer cop al voltant de l’any 1990, quan van sortir alguns jocs d’ordinador que es titulaven 3D. Aquests tenien un personatge principal en tres dimensions que es movia en un fons estàtic. Encara que els gràfics d’aquests jocs no eren gaire bons en comparació als actuals van ser un gran avenç tecnològic[4]. Avui en dia les tecnologies de 2D i 3D ofereixen quantioses aplicacions molt innovadores en el camp de la medicina, ja que els seus procediments són menys agressius que les teràpies convencionals i ajuden a la motivació del pacient en un procés de rehabilitació. Aquesta motivació pot afectar directament a la millora de les seves funcions motores i cognitives, i un altre factor que augmenta aquesta motivació és un entorn agradable[18] (que es pot aconseguir mitjançant les tècniques de Unity 3D). Cal esmentar que aquests factors també influencien al rendiment dels pacients que han patit un infart del cervell. Per altra banda les tecnologies que utilitzen la realitat virtual també han cobrat molta força en els últims anys. La RV és el terme utilitzat per descriure un entorn tridimensional, generat per un ordinador, el qual pot ser explorat i interactuat per un individuo. Aquesta persona passa a formar part d’aquest món virtual on es submergeix en un entorn en el qual pot manipular objectes o realitzar una sèrie d’accions. Les tecnologies de RV també poden utilitzar altres sistemes simultàniament, com per exemple auriculars, cintes de correr omnidireccionals, guants especials, etc. Aquests sistemes s’utilitzen per estimular els sentits de l’usuari i crear una il·lusió de realitat, encara que aquesta sigui difícil de simular, ja que el cervell humà està dissenyat per proporcionar una experiència molt sincronitzada amb els sentits del cos[5]. Per això és important tenir en compte termes com la immersió i el realisme en la conversa. Aquests factors són els que determinen si l’experiència de RV és convincent (agradable) o no ho és. Per tant està clar que s’ha de tenir en compte la fisiologia del cos humà a l’hora de fer una aplicació de RV, com per exemple que a més a més del rang de visió de 180º la visió humana disposa d’un rang perifèric, que si aquest no hi fos es notaria[5]. Memòria 18 3.2. Aplicacions en 3D i RV Amb la multitud de noves tecnologies informàtiques i el ràpid desenvolupament de la indústria dels videojocs, els jugadors tenen més necessitats de les que tenien abans quant a la visualització dels jocs. Es pot dir que la gran majoria ja no estan satisfets amb un joc en dues dimensions, i busquen millorar la seva experiència amb escenes 3D més autèntiques a la pantalla 2D. Això va provocar que els dissenyadors de jocs continuessin perseguint una millor qualitat de joc i un major efecte de realisme, duent a terme un procés de recerca i desenvolupant el disseny dels jocs[16]. Les aplicacions en tres dimensions es caracteritzen per tenir tots els elements del gràfic compostos per diversos polígons geomètrics en l’eix tridimensional. Això no obstant, també hi ha un tipus que mitjançant la combinació de les tecnologies 2D i la 3D compleix les diverses necessitats dels reproductors de videojocs[16]. La tecnologia d’imatges virtuals 3D és una branca de la realitat virtual. A la tecnologia 3D se la classifica com una tecnologia que utilitza sistemes no immersius, en el qual l’entorn virtual es veu a través d’una pantalla com podria ser la d’un ordinador[17]. La interacció entre el món virtual i l’usuari pot ser totalment convencional, per exemple utilitzant el ratolí i el teclat com s’observa en la figura 3.5: Figura 3.5. Imatges d’un sistema no immersiu.(Font:N/A) Els sistemes totalment immersius es caracteritzen per utilitzar ulleres de RV i controladors de moviment a les mans, i els semi-immersius són una mescla dels sistemes esmentats anteriorment. La principal avantatge dels sistemes no immersius, respecte als altres sistemes de realitat virtual com el sistema de projecció semiimmersiu o els sistemes totalment immersius, és que no requereixen el nivell més alt de rendiment gràfic i no necessiten un hardware especial o complicat, el que el fa accessible a la gran majoria[17]. En la figura següent es pot observar una imatge d’un sistema de realitat virtual semiimmersiu, i un altre imatge d’un sistema totalment immersiu. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 19 Figura 3.6. Imatges d’un sistema semiimmersiu i d’un sistema totalment immersiu. (Font:N/A) 3.2.1. Motor de joc El motor de joc (o “Game Engine” en anglès) és el nucli del desenvolupament del joc, a part del contingut principal que és mostrat a la pantalla de joc. La qualitat del disseny de les funcions, en l’àmbit de dades, influirà directament al funcionament correcte del programa[16]. La composició del motor de joc és complexa. La part principal inclou un renderitzador, l’estructura de l’escena, el sistema de moviment i el sistema de col·lisió[16]: • El Renderer: El disseny del renderer és la part més crucial d’un motor de jocs 3D, ja que és l’encarregat de mostrar les imatges 3D d’un joc en tres dimensions a la pantalla 2D. Per tant el renderer es divideix principalment en dues parts: una part al Hardware i una d’altra al Software. Aquests dos tipus tenen funcions diferents, on la part del Hardware s’utilitza principalment per la representació en temps real, com els jocs o la realitat virtual[16]. • Disseny del sistema d’escena: En el disseny de jocs 3D, tots els objectes 3D han d’estar al mateix espai 3D, que és el sistema d’escena que té una estructura 3D i normalment es coneix com el gràfic d’escena. El gràfic d’escena es pot observar a la figura 3.7. i conté molt nodes interconnectats, que eventualment formen un gràfic d’arbre on hi haurà una estructura parental i unes quantes subestructures a cada node, lligades a una estructura jeràrquica que compleixi amb els requisits de l’espai 3D[16]. Memòria 20 Figura 3.7. Exemple d’escena de joc.(Font:N/A) • Disseny del sistema de moviment: Les imatges del joc 3D solen ser dinàmiques, per tant, cada node de l’espai 3D del gràfic de l’escena és probable que canviï en qualsevol moment, i aquests canvis i moviments són gestionats per un programa que controla i gestiona el temps. Normalment el programa de control de temps requereix dues tasques bàsiques: El primer és registrar l’aparició del temps de moviment, és a dir, el node marca el temps de moviment segons l’aspecte de l’aplicació o segons el seu propi inici o final. En segon lloc hi ha una classificació circular dels moviments, incloent-hi el moviment cíclic, el moviment durant un període de temps concret i el moviment invers[16]. • Disseny del sistema de col·lisió: El node també detecta la col·lisió dels objectes a l’escena. Al gràfic de l’escena es troben tots els nodes envoltats per una estructura exterior anomenada malla, com es mostra a la figura 3.8. Des del punt de vista de rendiment, el sistema de col·lisions es divideix en dinàmiques i estàtiques. Les col·lisions estàtiques són col·lisions de superfícies, mentre que les dinàmiques van lligades al factor del temps[16]. Figura 3.8. Imatges d’unes malles senzilles (Font: https://developer.mozilla.org/en- US/docs/Games/Techniques/3D_collision_detection). Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 21 3.2.2. Tecnologia 3D aplicada a la rehabilitació L’aplicació de la tecnologia 3D als videojocs s’ha fet cada cop més extensa i avui en dia els jocs en tres dimensions s’han convertit en el corrent principal del desenvolupament dels videojocs. D’altra banda la falta d’adaptació del pacient amb les teràpies sempre ha sigut una important barrera a la rehabilitació[18], a part de ser intensa, costosa i difícil. En aquest apartat es revisa algunes de les evidències i avantatges sobre l’ús potencial dels videojocs en rehabilitació respecte als efectes conductuals, fisiològics i motivacionals del joc. La investigació suggereix que els videojocs són beneficiosos per a l’aprenentatge d’habilitats cognitives i motrius tant en ciències de rehabilitació com en estudis experimentals amb subjectes sans. Les dades fisiològiques suggereixen que el joc pot induir una reorganització neuroplàstica que condueixi a la millora de les funcions motores i de llenguatge a llarg termini[18]. Els diferents controladors de moviment (exemples en la figura 3.9) es poden utilitzar per practicar moviments rellevants en la rehabilitació i una mecànica de joc ben dissenyada pot augmentar la participació i la motivació del pacient en la rehabilitació[18]. Figura 3.9. Exemples de controladors de moviment. (Font: N/A). Les claus de l’aprenentatge motor i la neuroplasticitat, que és la capacitat del cervell per adaptar-se i canviar com a resultat de la conducta i l’experiència, són la motivació i recompensa, que es basa en la retroalimentació immediata i la pràctica de moviments especialitzats. Els videojocs sens dubte utilitzen mecanismes per augmentar la motivació i la recompensa, per exemple mitjançant nous jocs o nivells. Aquests nivells de joc, de simple a difícil, reflecteixen l’avanç del pacient en la complexitat dels moviments necessaris i també el temps en assolir els objectius específics, que també es poden moderar[18]. Memòria 22 Actualment existeixen diferents estudis que potencien els conceptes anomenats anteriorment i que estan relacionats amb la tele-rehabilitació. Alguns d’aquests s’analitzen a continuació. El projecte anomenat “Home-based virtual reality training after discharge from hospital-based stroke rehabilitation: a parallel randomized feasibility trial”[19], presentat el 2019, es basa en la creació d’un programa per rastrejar els moviments de l’usuari mentre interactua amb un joc en la pantalla de l’ordinador. Aquest projecte tenia com a objectius determinar la viabilitat d’utilitzar la tele-rehabilitació des de casa i determinar la viabilitat d’un conjunt de resultats obtinguts, quantitatius i qualitatius de l’infart del cervell, a través de proves a 40 pacients voluntaris que van patir un Ictus. Aquests es van separar en dos grups, com s’observa en la figura següent: Figura 3.10. Grups de treball del projecte referenciat [19]. Un grup practicava des de casa amb exercicis de realitat virtual a través d’una pantalla i l’altre grup practicava amb un “iPad” moviments i processos cognitius. En els dos grups es van obtenir resultats que promovien la continuació d’aquestes activitats per a futurs pacients a l’hora de ser utilitzada com a rehabilitació. Un altre estudi anomenat “Prospective clinical study of rehabilitation interventions with multisensory interactive training in patients with celebral infarction: study protocol for a randomised controlled trial”[20], publicat el 2017, que investiga els efectes de l’entrenament multisensorial del patró de caminar i dels membres del tronc superior i inferior del cos. Dos-cents vint-i-quatre pacients que van patir un accident cardiovascular van ser reclutats en un sol centre, alguns es van assignar a fer tasques Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 23 de rehabilitació convencional i els altres a tasques de rehabilitació convencional amb realitat virtual. La conclusió d’aquest projecte va ser que diferents tipus de RV poden augmentar la velocitat de marxa i les funcions de les extremitats superiors i inferiors. També accentua que hi ha vàries directrius clíniques que recomanen que s’iniciï la rehabilitació activa en un període de 24 a 48 hores següents a l’accident cerebrovascular. Altres projectes més propers a la RV semi-immersiva o totalment immersiva també consideren que l’ús de la RV és positiu per a la millora del pacient i per a una extracció de dades qualitativa que posteriorment es pugui analitzar. Alguns d’aquests projectes són: “Are virtual reality technologies effective in improving lower limb outcomes for patients for patients following stroke – a systematic review with metaanalysis”[21] (publicat el 2016), “Effects of virtual reality-based planar motion exercises on upper extremity function, range of motion, and health realted quality of life: a multicenter, single-blinded, randomized, controlled pilot study” [22] (publicat el 2019) i “Virtual activities of Daily Living for Recovery of Upper Extremity Motor Function” [23], publicat el 2018. Aquest últim estudi es basava a fer proves a quinze supervivents d’accidents cerebrovasculars i investigar l’eficàcia d’activitats virtuals de la vida diària i d’accions quotidianes per la futura recuperació de la funció motora de les extremitats superiors, com s’observa a la figura 3.11. També va tenir una associació a millores significatives i clínicament importants en les funcions motores dels individus. Figura 3.11. Exercicis quotidians amb RV [23]. Memòria 24 4. Recursos materials del projecte Per la creació de l’aplicació del projecte s’ha utilitzat un ordinador portàtil HP, un ratolí Logitech de model “M90” i l’entorn de creació d’aplicacions de Unity3D. El model en concret de l’ordinador és el “HP Laptop 15-dw0XXX”, s’executa amb el “Windows 10” i les propietats d’aquest segons el fabricant són: • Processador: Intel(R) Core(TM) i5-8265U CPU @ 1.60gHz 1.80GHz • Memòria instal·lada (RAM): 12,0 GB (11,9 GB utilitzable) • Tipus del sistema: Sistema operatiu de 64 bits, processador x64 • Llapis i entrada tàctil: L’entrada tàctil o manuscrita no està disponible en aquesta pantalla. 4.1. Unity Unity és un motor de videojocs multiplataforma (ordinadors, videoconsoles, mòbils, etc), i va ser creat per l’empresa Unity Technologies[24]. Unity 3D té una comunitat molt gran d’usuaris, i això permet accedir a documentació, fotos i comunitats on es resolen qualsevol dubte o s’expliquen les noves tècniques per aprendre a desenvolupar videojocs[25]. L’empresa va ser fundada l’any 1988, però fins al 2005 no es va llençar al mercat la primera versió de Unity a la Conferència Mundial de Desenvolupadors d’Apple[24]. El 2010 va sortir el “Unity 3”, que es va centrar a introduir i proporcionar més eines per tal d’atraure els millors desenvolupadors, i a la vegada també proporcionava eines per equips més independents i més petits amb paquets més assequibles. Finalment a 2015 es va llençar Unity 5 amb moltes noves aplicacions dissenyades per creadors de jocs amb unes majors expectatives, i l’any 2017 va sortir la primera versió pública de Unity (Unity 2017.1.0.)[24]. Actualment l’equip de Unity continua publicant noves versions amb millores quant al rendiment, per poder treballar millor i de forma més fluida en l’editor de Unity. També van seguir millorant el comportament de les partícules com l’aigua i el foc, per tal de millorar el realisme del joc[24]. La figura següent reflexa el símbol de Unity 3D: Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 25 Figura 4.1. Logo de Unity. (Font: N/A). Unity 3D és una plataforma que permet programar una sèrie de codis que rastreijaran els moviments de l’usuari per obtindre’n uns resultats quantitatius i qualitatius en la recollida de dades, i alhora permet dissenyar un ambient de joc agradable que potenciï la immersió del pacient, que també és vital en el procés. La plataforma de Unity 3D també habilita el disseny de diferents escenes de joc, associades a diferents nivells de joc per exemple, que es convertiran en reptes a batre pel pacient. 4.1.1. La Interfície de Unity La interfície de Unity es basa en finestres. La finestra principal de l’editor es compon de finestres amb pestanyes que es poden ajustar, agrupar o minimitzar. Això significa que l’aspecte de l’editor pot ser diferent entre projectes, es podrà adaptar a mesura que es necessiti depenent de la preferència personal i el tipus de treball[26]. A continuació es mostra un llistat de les finestres anomenades anteriorment, i estan acompanyades d’un petit text que explica la seva funció: • Finestra principal Aquesta finestra, que es mostra en la figura 4.2., és la finestra d’inici de Unity 3D. En ella s’organitzen totes les diferents finestres que componen la plataforma de Unity 3D, que són la finestra de projecte, la vista d’escena, la finestra de l’inspector, la finestra de jerarquia i la barra d’eines[26]. Memòria 26 Figura 4.2. Finestra principal de Unity [26]. • Finestra de Projecte (Project Window): Mostra els Assets disponibles per ser utilitzats, com s’observa en la figura 4.3. A l’importar els arxius al projecte apareixeran aquí[26] i posteriorment s’organitzaran en funció del seu ús. Figura 4.3. Finestra de Projecte de Unity[26]. • Vista d’escena (Scene View): Permet la navegació visual i editar l’escena 2D o 3D, depenent del tipus de projecte en el qual s’estigui treballant[26]. En la finestra de la vista d’escena es mostra l’aspecte de la pantalla de Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 27 joc de l’aplicació, com es mostra a la figura 4.4., ja estigui pausada o s’estigui executant (amb el botó “play” de la barra d’eines). Figura 4.4. Vista d’escena de Unity[26]. • Finestra de Jerarquia (Hierarchy): És una representació de tots els objectes de joc que hi ha a l’escena, es a dir que la finestra d’escena està vinculada amb la finestra de jerarquia, com s’observa en la figura 4.5. Cada element en l’escena té una entrada a la jerarquia i s’organitzen amb una estructura parental, on alguns objectes són fills d’altres[26]. Figura 4.5. Finestra de Jerarquia de Unity[26]. Memòria 34 5.3. Funcionalitats de l’aplicació La funció principal d’aquesta aplicació és fer moviments de recuperació amb el braç fent una activitat de recollida de fruita amb un cistell. Hi ha dos tipus de fruites: els cocos, que són l’objecte que el pacient ha de recollir, i els plàtans, els objectes de joc que el pacient ha d’evitar. El cistell de fruita té com a controlador un ratolí, d’aquesta forma el pacient pot moure el braç, sobre el pla d’una taula, mitjançant diferents moviments que podrien afavorir a la seva rehabilitació. El joc té tres nivells diferents, els quals estan lligats a la velocitat de caiguda de la fruita (a major nivell, la velocitat de caiguda és superior). Al iniciar algun dels tres nivells la fruita apareix en la part superior de l’escena de joc, acompanyada per una “ombra” que està dissenyada per ajudar al jugador a trobar el punt exacte on caurà la fruita. L’ombra inicialment serà de color vermell, però si coincideix amb el diàmetre del cistell (amb un marge d’error) canviarà a color verd, indicant així que el cistell es troba en la zona de recollida de fruita, com es mostra en la figura següent: Figura 5.4. Ombra de la fruita. Un cop la fruita comenci a caure el pacient haurà d’analitzar on caurà l’objecte de joc (amb l’ajuda de l’ombra), assegurar-se que l’objecte que serà recollit és un coco i finalment alinear l’ombra del coco amb el diàmetre del cistell mitjançant moviments del braç sobre la taula. És recomanable fer l’exercici segut en una cadira, recolzant l’esquena al respatller i apropar-se a la taula, d’aquesta forma el braç treballarà en millors condicions. En aquest apartat s’analitzaran els diferents exercicis que el pacient podria dur a terme amb el ratolí en l’aplicació. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 35 5.3.1. Flexió d’espatlla i colze Aquest cas es donarà quan el jugador hagi de recollir la fruita en els punts més distants de la càmera de joc. El pacient haurà d’estirar el braç parcial o totalment per recollir els cocos i arronsar-lo quan els punts de recollida estiguin més pròxims a la càmera de joc. Tenint com a referència el pla de la taula, el moviment serà endavant per acabar estirant totalment o parcialment el colze i endarrere fins a acostar-se la mà al cos, com es pot observar en la figura següent: Figura 5.5. Moviment de flexió d’espatlla i colze [31]. Memòria 36 5.3.2. Rotació Aquests moviments s’accentuaran quan el pacient hagi de recollir la fruita en els punts més distants de l’esquerra i la dreta de l’escena de joc respecte a la càmera. Quan el ratolí s’hagi de moure al punt més llunyà de la dreta es produirà un moviment d’extensió del braç, d’altra banda si el punt més llunyà és a l’esquerra, es produirà un moviment de flexió del braç[32]. Tot això és tenint en compte que l’usuari sigui dretà, si no ho fos, els moviments es produirien a la inversa. El moviment de l’avantbraç i de la mà s’iniciarà des de la línia mitjà fins a l’extrem de la taula o a on arribi el pacient, seguint una línia horitzontal en el pla de la taula, com es pot observar en la figura 5.6. Possiblement en alguns casos també s’hagi de moure la totalitat del braç: quan els objectes apareguin en punts molt distants respectivament. Figura 5.6. Moviment de flexió i moviment extensor del braç [32]. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 37 5.3.3. Desviació radial-cubital del canell Aquest exercici es pot dur a terme movent el ratolí cap a la dreta i cap a l’esquerra, amb l’avantbraç de l’usuari recolzat sobre la taula. El moviment del canell es pot treballar augmentant la sensibilitat de moviment del ratolí, per tal de minimitzar el moviment. Així l’exercici es podrà fer d’una forma més controlada, com es pot observar en la figura següent: Figura 5.7. Moviments del canell (Font: https://www.researchgate.net/figure/Wrist-position-for-US- examination-a-wrist-flexion-b-wrist-neutral-c-wrist_fig1_267903091). Aquest moviment del canell també es poden produir en altres situacions, com per exemple per esquivar ràpidament els plàtans que puguin caure en el cistell per error, o per fer moviments més precisos a prop de la zona de recollida. Memòria 38 5.4. Disseny de la interfície gràfica La interfície gràfica de l’aplicació està dissenyada per facilitar la incorporació del pacient al joc i per registrar les dades obtingudes pertinents. Unity permet dissenyar aquesta UI (“User Interface” en anglès) per crear menús amb una sèrie d’objectes de joc que podran interactuar entre ells o amb el programa[33]. Alguns exemples podrien ser botons, lletres o controls entre d’altres. El “Canvas” és l’objecte de joc que permetrà dissenyar els menús de la UI. Formarà una estructura parental on ell és el pare i tots els altres objectes d’aquell menú de joc seran els fills. D’aquesta manera es podrà relacionar diferents Canvas i també els menús de joc, com s’observa en la figura següent: Figura 5.8. Menús de joc de l’aplicació del Script “PauseMenu”. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 39 Les funcions de pausa i activació (“Resume” i “Pause”) de la figura següent defineixen quan el joc està en marxa i la fruita començarà a caure i quan es pararà la caiguda, ja sigui per tornar als menús d’usuari o per configurar algunes opcions, com també s’observa en la figura 5.9. El següent apartat tracta sobre els diferents menús de joc de l’aplicació del projecte i el seu disseny. També analitza les relacions entre aquests, que corresponen a les prioritats i l’ordre de la interfície gràfica de l’aplicació. Figura 5.9. Funcions de Pausa i Activació del Script “PauseMenu”. Memòria 40 5.4.1. Disseny del menú d’inici de sessió L’escena que s’observa en la figura 5.10 és el menú d’inici de sessió i té la funció de registrar el nom del pacient i posteriorment accedir al menú d’usuari. Això es podrà fer gràcies al GameObject “ImputField”, que permet que el text en pantalla sigui editable. Com els altres controls d’interacció, no és un element UI visible en si i s’ha de combinar amb un o més elements UI visibles per poder ser editats, com per exemple un objecte de text. Figura 5.10. Menú d’inici de sessió. L’escena del menú la figura 5.10 té els següents objectes de joc: - Text COCONUT HUNT : Títol del joc. - Text INTRODUCIR JUGADOR - Botó ACCEDER: Un cop introduïdes les dades serà l’encarregat d’accedir al menú d’usuari un cop fet clic al botó esquerre del ratolí. - Botó SALIR: Aquest botó servirà per tancar l’aplicació. - “ImputField” NOMBRE: Aquest GameObject s’encarregarà de guardar el nom del pacient durant la sessió de joc. Es pot observar la finestra de l’inspector d’aquest objecte en la figura següent. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 41 Figura 5.11. Configuració del “ImputField” de l’aplicació. 5.4.2. Disseny del menú d’usuari El menú d’usuari és on apareix la primera bifurcació en l’estructura de l’aplicació i permetrà al jugador accedir al menú de joc o al menú de progrés, com s’observa a la figura 5.12. En aquest menú també hi haurà un botó per tancar l’aplicació i un altre botó poder canviar d’usuari. També cal destacar que el menú d’usuari serà el menú que la UI retornarà després d’haver acabat qualsevol dels tres nivells de joc, així el mateix jugador podrà analitzar els resultats obtinguts en el menú de progrés. Figura 5.12. Menú d’Usuari. Memòria 42 L’escena del menú té els següents objectes de joc, com s’observa en la figura 5.12: - Text COCONUT HUNT - Botó JUGAR: Al ser clicat obrirà el menú de joc. - Botó CAMBIAR DE USUARIO: Al ser clicat retornarà al menú d’inici de sessió. - Botó PROGRESO: Al ser clicat s’accedirà al menú de progrés - Botó SALIR 5.4.3. Disseny del menú de joc El menú de joc és vital per la correcta comprensió del joc de recollida de fruites i té dues parts, com s’observa en la figura 5.13. En la primera part apareixen dos petits textos d’instruccions que pretenen mostrar l’objectiu del joc, les seves regles i els controls de moviment amb el ratolí i el teclat, amb la finalitat d’ajudar al pacient a la ràpida comprensió del joc. La segona part està composta per tres botons que permeten accedir als 3 nivells diferents de joc, que es diferencien en la velocitat de caiguda de la fuita. Figura 5.13. Menú de Joc. L’escena del menú que s’observa en la figura 5.13 té els següents objectes de joc: - Text INSTRUCCIONES - Text REGLAS Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 43 - Text Regles Detallades: En aquest GameObject es mostren les regles bàsiques del joc i el seu objectiu principal, que són: a) Recollir tants cocos com es pugui amb el cistell de fruita, b) Alinear el cercle vermell amb el cistell per recollir la fruita i c) Esquivar els plàtans. - Imatge RATOLÍ: Està acompanyada per 4 fletxes que indiquen els moviments del ratolí. - Text CONTROLES - Text Controls Detallats: Aquest és el text encarregat de mostrar els controls de moviment i de configuració de l’usuari. - Botó NIVEL 1: Al ser clicat s’accedirà a l‘escena de joc amb un nivell 1 de dificultat. - Botó NIVEL 2: Al ser clicat s’accedirà a l‘escena de joc amb un nivell 2 de dificultat. - Botó NIVEL 3: Al ser clicat s’accedirà a l‘escena de joc amb un nivell 3 de dificultat. - Botó VOLVER: Servirà per tornar al menú d’usuari. En la figura següent es pot observar tres funcions diferents amb els noms de “Level1”, “Level2” i “Level3”. També podem observar que en cada funció hi ha un vector diferent que modificarà la gravetat de la nostra escena de joc, modificant així la velocitat de caiguda. També hi ha un temps de destrucció lligat als cocos, ja hagin sigut recollits o fallits, que els esborrarà de la càmera del joc un cop el temps (“timeDestroy”) s’hagi complert. Figura 5.14. Script per l’elecció dels nivells. Memòria 50 5.5.1. Disseny de l’escena de joc Aquest subapartat es centrarà a comentar en detall el conjunt de codis referents a l’escena de joc. Per entendre millor els següents passos s’observarà la figura següent, que és la vista que s‘obtindrà de la càmera de joc i on es mostraran els cocos i els plàtans: Figura 5.22. Vista de la càmera de l’escena de joc. Els cocos i els plàtans apareixen en un pla paral·lel al pla de la sorra i de forma aleatòria. No apareixen en qualsevol zona de la sorra, sinó que apareixen en un rang predeterminat de 21 punts que estan distribuïts en 5 rectes, repartides a 45º de diferència unes de les altres, per una àrea en forma de semicercle: • Coordenada x dels 21 punts: x = { 0, 0.5f, 1, 1.5f, 2, 0.35f, 0.71f, 1.06f, 1.41f, 0, 0, 0, 0, -0.35f, -0.71f, -1.06f, -1.41f, -0.5f, -1, - 1.5f, -2}; • Coordenada z dels 21 punts: z = { -3, -3, -3, -3, -3, -2.64f, -2.29f, -1.94f, -1.58f, -2.5f, -2, -1.5f, -1, -2.64f, -2.29f, -1.94f, -1.58f, - 3, -3, -3, -3}; Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 51 Concretament, en el semicercle hi ha: 5 punts distribuïts en una recta de 0 graus ( contant el punt d’inici del cistell, que també és un punt de recollida), 4 punts distribuïts per una recta a 45 graus, 4 punts distribuïts per una recta a 90 graus, 4 punts distribuïts per una recta a 135 graus i per últim 4 punts distribuïts per una recta a 180 graus. Un cop el coco (o el plàtan) hagi aparegut en algun dels punts de l’escena l’hi afectarà la gravetat i començarà a caure, es recollirà o no, i després es destruirà en un temps determinat (“timeDestroy”). Un cop el GameObject sigui destruït es crearà un clon del mateix que apareixerà en un altre dels 21 punts (o en el mateix) de forma aleatòria, i així successivament. Com es pot observar en la figura següent, la línia 17 del Script (“StartCoroutine(SpawnObject…) inicia la caiguda de cocos (i els clons), juntament amb la funció “IEnumerator“, que també regula els cocos que s’han de destruir i els seus clons passat un temps (“timeDestroy”). Això es pot observar en la funció “Instantiate” ( línies de codi 34-37) de la figura següent: Figura 5.23. Script que invoca els cocos en un rang aleatori declarat. Memòria 52 Pel que fa al Script que genera els plàtans no hi ha cap diferencia de forma quant a codi, únicament generarà, clonarà i destruirà plàtans en lloc de cocos. Aquest fet es pot observar en la figura 5.24., més concretament en la línia de codi 42: Figura 5.24. Script que invoca els plàtans en un rang aleatori anteriorment declarat. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 53 5.5.2. Comptador El comptador està dissenyat per registrar els punts d’encert i d’errada del pacient durant el procés de l’exercici, és a dir que hi haurà un comptador pels punts d’encert i un altre pels punts d’errada, com s’observa en la figura 5.25. També funcionarà com a indicador de rendiment per a l’usuari en la pantalla de joc i en el menú de progrés, i posteriorment els resultats es registraran en l’extracció de dades. Figura 5.25. Comptador de l’aplicació. Per decidir si l’objecte ha sigut recollit correctament es compararan la posició del cistell amb la posició de l’objecte que s’està recollint. Per aconseguir això s’haurà de declarar com a variables les posicions del cistell, dels cocos o plàtans i a més a més declarar una constant de distància mínima que ens servirà per a una comparació més acurada, com s’observa en les figures 5.26. i 5.27. Un cop declarades, en la funció “Start” s’obtenen contínuament les dades de la “Transform”(coordenades i forma de l’objecte) dels cocos o els plàtans (depenent del Script) i les dades de la posició del cistell. El cistell està lligat a un “tag” (etiqueta) que es pot observar en la figura 5.26., i permet l’obtenció de les coordenades encara que estigui en moviment en tot moment. Figura 5.26. Declaració de variables del Script lligat al coco i funció “Start”. Memòria 54 Figura 5.27. Declaració de variables del Script lligat al plàtan. Per obtenir la relació entre posicions es restarà la posició del cistell (“basket”) amb la posició del coco (o plàtan) i el resultat s’eleva al quadrat (per evitar nombres negatius). Aquest resultat es compararà amb la mínima distància, i si és més petita (en el cas dels cocos) contarà com un encert i sumarà 1 punt als comptadors d’encerts (“counter1”), com s’observa en la figura 5.28 (línia de codi 31). A més a més es reproduirà un so d’encert associat a la variable “Good” i també es sumarà 1 punt al comptador “pointyes[i]” dels punts de caiguda (cada punt té el seu propi comptador). D’altra banda quan no és compleix aquesta condició i la diferència de les posicions sigui superior a la distància mínima en el cas dels cocos es contarà un punt d’errada (“counter2”), es reproduirà l’àudio “Wrong” i també es sumarà 1 punt al comptador “pointno[i]” dels punts de caiguda com s’observa en la figura següent: Figura 5.28. Funció “Update” del Script lligat al coco. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 55 En el cas del Script lligat als plàtans la condició anterior és la mateixa però invertida, com s’observa en la figura 5.29. Si la distància entre les coordenades del cistell i el plàtan és inferior a la constant de distància mínima declarada es contarà un punt d’errada “counter2”: : • if ((basket.position - another.position).sqrMagnitude <= minDistance) { Counter2.counter2++; } També es reproduirà el audio associat a la variable “Wrong” i es sumarà 1 punt al comptador “pointno[i]” dels punts de caiguda. En el cas que la resta de les posicions sigui superior a la distància mínima no es modificarà cap comptador, perquè seria el cas on l’usuari haurà evitat un plàtan, que és un dels objectius de l’aplicació perè no compta com a punt d’encert ni es reprodueix cap mena d’àudio. Aquests detalls també es poden observar en l’arxiu de codi lligat als plàtans de la figura següent: Figura 5.29. Funció “Update” del Script lligat al plàtan. Memòria 56 5.6. Regulació de la sensibilitat de moviment La regulació de la sensibilitat és un procés vital per la correcta utilització de l’aplicació, ja que es podrà adaptar a qualsevol usuari. Inicialment la sensibilitat del moviment del ratolí està més baixa que la que ofereix per defecte, ja que l’objectiu és fer moviments més grans amb el ratolí. Encara i així la sensibilitat inicial del joc està prou alta per no crear una incomoditat a l’usuari, i com que l’aplicació està pensada per jugar amb sensibilitats baixes s’haurà de regular en el menú de configuració, per trobar la sensibilitat optima per a cada individu. Variant la sensibilitat es podran treballar exercicis de rehabilitació diferents, com s’ha comentat anteriorment en l’apartat de funcionalitats de l’aplicació. Per accedir al menú de configuració s’haurà de prémer la tecla ESC per aturar el joc i posteriorment clicar al botó “CONFIGURACIÓN”. En la figura següent es mostra el disseny del menú de configuració: Figura 5.30. Menú de configuració. Com podem observar en la figura anterior, hi ha uns “Sliders” (controls lliscants) i unes marques de nivells que permeten canviar de nivell des del mateix menú de configuració. La funció dels Sliders són dues: el control de volum i el control de la sensibilitat de moviment. En les figures següents es podrà observar el codi que s’ha utilitzat per publicar els diferents controls lliscants en el menú de configuració: el control de sensibilitat en la figura 5.31 i el control del volum en la figura 5.32: Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 57 Figura 5.31. Component “Slider” per adjustar la sensibilitat de moviment del mouse. Figura 5.32. Component Slider per adjustar el volum de joc. Memòria 58 5.7. Extracció de dades La utilitat principal de l’aplicació, a part de fer moviments amb el braç per tal de millorar la mobilitat d’aquest, és obtenir uns resultats en forma de dades que puguin ser analitzades per un/a fisioterapeuta, com el seu rendiment i la seva evolució. Per aconseguir una recollida de dades òptima és recomanable jugar un mínim de 5 minuts a qualsevol dels nivells, ja que s’estima que s’hauran recollit uns 100 objectes de joc i també és útil per assegurar que han caigut objectes en els 21 punts. Per l’extracció de dades s’ha utilitzat un document de text (.txt) que està lligat a un Script de l’aplicació anomenat “DataExport”. Aquest document recull tots els resultats que el pacient hi hagi enregistrat durant el transcurs del joc, dades com: la data i hora de joc, el nivell, el nombre d’encerts, el nombre d’errades i la mitjana d’encerts en cada punt de recollida. Un cop obtingudes algunes dades amb pacients reals es podrà saber la qualitat d’aquestes dades enregistrades per a l’estudi de la seva rehabilitació. Primer de tot s’hi ha de programar una adreça en el Script on s’exportaran les dades, i en aquesta adreça estarà el document de text. Dintre del Script s’ha creat una funció anomenada “SaveData” que utilitzarà les funcions de “StreamWriter” i “WriteLine” per organitzar les diverses dades en línies diferents, enregistrar les dades de totes les sessions de joc i facilitar la comprensió[38]. A continuació es mostra l’esquelet de el Script “DataExport”: void SaveData() { string path ="C:/Users/Desktop/CoconutHunt/ResultadosCoconutHunt.txt"; StreamWriter writer = new StreamWriter(path, true); (…) Writer.Close(); } private void OnApplicationQuit() { SaveData(); } } Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 59 Si analitzem l’esquelet del codi a fons, podem veure que la funció de “SaveData” serà cridada quan es tanqui l’aplicació, i les línies de la llista anomenada “writer” ( generada pel “StreamWriter”) s’organitzaran en línies diferents com s’observa en les dues figures següents: Figura 4.33. Script “DataExport”, obtenció de dades. Figura 4.34. Script “DataExport”, obtenció de la mitjana en cada punt. Memòria 66 Figura 6.5. Respostes tercera pregunta. 4. Has trobat fàcil la mecànica de joc amb el mouse? La conclusió d’aquesta pregunta ha sigut prou positiva, amb més d’un 55% de respostes a l’opció “Fàcil” i un 32% a l’opció “Normal”. Es podria dir que els voluntaris han considerat que el fet de moure el ratolí mantenint el botó esquerra per sobre d’una taula és una tasca relativament senzilla. Tot i que és un tant per cent molt baix (12%) hi ha tres persones que han considerat difícil la jugabilitat: tant podria ser perquè no estan acostumades a jugar en un entorn amb ordinador i ratolí o per l’edat ( no es pot fer una relació directa perquè el test és anònim). Opcions: (1) Fàcil, (2) Normal, (3) Difícil. Figura 6.6. Respostes quarta pregunta. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 67 5. Creus que la velocitat de caiguda de la fruita és massa lenta/ràpida? La resposta a aquesta pregunta ha sigut molt satisfactòria, ja que més del 95% dels vots són a l’opció “Adequada”, com es pot observar en la figura 6.7. La conclusió a aquesta pegunta podria ser que els usuaris han considerat que la velocitat de caiguda de la fruita és adequada per recollirlla abans que impacti contra el pla del terra. Figura 6.7. Respostes cinquena pregunta. Memòria 68 6.2. Anàlisis propostes Com a última pregunta en l’enquesta s’ha demanat si es tenia alguna proposta de millora per a l’aplicació. Això ha sigut útil tant pel transcurs i desenvolupament del projecte (per fer les millores pertinents) i de cara a les possibles línies futures del projecte. Les propostes que han sigut més interessants es mostraran a continuació i es separaran en dos blocs: Millores del projecte i millores per línies futures. • Millores del projecte - “A l’inici del joc no queden clares les normes i crec que s’hauria d’explicar que cal clicar el cistell per poder-lo moure, entre altres aclariments”. - “A l’inici hauria de sortir com es juga”. Gràcies a aquests comentaris es va introduir en el menú de joc de l’aplicació un petit text dedicat a les regles del mateix (esquiva els plàtans, etc.), i un altre text dedicat als controls del ratolí i del teclat. -“ Posar les fletxes de direcció a l’explicació”. - “No he entès la profunditat a l’inici del joc”. Diverses persones que han provat l’aplicació no han entès la profunditat de l’escena de joc a la primera a l’inici del joc, pensant-se que només caldria fer moviments a la dreta i a l’esquerra. A causa d’aquest fet en el menú de joc es van posar unes fletxes de direcció, indicant els moviments pertinents. -“Potser quedaria més clara la mecànica del cursor amb algun gràfic animat”. Aquest comentari va desencadenar en la introducció d’una imatge d’un ratolí, amb les fletxes de direcció que l’envolten. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 69 • Millores per línies futures - “El joc et dóna un petit marge per arrossegar el cistell fins a la zona següent quan la fuita ja ha caigut. Jo donaria l’opció de treure aquest marge i puntuar només si el barril arriba a temps per capturar la fruita”. - “Es podrien posar uns primers segons de prova (compte enrere) abans que comenci el joc”. - “Els primers segons, desactivar la caiguda de plàtans per evitar que l’usuari falli directament”. - “Al final del joc, seria motivador donar un feedback al pacient del resultat més bo que hagi aconseguit en el seu intent. El so de fons pot ser opcional segons el pacient, ja que pot distreure’l (afegeix dificultat) . Bon treball :)!”. - “Afegir més fruites”. - “Algun grau més de dificultat”. -“Crec que estaria bé que a part del % d'encerts a cada punt de recollida aparegués també el nombre exacte de cocos que han caigut en aquest punt”. Memòria 70 6.3. Anàlisis resultats Durant les últimes proves a voluntaris sans es van fer tres extraccions de dades, per un posterior anàlisi. De cara a la interpretació dels resultats cal anotar que si no ha caigut cap objecte a algun punt de recollida concret, aquest serà interpretat com un 0% d’encerts, com s’observa en la figura següent, que mostra els resultats obtinguts d’una prova ràpida de vint segons: Figura 6.8. Prova de 20 segons. Aquesta dada de 0% no és una dada de qualitat per poder ser analitzada, per tant la duració de les proves ha de ser superior. Per això es van fer tres proves: una de dos minuts, una de cinc minuts i una última de 10 minuts. Per la prova de dos minuts es va escollir el nivell 2 de dificultat, es van fer 30 encerts i 7 errades. Per l’anàlisi dels resultats obtinguts es pot analitzar la figura 6.8., que és el fitxer de text que es va obtenir de la prova, i la taula 6.9, que analitza el tant per cent d’errades que s’ha comès durant la prova. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 71 Figura 6.9. Prova 2 minuts. Taula 6.10. Taula de resultats - Prova 2 minuts. Com es pot observar en la taula anterior hi ha molts valors polaritzats, ès a dir, moltes de les dades obtingudes són 100% o 0%. Aquest fet continua desencadenant en què les dades obtingudes no siguin òptimes per una posterior anàlisi, per tant la duració de la prova ha de ser superior. Memòria 72 Donat aquest fet es va fer una prova de cinc minuts a un altre voluntari. Es va jugar en el nivell 3 i es va fer un total de 98 encerts i 12 errades, com s’observa en la figura 6.11. La taula 6.12 mostra els resultats obtinguts d’aquesta prova de dos minuts. Figura 6.11. Prova de 5 minuts. Taula 6.12. Taula de resultats - Prova de 5 minuts. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 73 La prova de cinc minuts va donar resultats molt satisfactoris, ja que es van recollir dades lligades a més de 100 objectes de joc. Aquest fet incrementa molt la possibilitat que en cadascun dels 21 punts de recollida hagi caigut com a mínim 1 objecte, i també assegura que les dades dels resultats siguin de millor qualitat. Les pitjors marques del jugador són en dos dels punts de recollida més llunyans de les rectes, més concretament el punt 20 i el punt 12. De totes maneres es va decidir fer una tercera prova de 10 minuts, per poder comparar-les. Les dues figures següents mostren el document de text de l’exportació de dades i la taula de resultats associada: Figura 6.13. Prova de 10 minuts. Memòria 74 Taula 6.14. Taula de resultats - Prova de 10 minuts. En la prova de 10 minuts es va obtenir un total de 193 encerts i 26 errades en el nivell de joc intermedi. Si s’analitza la taula 6.14. s’observa que a la prova de 10 minuts s’han obtingut millors resultats que en la prova de 5 minuts, ja que hi ha més dades de qualitat a poder analitzar (més de 200 objectes de joc recol·lectats). Les dues pitjors marques del jugador van ser en el punt 8 i el punt 20, que són la punta de la seva respectiva de recta. També es pot observar un seguit de punts on l’usuari ha aconseguit gairebé una puntuació de 100%, però degut a la duració de la prova va acabar cometent errors en punts intermedis, aparentment controlats per un individuo sa. Com a conclusió final podem dir que un pacient haurà de jugar a l’aplicació entre 5 minuts i 10 minuts, i contra més a prop dels 10 minuts millor a l’hora de l’obtenció dels resultats. Cal esmentar que jugar més de 10 minuts a l’aplicació no és agradable per tothom. També cal comentar que és molt important disposar d’espai suficient a la taula on es desplaçarà el ratolí, i ajustar la sensibilitat depenent de l’estat de les funcions motores de les extremitats superiors de l’usuari. Si es complexen aquestes condicions, s’obtindran dades qualitatives per la posterior anàlisi d’un professional mèdic, que estigui assignat a un pacient que utilitzi aquesta aplicació, anomenada “CoconutHunt”, com a rehabilitació. . Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 75 Conclusions Aquest projecte es va iniciar amb la finalitat de proposar alternatives als tractaments convencionals de rehabilitació per als individus que hagin sofert un ictus. Malauradament, a conseqüència de la situació actual el treball ha passat per un procés d’adaptació en el qual s’ha redirigit el projecte diverses vegades i finalment s’ha convertit en el que és ara, una aplicació de recollida de fruita on el pacient executa exercicis amb el braç afectat, per tal de recollir-les. Posteriorment s’exporta un document de text amb les dades obtingudes amb la intenció de ser estudiades per un fisioterapeuta que pugui analitzar el seu progrés. L'aplicació encara està en fase de creixement i es poden explorar altres funcionalitats diferents de cara a altres projectes similars a aquest. No obstant també s’han assolit objectius com: • La correcta implementació dels exercicis de rehabilitació en l’aplicació de recollida de fruita del projecte, mesclant la tecnologia i les tècniques convencionals de la rehabilitació, amb l’objectiu de recuperar parcialment o totalment el moviment del braç de l’usuari. Es pot dur a terme dos o tres exercicis de rehabilitació, a treballar amb el ratolí i les configuracions de sensibilitat de moviment associades, durant cada sessió de joc. • Creació de tres nivells de joc variant la velocitat de caiguda de la fuita per potenciar l’evolució dels reflexos del pacient. Aquests nivells actuen a través de vectors de gravetat diferents per poder ajustar-se a les necessitats diferents de cada usuari. • Disseny i implementació de l’objecte que s’ha de recollir (els cocos) i implementació de l’objecte ”bomba” (els plàtans) que el jugador haurà d’evitar. Apareixeran en la pantalla de joc en un rang aleatori de 21 punts, distribuïts en cinc rectes repartides per una àrea en forma de semicercle. • Creació de comptadors que administraran els punts d’encert i els punts d’errada que haurà comès el jugador, que són les dades que s’obtindran en l’extracció de dades després d’una sessió de joc. Aquestes dades s’extrauran en un fitxer de text amb la possibilitat d’enregistrar totes les sessions de joc de l’usuari. • Proves i enquestes de satisfacció a voluntaris per poder millorar l’aplicació en el transcurs del projecte. Aquestes han fixat la duració òptima de les sessions de joc, que serà de 5 a 10 minuts, i també han servit per analitzar els errors més comuns dels voluntaris sans en recollir la fruita. A més a més han servit per analitzar futurs estudis i per potenciar l’èmfasi de la profunditat en els menús de joc. • Dissenyar un ambient de joc agradable a través de “Assets” gratuïts de la “UnityStore”. Analitzat per l’enquesta de satisfacció dels voluntaris sans. Memòria 82 • Costos del Software Les despeses de software han sigut nul·les. És veritat que no totes les llicències de Unity 3D són gratuïtes, però en aquest projecte s’ha utilitzat la llicència “Unity Personal”, que permet als usuaris, amb ingressos no superiors o iguals a 100.000, utilitzar Unity 3D a cost zero. Com que no s’ha utilitzat cap tipus de software més en el transcurs del projecte, es pot declarar que les despeses són de 0 €. • Costos del Personal Els costos de personal són el total d’hores invertides en la duració del treball. Aquest treball de fi de grau representen 24 ECTS, per tant si es realitzen 25 hores de treball, per cada 1 ECTS el total d’hores invertides serà el producte entre els dos factors anteriorment esmentats. La taula següent ho reflexa: TREBALLADORS Cost per hora (€) Hores Invertides (h) Cost total (€) 1 30 600 18,000 Taula 10.2. Despeses del personal. • Costos del consum elèctric Pels càlculs del consum elèctric s’ha estimat que el preu mitjà del kWh a Espanya ronda els 0,1443 €/kWh [44]. La majoria d’hores d’aquest projecte s’han dut a terme amb l’ordinador i els seus components, així que es podria estimar un total de 500 h invertides. La taula següent ho reflexa: Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 83 Producte Consum (W) Hores (h) Cost (€) Ordinador Portàtil (Intel Core i5) 200 500 14,43 Ratolí 3 500 0,21 Total 203 - 14,64 Taula 10.3. Despeses del consum elèctric. • Despeses totals Un cop estudiats els diferents blocs de l’anàlisi econòmica, se sumen totes les despeses del projecte i s’arriba a la conclusió que els costos totals del projecte són de 18.106,29 €. La taula següent ho reflexa: Costos Cost total (€) Hardware 91,65 Software 0 Personal 18.000 Consum elèctric 14,64 TOTAL 18.106,29 Taula 10.4. Despeses totals. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 85 Bibliografia [1] ADFO. Associació Diversitat Funcional d’Osona [En línia]. Disponible a: <https://www.adfo.cat/>. [Accés: 10-02-2020]. [2] Walkosz-Migliacio, L. Unity 2018 UI Fundamentals – Project Overview. A: Unity Learn [En línia]. Disponible a: <https://learn.unity.com/tutorial/unity-2018-ui-fundamentals-project- overview?language=en&projectId=5d0a1f46edbc2a00204e78e9#>. [Accés: 21-04-2020]. [3] Scripting para principiantes. A: Unity Learn [En línia]. Disponible a: <https://learn.unity.com/project/scripting-para-principiantes?language=es>. [Accés: 23-04- 2020]. [4] Everything about 3D technologies. A: 3D TECHNOLOGIES [En línea]. Disponible a: <http://www.3ddienas.lv/archives/3d-games/>. [Accés: 22-02-2020]. [5] What is Virtual Reality?. A: Virtual Reality Society [En línea]. Disponible a: <https://www.vrs.org.uk/virtual-reality/what-is-virtual-reality.html>. [Accés: 25-03-2020] [6] Virtual Reality in Healthcare. A: Virtual Reality Society [En línea]. Disponible a: <https://www.vrs.org.uk/virtual-reality-healthcare/>. [Accés: 25-03-2020]. [7] Virtual Reality in Construction. A: Virtual Reality Society [En línea]. Disponible a: <https://www.vrs.org.uk/virtual-reality-applications/construction.html>. [Accés: 25-03- 2020]. [8] Virtual Reality in Military. A: Virtual Reality Society [En línea]. Disponible a: <https://www.vrs.org.uk/virtual-reality-military/>. [Accés: 25-03-2020]. [9] Virtual Reality in Entertainment. A: Virtual Reality Society [En línea]. Disponible a: <https://www.vrs.org.uk/virtual-reality-applications/entertainment.html>. [Accés: 25-03- 2020]. [10] Virtual Reality in Education. A: Virtual Reality Society [En línea]. Disponible a: <https://www.vrs.org.uk/virtual-reality-education/>. [Accés: 25-03-2020]. [11] Dr. Lozano, J.V. ¿Qué es un ictus?. A: RTHMI [En línea]. Disponible a: <https://rithmi.com/que-es-un-ictus/>. [Accés: 05-04-2020]. Memòria 86 [12] Ictus. A: Cuidateplus [En línea]. Disponibe a: <https://cuidateplus.marca.com/enfermedades/neurologicas/ictus.html>. [Accés: 06-04- 2020]. [13] El ictus es la primera causa de mortalidad en mujeres y la segunda en hombres en España. A: Quirónsalud [En línea]. Disponible a: <https://www.quironsalud.es/ictusmadrid/es/noticias/ictus-primera-causa-mortalidad-mujeres-segunda-hombres-espa>. [Accés: 06-04-2020]. [14] Consecuencias derivadas de ictus. A: Grupocasaverde [En línea]. Disponible a: <https://www.grupocasaverde.com/2018/12/26/consecuencias-derivadas-ictus/>. [Accés: 08-04-2020]. [15] Los aspectos de la rehabilitación. A: Federación Española del Ictus [En línea]. Disponible a: <https://ictusfederacion.es/infoictus/rehabilitacion/>. [Accés: 08-04-2020]. [16] SU Yuexiang. The application of 3D technology in video games. A: IOP ebooks [En línea]. Disponible a: <https://iopscience.iop.org/article/10.1088/1742-6596/1087/6/062024/pdf>. [Accés: 02-05-2020]. [17] Types of VR system. [En línea]. Disponible a: <http://www.agocg.ac.uk/reports/virtual/37/chapter2.htm>. [Accés: 18-05-2020]. [18] Lohse, K., Shizard, N., Verster, A., Hodges, N., & Van der Loos, H. M. Video Games and Rehabilitation: Using Design Principles to Enhance Engagement in Physical Therapy. A: Journal of Neurologic Physical Therapy. 37(4), 166-175. [En línea]. Disponible a: <https://journals.lww.com/jnpt/fulltext/2013/12000/Video_Games_and_Rehabilitation___U sing_Design.4.aspx>. [Accés: 05-05-2020]. [19] Sheehy et al. “Home-based virtual reality training after discharge from hospital-based stroke rehabilitation: a parallel randomized feasibility trial. Trials. Vol. 20, no 333. 2019. [20] Lo et al. “Prospective clinical study of rehabilitation interventions with multisensory interactive training in patients with cerebral infarction: study protocol for a randomised controlled trial”. Trials, vol. 18, no 173, 2017. [21] E.M. Gibbons, A.N. Thomson, N.M De, et al., “Are virtual reality technologies effective in improving lower limb outcomes for patients following stroke - a systematic review with meta-analysis”. Top Stroke Rehabil., vol. 23, no 6, pp. 1–18, 2016. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 87 [22] M. Park, M-H. Ko, S.-W. Oh, J.-Y. Lee, Y. Ham, H. Yi, Y. Choi, D. Ha and J.-H Shin, “Effects of virtual reality-based planar motion exercises on upper extremity function, range of motion, and healthrelated quality of life: a multicenter, singleblinded, randomized, controlled pilot study”. Journal of NeuroEngineering and Rehabilitation vol. 16, no 122. 2019. [23] R. J. Adams, M.D. Lichter, A. Ellington, M. White, K. Armsted, J.T. Patrie and P.T. Diamond, “Virtual Activities of Daily Living for Recovery of Upper Extremity Motor Function”. IEEE TRANSACTIONS ON NEURAL SYSTEMS AND REHABILITATION ENGINEERING,, vol 26, no.1, pp. 252-260, 2018. [24] Unity(motor de videojuego). A: Viquipèdia [En línea]. Disponible a: <https://es.wikipedia.org/wiki/Unity_(motor_de_videojuego)>. [Accés: 19-04-2020]. [25] Qué es Unity y para qué sirve. A: Master.D [En línea]. Disponible a: <https://www.masterd.es/blog/que-es-unity-3d-tutorial/>. [Accés: 19-04-2020]. [26] Interfície de Unity. A: Unity [En línea]. Disponible a: <https://docs.unity3d.com/es/530/Manual/LearningtheInterface.html>. [Accés: 20-04- 2020]. [27] Programación orientada a objetos. A: Viquipèdia [En línea]. Disponible a: <https://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos>. [Accés: 22-04- 2020]. [28] Intoducción al lenguage C# Y .NET Framework. A: Microsoft Docs [En línea]. Disponible a: <https://docs.microsoft.com/es-es/dotnet/csharp/getting-started/introduction-to-the- csharp-language-and-the-net-framework>. [Accés: 22-04-2020]. [29] Manual de Unity. A: Unity [En línea]. Disponible a: <https://docs.unity3d.com/es/530/Manual/UnityManual.html>. [Accés: 18-05-2020]. [30] Requisitos de Unity. A: Viquipèdia [En línea]. Disponible a: <https://wiki.cifprodolfoucha.es/index.php?title=UNITY_Requisitos_previos#:~:text=Sistema %20operativo%3A%20Windows%20XP%20SP2%2B,7.0%20o%20una%20versi%C3%B3n%20s uperior.>. [Accés: 21-05-2020]. [31] Anatomy of a Kick. A: National Institute of Arthritis ans Musculoskeletal and Skin Dosorders [En línea]. Disponible a: <https://science.education.nih.gov/supplements/webversions/lookingGood/guide/lesson3b. html>. [Accés: 12-05-2020]. Memòria 88 32] Winslow, V. L. Classic Human Anatomy: The Artist’s Guide to From, Function, and Movement. A: Watson-Guptill Publications (2009) [En línea]. Disponible a: <https://doctorlib.info/anatomy/classic-human-anatomy-motion/3.html>. [Accés: 11-05- 2020]. [33] Kinney J. Unity C# Scripting Fundamentals. A: Unity Learn [En línea]. Disponible a: <https://learn.unity.com/project/unity-c-scripting-fundamentals>. [Accés: 21-01-2020]. [34] WorldSkies Free. A: Unity Asset Store [En línea]. Disponible a: <https://assetstore.unity.com/packages/2d/textures-materials/sky/worldskies-free-86517>. [Accés: 13-05-2020]. [35] Cartoon Palmtree and Umbrellas. A: Unity Asset Store [En línea]. Disponible a: <https://assetstore.unity.com/packages/3d/vegetation/cartoon-palmtree-and-umbrellas- 58457>. [Accés: 12-05-2020]. [36] Fruit Pack. A: Unity Asset Store [En línea]. Disponible a: <https://assetstore.unity.com/packages/3d/props/food/fruit-pack-80254>. [Accés: 18-04- 2020]. [37] Japanese Zen Garden Pack. A: Unity Asset Store [En línea]. Disponible a: <https://assetstore.unity.com/packages/3d/props/japanese-zen-garden-pack- 69167?q=palm%20tree&orderBy=1>. [Accés: 18-06-2020]. [38] How do i read and write data from a text file?. A: Unity Support [En línea]. Disponible a: <https://support.unity3d.com/hc/en-us/articles/115000341143-How-do-I-read-and-write- data-from-a-text-file->. [Accés: 18-08-2020]. [39] Uso del ordenador portátil vs ordenador sobremesa. A: Ecorresponsabilidad [En línea]. Disponible a: <http://www.ecorresponsabilidad.es/fichas/portatil.htm>. [Accés: 14-07-2020]. [40] Un ordenador portátil consume la mitad que uno de sobremesa?. A: Endesa [En línea]. Disponible a: <https://www.endesa.com/es/conoce-la-energia/blog/consejo/consumoordenador-portatil-sobremesa#>. [Accés: 13-07-2020]. [41] El impacto de la basura electrónica es un enorme problema ambiental. A: Donalo [En línea]. Disponible a: <https://blog.donalo.org/2018/11/27/el-impacto-de-la-basura-electronica-es- un-enorme-problema-ambiental/>. [Accés: 14-07-2020]. [42] ¿Qué son los RAEE?: definición de los RAEE. A: Fundación ECOLEC [En línea]. Disponible a: <https://www.ecolec.es/informacion-y-recursos/sobre-los-raee/>. [Accés: 13-07-2020]. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 89 [43] Mac E. Fórmulas de contabilidad básica: ¿cómo calcular la depreciación de una computadora?. [En línea]. Disponible a: <https://www.cuidatudinero.com/13074026/comocalcular-la-amortizacion-de-una-computadora-portatil>. [Accés: 02-08-2020]. [44] ¿Qué consumo nos supone utilizar el ordenador?. [En línea]. Disponible a: <https://www.cuidatudinero.com/13074026/como-calcular-la-amortizacion-de-una- computadora-portatil>. [Accés: 03-08-2020]. [45] Andrino, A., “Disseny d’una aplicació de realitat virtual amb neuroautoregulació per a la detecció precoç de l’Alzheimer”. no. Juny 2019. [46] Galusi M.A. i Ortiga D., “Development of a Virtual Reality application as a tool for prevention of Alzheimer disease”. no. Gener 2019. [47] Gimeno D. i Gonzàlez I., “Desenvolupament d’aplicacions de realitat virtual per entrenament de les extremitats superiors”. no. Gener 2019. [48] Daniela L. i Fabregat M., “Aplicación de Realidad Virtual para la rehabilitación”. no. Gener 2019. Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 91 Annex : Codis Levels using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Levels : MonoBehaviour { public static int level = 1; void Start() { } //Definim la dificultat dels diferents nivells de joc a traves de la gravetat(velocitat de caiguda) //i el temps de destrucció de els GameObjects. public void Level1() { level = 1; Physics.gravity = new Vector3(0, -0.5F, 0); InvokeApples.timeDestroy = 4; InvokeAnother.Nivel= 1; } public void Level2() { level = 2; Physics.gravity = new Vector3(0, -1.0F, 0); InvokeApples.timeDestroy = 3; InvokeAnother.Nivel = 2; } public void Level3() { level = 3; Physics.gravity = new Vector3(0, -1.5F, 0); InvokeApples.timeDestroy = 3; InvokeAnother.Nivel = 3; } } Annexos 98 InvokeAnother using System.Collections; using System.Collections.Generic; using UnityEngine; public class InvokeAnother : MonoBehaviour { public GameObject Another; public GameObject ObjectA; public GameObject ObjectB; public GameObject ObjectC; public GameObject Shadow; public static int Nivel = 1; public static int timeDestroy = 5; public static float[] x = { 0, 0.5f, 1, 1.5f, 2, 0.35f, 0.71f, 1.06f, 1.41f, 0, 0, 0, 0, -0.35f, -0.71f, -1.06f, -1.41f, -0.5f, -1, -1.5f, -2 }; public static float[] z = { -3, -3, -3, -3, -3, -2.64f, -2.29f, -1.94f, -1.58f, -2.5f, -2, -1.5f, -1, -2.64f, -2.29f, -1.94f, -1.58f, -3, -3, -3, -3 }; void Start() { //InvokeRepeating("SpawnObject", 0, 4); //Invoke("SpawnObject",0); StartCoroutine(SpawnObject(timeDestroy)); Physics.gravity = new Vector3(0, -1.0F, 0); } //La funció genera aleatoriament els objectes errants un un rang determinat, definit per les dues variables float declarades al principi del script //Progressivament crea clons de objectes i els destrueix un cop acabada la seva acció de joc. IEnumerator SpawnObject(int time) { yield return new WaitForSecondsRealtime(1); while (true) { if (!PauseMenu.GameIsPaused) { //float x = Random.Range(-2.0f, 2.0f); //float z = Random.Range(-3.0f, -1.0f); int i = Random.Range(0, 20); //int i = 12; Instantiate(Another, new Vector3(x[i], 4, z[i]), Quaternion.identity); GameObject clon = Instantiate(Shadow, new Vector3(x[i], 1, z[i]), Quaternion.identity) as GameObject; Destroy(clon, timeDestroy); yield return new WaitForSecondsRealtime(timeDestroy); } else Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 99 { yield return new WaitForSecondsRealtime(time); StopCoroutine(SpawnObject(timeDestroy)); } } } } Annexos 100 InvokeApples using System.Collections; using System.Collections.Generic; using UnityEngine; public class InvokeApples : MonoBehaviour { public GameObject Apple; public GameObject Shadow; public static int timeDestroy=5; public static float[] x = { 0, 0.5f, 1, 1.5f, 2, 0.35f, 0.71f, 1.06f, 1.41f, 0, 0, 0, 0, -0.35f, -0.71f, -1.06f, -1.41f, -0.5f, -1, -1.5f, -2}; public static float[] z = { -3, -3, -3, -3, -3, -2.64f, -2.29f, -1.94f, -1.58f, -2.5f, -2, -1.5f, -1, -2.64f, -2.29f, -1.94f, -1.58f, - 3, -3, -3, -3}; void Start() { //InvokeRepeating("SpawnObject", 0, 4); //Invoke("SpawnObject",0); StartCoroutine(SpawnObject(timeDestroy)); Physics.gravity = new Vector3(0, -1.0F, 0); } //La funció genera aleatoriament els cocos un un rang determinat, definit per les dues variables float declarades al principi del script //Progressivament crea clons de cocos i els destrueix un cop acabada la seva acció de joc. IEnumerator SpawnObject(int time) { yield return new WaitForSecondsRealtime(1); while (true) { if (!PauseMenu.GameIsPaused) { //float x = Random.Range(-2.0f, 2.0f); //float z = Random.Range(-3.0f, -1.0f); int i = Random.Range(0, 20); //int i = 12; Instantiate(Apple, new Vector3(x[i], 4, z[i]), Quaternion.identity); GameObject clon = Instantiate(Shadow, new Vector3(x[i], 1, z[i]), Quaternion.identity) as GameObject; Destroy(clon, timeDestroy); yield return new WaitForSecondsRealtime(timeDestroy); } else { yield return new WaitForSecondsRealtime(time); } } } } Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 101 Hover using System.Collections; using System.Collections.Generic; using UnityEngine; public class Hover : MonoBehaviour { public GameObject panel; // Start is called before the first frame update void Start() { } // Update is called once per frame public void onHover() { panel.SetActive(true); } public void OnMouseExit() { panel.SetActive(false); } } Annexos 102 PointsManager using System.Collections; using System.Collections.Generic; using UnityEngine; public class PointsManager : MonoBehaviour { public static float[] pointyes = new float[21]; public static float[] pointno = new float[21]; public static float[] point = new float[21]; // Amb aquest script regularem els punts d'encert i d'errada en la recollida de GameObjects // També obtindrem la mitjana en cada punt void Update() { for(int i = 0; i < 21; i++) { float total = pointyes[i] + pointno[i]; if (total == 0) { point[i] = 0; } else { point[i] = (pointyes[i] / total) * 100; point[i] = Mathf.Round(point[i]); } } } } Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 103 Point0 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point0 : MonoBehaviour { private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = PointsManager.point[0].ToString() + "%"; } } Point1 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point1 : MonoBehaviour { private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = PointsManager.point[1].ToString() + "%"; } } Point2 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point2 : MonoBehaviour { Annexos 104 private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = PointsManager.point[2].ToString() + "%"; } } Point3 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point3 : MonoBehaviour { private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = PointsManager.point[3].ToString() + "%"; } } Point4 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point4 : MonoBehaviour { private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 105 { textMesh.text = PointsManager.point[4].ToString() + "%"; } } Point5 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point5 : MonoBehaviour { private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = PointsManager.point[5].ToString() + "%"; } } Point6 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point6 : MonoBehaviour { private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = PointsManager.point[6].ToString() + "%"; } } Annexos 106 Point7 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point7 : MonoBehaviour { private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = PointsManager.point[7].ToString() + "%"; } } Point8 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point8 : MonoBehaviour { private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = PointsManager.point[8].ToString() + "%"; } } Point9 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point9 : MonoBehaviour { Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 107 private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = PointsManager.point[9].ToString() + "%"; } } Point10 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point10 : MonoBehaviour { private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = PointsManager.point[10].ToString() + "%"; } } Point11 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Point11 : MonoBehaviour { private TextMeshProUGUI textMesh; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() Annexos 114 } } StartMenu using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class StartMenu : MonoBehaviour { /** public InputField id; public Button submitButton; **/ // Start is called before the first frame update void Start() { Time.timeScale = 0f; PauseMenu.GameIsPaused = true; } Exit using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Exit : MonoBehaviour { private Button ExitButton; // Start is called before the first frame update void Start() { ExitButton = GetComponent<Button>(); ExitButton.onClick.AddListener(QuitGame); } void QuitGame() { Application.Quit(); } } Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 115 Counter1 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Counter1 : MonoBehaviour { private TextMeshProUGUI textMesh; public static int counter1 = 0; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = counter1.ToString(); } } Counter2 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class Counter2 : MonoBehaviour { private TextMeshProUGUI textMesh; public static int counter2 = 0; // Start is called before the first frame update void Start() { textMesh = GetComponent<TextMeshProUGUI>(); } // Update is called once per frame void Update() { textMesh.text = counter2.ToString(); } } Annexos 116 DataExport using System; using System.IO; using TMPro; using UnityEditor; using UnityEngine; using UnityEngine.UI; public class DataExport : MonoBehaviour { private TextMeshProUGUI textMesh; void SaveData() { string path = "C:/Users/34679/Desktop/CoconutHunt/ResultadosCoconutHunt.txt"; StreamWriter writer = new StreamWriter(path, true); writer.WriteLine(DateTime.Now); writer.WriteLine("Nivel" + "= " + Levels.level); writer.WriteLine("Aciertos" + "= " + Counter1.counter1); writer.WriteLine("Fallos" + "= " + Counter2.counter2); writer.WriteLine("MediaPunto0" + "= " + PointsManager.point[0] + "%" + " a 0º"); writer.WriteLine("MediaPunto1" + "= " + PointsManager.point[1] + "%" + " a 0º"); writer.WriteLine("MediaPunto2" + "= " + PointsManager.point[2] + "%" + " a 0º"); writer.WriteLine("MediaPunto3" + "= " + PointsManager.point[3] + "%" + " a 0º"); writer.WriteLine("MediaPunto4" + "= " + PointsManager.point[4] + "%" + " a 0º"); writer.WriteLine("MediaPunto5" + "= " + PointsManager.point[5] + "%" + " a 45º"); writer.WriteLine("MediaPunto6" + "= " + PointsManager.point[6] + "%" + " a 45º"); writer.WriteLine("MediaPunto7" + "= " + PointsManager.point[7] + "%" + " a 45º"); writer.WriteLine("MediaPunto8" + "= " + PointsManager.point[8] + "%" + " a 45º"); writer.WriteLine("MediaPunto9" + "= " + PointsManager.point[9] + "%" + " a 90º"); writer.WriteLine("MediaPunto10" + "= " + PointsManager.point[10] + "%" + " a 90º"); writer.WriteLine("MediaPunto11" + "= " + PointsManager.point[11] + "%" + " a 90º"); writer.WriteLine("MediaPunto12" + "= " + PointsManager.point[12] + "%" + " a 90º"); writer.WriteLine("MediaPunto13" + "= " + PointsManager.point[13] + "%" + " a 135º"); writer.WriteLine("MediaPunto14" + "= " + PointsManager.point[14] + "%" + " a 135º"); Implementació de l’entorn Unity a la rehabilitació amb una aplicació 3D 117 writer.WriteLine("MediaPunto15" + "= " + PointsManager.point[15] + "%" + " a 135º"); writer.WriteLine("MediaPunto16" + "= " + PointsManager.point[16] + "%" + " a 135º"); writer.WriteLine("MediaPunto17" + "= " + PointsManager.point[17] + "%" + " a 180º"); writer.WriteLine("MediaPunto18" + "= " + PointsManager.point[18] + "%" + " a 180º"); writer.WriteLine("MediaPunto19" + "= " + PointsManager.point[19] + "%" + " a 180º"); writer.WriteLine("MediaPunto20" + "= " + PointsManager.point[20] + "%" + " a 180º"); writer.WriteLine("---------------------------------------------------------- -----------------------------------------"); writer.Close(); private void OnApplicationQuit() { SaveData(); } }