Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Celular: 70104301
Correo: amilkar.massy@ucb.edu.bo
La Paz - Bolivia
Agosto, 2020
DEDICATORIA
A mi profesor tutor, M. Sc. Diego César Calderón Iturricha por su calidad humana y apoyo
constante a lo largo de este trabajo. A mi profesor relator, Ing. Freddy Fernando Ferrufino
Gutierrez por su guı́a y apoyo en la toma de decisiones del proyecto.
Al M. Sc. Rodrigo Botelho, M. Sc. Elizabeth Pommier, M. Sc. Fabio Diaz, Ing. Jhon Ordoñez
e Ing. Guillermo Sahonero por su tutela y apoyo en los respectivos momentos a lo largo de
mi carrera.
A mis amigos Mateo Barriga, Andres Guaman, Ramiro Valdez, Néstor Chura, Pablo Omonte,
Fernanda Campos, Andres Mejı́a, Marcos La Serna y Olber Guzmán por los ánimos y por
compartir esta etapa de mi vida.
iv
Resumen
Palabras clave: Realidad virtual, Unity 3D, Android, Grafos, Kit de desarrollo de
software (SDK) y Reconstrucción virtual.
Abstract
The COVID-19 has globally and instantaneously changed the way in which education is delivered,
since both schools and universities have had to migrate the educational system to a virtual space
with e-learning techniques, the Bolivian Catholic University “San Pablo” was not the exception and
it has been forced to close its laboratories and workshops, so the objective of this project was to
implement a laboratory oriented to training with virtual reality for the subject of PNEUMATICS
AND HYDRAULICS (IMT-241), which allow students to gain practical and theoretical knowled-
ge from a real laboratory. The project has focused on the analysis and simulation of pneumatic
components of the MICRO series existing in the UCB laboratory, with which the first laboratory
practices in the subject are carried out and has been validated by the expert teacher in the area. The
prototype has been implemented based on graph theory with the GoogleVR SDK and the Unity
3D development engine for the Android platform that is common among mechatronics engineering
students and that allows a correct virtual reality immersion together with an HMD of Slide-on type.
Keywords: Virtual reality, Unity 3D, Android, Graphs, Software Development Kit
(SDK) and Virtual Reconstruction.
1. Marco Referencial 1
1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Planteamiento del Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1. Definición del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.1. Objetivo General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.2. Objetivos especı́ficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4. Justificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5. Lı́mites y Alcances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5.1. Lı́mites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5.2. Alcances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Marco Teórico 6
2.1. Estado del Arte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.1. Generalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.2. Cascos de realidad virtual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1.3. Motor de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.4. Discusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2. Fundamentos Teóricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.1. Entrenamiento y capacitación con realidad virtual . . . . . . . . . . . . . . . 20
2.2.2. Fundamentos del HDM slide-on . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.3. Grafos y resolución de algoritmos de grafos . . . . . . . . . . . . . . . . . . . 29
2.2.4. Metodo de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.2.5. Scripting, métodos y fundamentos: Unity . . . . . . . . . . . . . . . . . . . . 34
2.2.6. Modelado para realidad virtual . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3. Marco Práctico 41
3.1. Esquema general del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2. Planeación y requerimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.1. Detección de elementos para el desarrollo . . . . . . . . . . . . . . . . . . . . 42
3.2.2. Analisis de Requerimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.3. Casos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.4. Requerimientos funcionales y no funcionales . . . . . . . . . . . . . . . . . . . 44
ÍNDICE vii
3.3. Modelado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.3.1. Modelos en NURBS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.3.2. Modelos poligonales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.4. Programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.4.1. Control general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.4.2. Bases de la interfaz de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.4.3. Fı́sicas del laboratorio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.4.4. Primera etapa de interacciones . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.4.5. Segunda etapa de interacciones . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.4.6. Tercera etapa de interacciones . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.5. Validación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.5.1. Retroalimentación Final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.5.2. Actualizaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.6. Herramientas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.6.1. Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.6.2. Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.7. Costos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.7.1. Costo investigación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.7.2. Costo de ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.7.3. Gastos e insumos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.8. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.8.1. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4. Marco Conclusivo 79
4.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.2. Recomendaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.3. Trabajo Futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Bibliografı́a 82
A. Anexo: Scripts 87
A.1. Lógica de locomoción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
A.2. Integral de Verlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
A.3. Logica de Interpolación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
A.4. Lógica del Grafo y Retı́cula de selección . . . . . . . . . . . . . . . . . . . . . . . . . 95
Índice de figuras
1.1. Introducción
El desarrollo de la capacidad de análisis crı́tico y de aplicación del conocimiento es de fundamen-
tal importancia en la formación del estudiante de ingenierı́a, por lo cual las metodologı́as de la
educación han evolucionado y se han adaptado a los entornos tecnológicos del presente siglo. Esta
noción, fundamentada bajo el término e-learning o educación electrónica, es un concepto sujeto
a varias definiciones. Josep M. Boneu [1] lo define como: “El último paso en la evolución de la
educación a distancia y como una herramienta que proporciona la oportunidad de crear ambientes
de aprendizaje que se caracterizan por ser interactivos, eficientes y de fácil acceso”.
Paralelamente tenemos el concepto de laboratorio virtual (VL), elemento esencial que posee el e-
learning, que desde su creación se ha definido por expertos [2] como: “ un espacio electrónico de
trabajo concebido para la colaboración y la experimentación a distancia con objeto de investigar o
realizar otras actividades creativas, y elaborar y difundir resultados mediante tecnologı́as difundidas
de información y comunicación” (UNESCO, 2000). Desde esta perspectiva, es evidente la relación
existente entre el concepto de laboratorio virtual y e-learning, que como resultado al dı́a de hoy se
han patentado cuatro diferentes entornos de prácticas experimentales (Tabla 1-1).
Las experiencias de laboratorio son crı́ticas para el proceso de aprendizaje en todos los dominios
de ingenierı́a. El e-learning nos presenta dos tipos de laboratorios; el laboratorio real remoto, que
permite interactuar con los instrumentos del laboratorio a través de internet y el laboratorio remoto
1.2 Planteamiento del Problema 2
virtual, que permite realizar prácticas de laboratorio a través de una simulación o inmersión 3D
mediante la realidad virtual (VR). En 2019 un estudio hecho por Hernández, Vallejo y Morales [4]
en universidades alrededor del mundo, determino que los laboratorios remotos virtuales frente a los
laboratorios remotos reales son la mejor opción viable demostrando ser semejantes a los laborato-
rios prácticos tradicionales y con muchas ventajas de por medio, principalmente su baja inversión,
bajos costos de mantenimiento y facilidad de replicación para satisfacer la demanda de los usuarios.
Es entonces que se presenta la realidad virtual (VR) como una plataforma abierta de aprendizaje
y componente necesario del e-learning. La realidad virtual es una interfaz y aplicación informáti-
ca para la creación de entornos virtuales y fantásticos que pueden tratarse con efectos visuales,
sonoros y táctiles, llegando a ser una herramienta tecnológica emergente que se ha aplicado en
sistemas educativos a nivel global. De forma que laboratorios virtuales que permiten una inmersión
3D proporcionan al usuario experiencias, vivenciales emocionales, y es precisamente el carácter
emocional de la investigación en neurociencia que considera la emoción como una de las principales
claves del aprendizaje, y la realidad virtual tiene todo el potencial para trabajar con los estudiantes
y sus emociones, como estrategia educativa, su aporte es de inestimable valor para los profesores [5].
En los últimos años, se han hecho estudios que evidencian que la inmersión 3D puede favorecer el
proceso enseñanza aprendizaje. En 2014 un estudio de Loureiro, Ana & Bettencourt y Teresa [6],
demostró que los alumnos tienden a sentirse más abiertos, seguros, creativos y comprensivos en un
entorno 3D mejorando el progreso de aprendizaje. Otro estudio [7], confirmo que la realidad au-
mentada fue un método eficaz de aprendizaje y no solo para estudiantes regulares, sino que también
se desarrolló la prueba con estudiantes con discapacidades intelectuales y autismo lo que resulto de
la prueba fue que antes de la inmersión 3D el estudiante con autismo tenı́a un 30 % de respuestas
correctas para un tema en cuestión, en cambio después de usar la realidad virtual obtuvo un 80 %
de respuestas correctas (McMahon DD, Cihak DF, Wrigth RE y Bell SM, 2016). Esto sugiere que
la realidad virtual en la educación también podrı́a llegar a ser un gran avance en la inclusión de las
personas con discapacidad dentro del sistema educativo.
bien una necesidad, puesto que según reportes de la UNESCO al 14 de Abril del 2020 fue necesario
migrar el modelo de aprendizaje a plataformas virtuales [9], afectando al 94,1 % de la población
estudiantil con el cierre de escuelas y universidades a nivel mundial incluyendo Bolivia, que sus-
pendió sus actividades pedagógicas de forma presencial el 12 de marzo de 2020, siendo incierta la
fecha del retorno al ciclo educativo ordinario.
El área de interés que se quiere tratar con la propuesta de este proyecto es la necesidad de labora-
torios virtuales remotos en la Universidad Católica Boliviana “San Pablo” ante la crisis sanitaria
tomando en cuenta el impacto actual de este tipo de tecnologı́a en campos del e-learning, de forma
que puede llegar a ser un instrumento de gran utilidad para los estudiantes de Ingenierı́a Mecatróni-
ca y una forma de aprovechar la gran inversión de infraestructura por parte de la carrera en las
últimas gestiones, replicando los instrumentos del laboratorio en un entorno virtual para cerrar la
brecha entre el desempeño profesional y los conocimientos impartidos en la carrera.
Actualmente la universidad cuenta con plataformas como UCBx que podrı́an verse beneficiadas con
una herramienta de esta categorı́a como un aporte a futuro empezando con Ingenierı́a Mecatrónica
como un método de integrar los sistemas de gestión de aprendizaje en lı́nea (LMS) que se están
usando en los últimos dı́as coadyuvando a estudiantes a complementar y desarrollar una educación
continua con beneficios extra que son factores delimitantes laboratorios convencionales como la
duración de la práctica y horarios de uso, por ejemplo.
1.3. Objetivos
1.3.1. Objetivo General
Implementar un laboratorio virtual de Neumática e Hidráulica (IMT-241) para la carrera de inge-
nierı́a mecatrónica en la Universidad Católica Boliviana “San Pablo” que brinde a los estudiantes
conocimiento practico y teórico que se obtiene de una experiencia de laboratorio real.
• Validar las habilidades y conocimientos adquiridos por parte del público objetivo (Estudiantes
de IMT), mediante prácticas en el laboratorio virtual.
1.4. Justificación
El presente proyecto se enfocará en desarrollar un laboratorio virtual remoto para la asignatura
IMT-241 de la carrera de Ingenierı́a Mecatrónica, debido a la reciente crisis de alarma sanitaria
(Pandemia: COVID-19), por la cual las actividades pedagógicas de forma presencial se han suspen-
dido en Bolivia pasando a un modelo educativo basado en el e-learning. Ası́, el presente proyecto
será el primer paso que permita a los estudiantes complementar y desarrollar una educación con-
tinua como era antes de la crisis obteniendo una adecuada capacitación para posterior desempeño
profesional, además de ofrecer un evolución al actual modelo educativo basado en e-learning, con las
ventajas que traen los laboratorios virtuales tanto para estudiantes como para la universidad (bajos
costos de mantenimiento y facilidad de replicación para satisfacer la demanda de los usuarios).
• Las interacciones del laboratorio virtual se limitarán según requerimientos de los docentes a
cargo del presente proyecto y del docente experto de la materia.
1.5.2. Alcances
• Las sesiones de aprendizaje se basarán en prácticas realizadas en laboratorios de mecatrónica
en la Universidad Católica Boliviana “San Pablo”.
1.5 Lı́mites y Alcances 5
• Estudiantes de IMT tendrán la oportunidad de una previa interacción con algunos compo-
nentes del laboratorio antes de una práctica real.
• El laboratorio virtual tendrá una interfaz amigable y fácil de comprender por los estudiantes
destinatarios.
• El laboratorio virtual será de fácil acceso y estará disponible todo momento por los usuarios
al ser una aplicación offline para celulares.
• Tras la validación positiva del laboratorio virtual, se podrán desarrollar semejantes para
distintas áreas dentro de la UCB.
CAPÍTULO 2
Marco Teórico
2.1.1. Generalidades
El propósito de este enfoque es conocer las caracterı́sticas de un software de entrenamiento educativo
basado en Realidad Virtual de manera que este trabajo pueda cimentarse en proyectos similares y
ası́ reconocer caracterı́sticas a desarrollar como el impacto del proyecto en su culminación.
El objetivo del proyecto era verificar si el laboratorio virtual podı́a mejorar el aprendizaje de una
cantidad reducida de voluntarios en base a repetidas pruebas en el entorno virtual. Los resultados
fueron favorables concluyendo en que los participantes del proyecto mejoraron su desempeño en el
laboratorio virtual después de cada prueba, el estudio del equipo de ingenieros y estudiantes en
2.1 Estado del Arte 7
Después de visualizar los fenómenos fı́sicos y simular el comportamiento de los modelos anima-
dos del entorno, pasaron a hacer pruebas donde obtuvieron resultados en base a encuestas que
fueron favorables en todos los aspectos, excepto en la curva de aprendizaje ya que el laboratorio
no contiene mecanismos de análisis de aprendizaje por lo que no se puede registrar las acciones de
los estudiantes, pero es algo que dejaron como trabajo futuro junto a la gamificación de los procesos.
2.1 Estado del Arte 8
El proyecto también cuenta con un estudio por lo que el software se puso a prueba con ayuda
de un grupo pequeño de estudiantes, que después de la experiencia eran entrevistados. El estudio
termino con datos recopilados que demuestran que la realidad virtual en mecatrónica puede ayudar
a mejorar el proceso de comprensión y memorización, algo a tomar en cuenta sobre este proyecto
fue que el equipo dejo como trabajo futuro realizar este tipo de aplicaciones en dispositivos más
portátiles y accesibles para el público objetivo.
E) Siemens VR Training
Siemens junto a Vision Three crearon este software con el objetivo de reducir costos y esfuerzos en
capacitación de productos, de forma que puedan entrenar a operarios de sus productos en realidad
virtual, el primer proyecto presentado por esta rama de Siemens fue una simulación del mante-
nimiento de tableros eléctricos. Se trata de un software que simula el proceso paso a paso que
debe seguir un operario para tratar con el equipo, de esta forma el usuario es guiado para poder
completar la tarea, por lo que se concluye que cuenta con autómata finito, posteriormente muestra
una animación del paso a seguir, finalmente permite al usuario intentar la acción y se repite este
proceso en todos los pasos hasta completar la tarea [14].
Para ejecutar este software se requiere de un dispositivo de realidad virtual que conste de un casco
y controles con un seguimiento en 6 grados de libertad de manera que se pueda hacer el seguimiento
2.1 Estado del Arte 10
de la posición y rotación de la cabeza y manos del usuario. Este software se desarrolló en más de dos
años y se publicó en 2019, desde entonces ayudo a reducir accidentes en planta, mejoro el trabajo
operario en cuanto a tiempo, eficiencia y costos en capacitación de operarios ya que con la guı́a que
se integra en el software ya no se precisa los servicios de un entrenador especializado.
Los roles a desempeñar son desplazar las piezas, armado del barco, responsable y control del tiempo,
todos los participantes solo pueden comunicarse vı́a voz para ejecutar las estrategias de un plan
que designaron como estrategia a seguir antes de empezar, al terminar el armado del barco pueden
comparar las acciones que realizaron con la estrategia que decidieron seguir. El programa fue
desarrollado en el motor de juegos Unity en los lenguajes de programación Java y C#, el método
de interacción principal es la técnica de “rayacasting”.
El costo del proyecto fue de aproximadamente de 4000 dólares en los equipos y para el desarrollo
del software utilizaron la metodologı́a de sistemas de desarrollo en ciclos ¨Pressman¨. La lógica del
programa seguı́a un modelo de maquinas de estados finitos, adicionalmente para la validación del
proyecto se hicieron encuestas a los participantes que utilizaron el programa concluyendo al terminar
el estudio en que esta técnica puede emplearse para asignaturas similares y en que la realidad virtual
2.1 Estado del Arte 12
como estrategia didáctica de entrenamiento permite a los alumnos realizar practicas en situaciones
de riesgo y les permite conocer los equipo en campo antes de practicar con ellos.
del entorno virtual se hizo en Blender que es un software gratuito de modelado poligonal, pos-
teriormente se desarrollaron las mecánicas del programa en base retroalimentación de numerosas
pruebas en voluntarios para mejorar el sistema hasta la finalización del proyecto lo que se conoce
como metodologı́a de desarrollo en cascada, se usa generalmente cuando se desarrolla un proyecto
en solitario.
A) Slide-on HMD
El Slide-on HMD [21] que también se conoce como una configuración de RV basada en dispositivos
móviles se caracteriza por tener soportes para fijar un teléfono inteligente dentro del visor que se
pueden configurar a la posición de los ojos del usuario posibilitando que la pantalla del celular se
divida en dos imágenes diferentes actuando como las dos lentes estereoscópicas de un visor de reali-
dad virtual convencional, esto permite una correcta inmersión virtual en cuanto aspectos visuales
en espacios virtuales. Esta demás decir que la resolución para este tipo de visores se limita a la
resolución del teléfono inteligente ajustado en el soporte.
Paralelamente se aprovecha la posición del celular en el soporte para conseguir datos como el se-
guimiento de la rotación de la cabeza del usuario y la latencia de seguimiento todo esto a través
del giroscopio y acelerómetro del dispositivo móvil, otro aspecto a tomar en cuenta es el peso la
gran mayorı́a de estos visores se encuentran entre los 250 gr a 350 gr es de resaltar que hay que
sumar el peso del teléfono inteligente para saber el peso con el que se va a cargar en la cabeza.
Otros datos técnicos como el procesamiento y la actualización de los cuadros por segundo o FPS,
serán caracterı́sticas técnicas del celular que insertemos en el visor. Una ventaja importante de usar
un teléfono inteligente es la posibilidad de conectar dispositivos externos para interacción como un
mouse, controles y teclados.
Finalmente, la mayor ventaja que tiene esta forma de visualización en realidad virtual es sin duda
el costo, pues actualmente es la forma más barata y accesible de realizar una inmersión a la realidad
2.1 Estado del Arte 15
Los ejemplares con mayor popularidad que cumplen con los datos técnicos narrados en este docu-
mento a la fecha son:
• Google Daydream.
• VR Box , similares.
B) Discrete HMD
Discrete HMD [23] que también se conoce como la configuración de VR conectada a una computado-
ra, es un dispositivo que contiene todo lo necesario para experimentar la realidad virtual inmersiva,
pues se compone de lentes-pantallas estereoscópicas y tienen su propia unidad de medición iner-
cial, lo único que le falta a este visor es procesamiento externo que por lo general se hace en un
computador, es decir la ventaja en cuanto a los demás visores es que si el procesamiento externo
se hace en un equipo de alta gama soportarı́a programas más sofisticados.
Este tipo de HMD es menos móvil que sus dos contrapartes ya que se conecta a la computadora
a través de cables lo que impide que el dispositivo sea completamente móvil. Una ventaja es que
muchos de los ejemplares de este tipo de visor incluyen controles para las manos del usuario que
contienen sensores de posición y rotación y dan acceso a una interacción parecida a la realidad en
cuanto a recolección y manipulación de objetos en entornos virtuales aumentando la barrera del
realismo.
2.1 Estado del Arte 16
Algunos de estos cascos de realidad virtual también usan sensores externos que se tratan de dis-
positivos que arrojan rayos infrarrojos, cámaras, o estaciones de base que ayudan a detectar la
posición del usuario de forma que brinda una mejor experiencia de inmersión virtual, sin embargo,
esta puede llegar a ser su mayor desventaja, pues al tener sensores externos y sumado a el costo de
una computadora es la forma más costosa de realizar una inmersión 3D actualmente [24].
Los ejemplares con mayor popularidad existentes en esta rama de HMDs son:
• HTC VIVE.
• Oculus Rift.
C) Integrated HMD
El integrated HMD [25] es el visor móvil con mejores caracterı́sticas para hacer una óptima inmer-
sión a la realidad virtual, la razón es que es un dispositivo completamente autónomo a comparación
de sus 2 contrapartes por lo que no necesita procesamiento externo de un computador o un teléfono
inteligente, aunque existe la posibilidad de conectarlo a una computadora dando como resultado
algo parecido a un Discrete HMD con la misma capacidad de arrancar programas que requieren de
mucho procesamiento.
Al igual que el anterior visor el dispositivo cuenta con controles con seguimiento de rotación y po-
sición, pero sin duda la mayor ventaja de este tipo de visor es que al ser tecnologı́a de vanguardia
los más recientes ejemplares vienen con cámaras capaces de detectar la posición de los dedos del
usuario con una precisión muy alta por lo que son dispositivos con los que podemos interactuar en
el mundo virtual de la misma forma que se hace en la realidad rompiendo por completo la barrera
del realismo.
En cuanto a resolución, actualización de cuadros por segundo, precio y peso existen variaciones
para diferentes visores autónomos, llegando a costar entre los 600$ hasta los 3 000$ como fueron
2.1 Estado del Arte 17
• Microsoft HoloLens
• Google Glass
• Oculus Quest
A) Unreal Engine VR
Unreal Engine es un motor de desarrollo publicado en 1998 programado en C++, actualmente
conciliable con mas de 15 plataformas que incluyen desarrollo de programas en realidad virtual,
este software a comparación de su contraparte se ha centrado en la calidad de gráficos y rende-
rizado. Sobre infraestructura en su tienda de activos mantiene componentes que se orientan mas
a producciones de programas terminados es la razón de que los activos 3D de esta plataforma se
orientan mas en mejoras visuales o objetos prefabricados que se usan en muchos programas de muy
alta categorı́a (AAA), atribuida a desarrolladoras importantes, esta plataforma también se integra
con documentación especı́fica para el apartado de realidad virtual y realidad aumentada [27].
los usuarios de esta plataforma deben pagar una tarifa del 5 % en regalı́as. Actualmente en el fo-
ro de Unreal existen más de 12 000 hilos sobre programación, con temas que incluyen realidad mixta.
Unreal cuenta con un lenguaje de programación propio al que le han llamado Blueprint que genera
automáticamente partes del código contando con un sistema de scripting visual y se integra junto
a C++ para la resolución de algoritmos sin nodos complejos por lo que podemos concluir que para
la generación de un script en esta plataforma se requiere de dos archivos, uno de declaración y otro
de definición [28].
B) Unity Engine VR
Unity es un motor de desarrollo publicado en 2005 que en los últimos años a llegado a ser la pla-
taforma de desarrollo más popular entre el público desarrollador en general, tanto para la creación
de software 3D como 2D. Una de las principales ventajas de este motor es que admite una gran
variedad plataformas en las que se incluyen las de realidad virtual [29].
En 2019 se publicó en su página web estadı́sticas que se relacionan con el contenido que crea la
comunidad de desarrolladores y en cuanto a realidad virtual se hallaron cifras resultantes que in-
dican que el 60 % de los programas orientados a la realidad mixta se crean con Unity, el motivo es
que actualmente es un software compatible con todas las plataformas de realidad virtual existentes.
En cuanto a infraestructura cuenta con una tienda de activos extensa con más de 40 000 produc-
tos en 3D a la fecha, sobre la documentación cuenta con material exclusivo para el desarrollo de
programas en realidad virtual y cuenta con una comunidad de desarrolladores muy activa, su foro
sostiene más de 135 000 hilos sobre secuencias de comandos que puede ser información útil para el
desarrollo del proyecto.
2.1 Estado del Arte 19
Unity3D se puede utilizar en varios lenguajes de programación, aunque el lenguaje principal usado
por la comunidad es C#, que en el presente es el lenguaje más utilizado por empresas que desarro-
llan realidad virtual, que se puede interpretar como una base de información y soluciones probadas
por la comunidad desarrolladora [30].
2.1.4. Discusión
Ya definido el estado del arte, lo que se planeó lograr con el proyecto fue crear un software educativo
de realidad virtual enfocado en la materia IMT-241 (Neumática e Hidráulica), para lo cual en este
apartado de definió las caracterı́sticas principales para la implementación del proyecto y también
se obtuvo una noción aproximada de la selección de herramientas para posterior desarrollo del
programa. En este sentido la siguiente discusión fue determinante en el desarrollo del proyecto
planteado en el Capitulo 1 del presente documento.
A) Generalidades
Con el análisis de este enfoque no solo se contempló la posibilidad de realizar algún curso de desarro-
llo orientado a aplicaciones de realidad virtual, sino que se transformó en una necesidad fundamental
para continuar el desarrollo del proyecto. Aspectos importantes y caracterı́sticas principales con las
que cuentan los proyectos estudiados en este enfoque fueron:
C) Motor de videojuegos
El motor elegido fue Unity porque es un programa con la capacidad de generar entornos virtuales
de calidad, además es el software que más se usa para el desarrollo de este tipo de aplicaciones
como pudimos ver en el primer enfoque. Es el mejor software para exportar el proyecto a diferentes
plataformas y cuenta con la ventaja de ser un software gratuito. Los factores importantes en su
infraestructura son las tienda de activos, la documentación y la ayuda por parte de la comunidad.
A) Historia
Si bien la realidad virtual tiene una historia muy larga la investigación en este documento solo
considera una lı́nea de tiempo que abarca a aplicaciones de la realidad virtual en cuanto a entre-
namiento ya que en general gran parte de las aplicaciones a lo largo de su historia no se tratan de
experiencias en realidad virtual interactivas.
Para empezar, tenemos a Edward Link que en 1929 creo un simulador de vuelo electromecánico
llamado ¨Link Trainer¨ [32] utilizado para entrenar al ejército estadunidense durante la Segunda
guerra mundial, este dispositivo ayudo a entrenar a más de 500 000 pilotos, decadas después Morton
Heilig un director de fotografı́a desarrollo “Sensorama” [33], era una máquina que integraba una
pantalla estereoscópica, ventiladores, generadores de olores y una silla vibradora para sumergir al
usuario en sus pelı́culas, la maquina fue patentada el año 1962.
En 1989 la NASA entra en la realidad virtual, con la ayuda de Crystal River Engineering, crea el
proyecto “VIEW”, un simulador para entrenar astronautas ese sistema cuenta con un sistema de
interacción táctil, décadas después Google mejora su servicio de mapas con imágenes de 360º y en
2010 Palmer Lucky crea un kit de gafas de realidad virtual [34] que cualquiera puede hacer y que
se utiliza para navegar en el servicio de mapas de Google.
Entre los años 2014 hasta el presente [35], se comercializan visores de realidad virtual y evolucionan
rápidamente por sus grandes aplicaciones en diferentes medios por cientos de corporaciones no solo
de entretenimiento ya que se usa en ensamblajes y diseño asistido por computador por empresas
automovilı́sticas, en medicina educativa con simulación de operaciones o atención de pacientes,
tratamiento de fobias (acrofobia, claustrofobia, vértigo ansiedad, entomofobia, etc.) y en entrena-
mientos a militares, policı́as, astronautas con simulaciones de disparos, navegación, vuelos, etc. En
cuanto a educación se ha usado en diversas áreas cientı́ficas como sociales y lo que se propone con
este proyecto es emplear la realidad virtual en el área de la neumática e hidráulica.
2.2 Fundamentos Teóricos 22
• La ilusión de lugar
También conocida como PI (del inglés place illusion) se refiere a la sensación de estar en un
lugar. Se dice que esta ilusión es un qualia, eso significa que no hay forma de medirlo, sin
embargo, se pueden utilizar evaluaciones basadas en cuestionarios, memorias y conductas,
respuestas que se habrı́an esperado en experiencias reales. La PI es un suceso que pasa cuando
los participantes sondean los lı́mites de un entorno virtual, por lo que cuanto más investigan
el espacio digital, es mucho más probable la ruptura de esta ilusión y esto se evita con la
ilusión que viene a continuación [36].
• La ilusión de plausibilidad
También conocida como PSI (del inglés plausibility illusion) se basa en lo que se percibe de
un entorno virtual. Es la ilusión que hace creer al usuario que lo que aparentemente está
pasando realmente está pasando, aunque el usuario sepa de manera inconsciente que no está
pasando, entonces en un entorno virtual esta ilusión engloba a todos los elementos de los que
el usuario no tiene control directo por lo que esta ilusión no requiere de realismo fı́sico [36].
Esta ilusión se encarga de hacer que entorno virtual provoque una respuesta en el usuario en
base a sonidos o animaciones de otros objetos, como el ruido del ambiente o por ejemplo si
el escenario fuera en la calle se verı́an personas y autos pasar, entonces se concluye en que la
PSI genera en el usuario cambios fisiológicos y sensaciones que permiten al usuario percibir
un entorno virtual con más realismo.
• La ilusión de encarnamiento
Finalmente tenemos la ilusión de encarnamiento que se define como la experiencia de sentir
que el propio cuerpo le pertenece a uno mismo, y se refiere a la ilusión de existir en el entorno
virtual, entonces esta ilusión se encarga de hacer creer al usuario que está en un espacio digital
porque puede moverse e interactuar con los objetos del mismo [37].
Esta ilusión se ha ido perfeccionando en los últimos años utilizando diversos métodos de
locomoción e interacción para los HMDs, con entradas de dispositivos muy precisos que
tienen la capacidad de detectar la posición del usuario por completo o el movimiento de
partes especı́ficas del cuerpo como los dedos, el movimiento de los pies y las manos, etc.
2.2 Fundamentos Teóricos 23
• Desplazamiento
Es el desplazamiento común que se realiza de manera natural, la desventaja es que se necesitan
algoritmos muy potentes para su desarrollo o un espacio muy amplio para evitar choques.
No es recomendable implementarlo en visores con tres grados de libertad (3DoF).
• Teletransportación
Es uno de los métodos con más éxito en el mercado ya que su aplicabilidad también sirve
para reducir mareos por movimiento, sobre estimulación visual y desorientación en el espacio.
Se puede implementar en cualquier tipo de visor.
• Roller Coaster
Es un método común en aplicaciones y videos en 360º por lo general no se implementa en
2.2 Fundamentos Teóricos 24
aplicaciones en las que se necesitan muchas interacciones. De vez en cuando puede generar
sentimiento de encerramiento y claustrofobia.
A) Sensores inerciales
Los sensores inerciales también conocidos como IMU (del inglés Inertial Measuring Unit) [40], se
usan para el análisis de movimientos ya que tienen la capacidad de traducir fuerzas y medidas
fı́sicas de forma digital. Este es el requisito principal para poder transformar un teléfono móvil en
un HDM [41], esta conversión se hace a través de los sensores que se muestran a continuación:
• Giroscopio
En dispositivos móviles es un sensor desarrollado con tecnologı́a MEMS (del inglés Micro-
electromechanical Systems) que quiere decir que funciona con componentes electrónicos y
mecánicos miniaturizados, este dispositivo permite conocer la variación de un ángulo en el
tiempo, que se traduce como la obtención de la velocidad angular [42].
Por lo general en celulares se encuentran giroscopios que pueden medir velocidades angulares
en tres grados de libertad o más [43], con señales eléctricas que se traduce del movimiento de
una masa micrométrica de resonancia que se encuentra en el sensor y activa cuando recibe
cambios en la rotación, una peculiaridad de las señales que se envı́an de la masa es que deben
ser amplificadas para la lectura de un microcontrolador.
• Acelerómetro
Este dispositivo permite hacer una lectura de la aceleración en los ejes de coordenadas,
siempre sumada a la aceleración existente por la gravedad acorde a la orientación del celular
2.2 Fundamentos Teóricos 25
1 0 0
ωx (φ) = 0 cos(φ) −sin(φ) (2-1)
0 sin(φ) cos(φ)
Esta matriz representa la rotación en el eje X, se conoce como Roll (φ) o ángulo de balanceo.
cos(θ) 0 sin(θ)
ωy (θ) = 0 1 0 (2-2)
−sin(θ) 0 cos(θ)
Esta matriz representa la rotación en el eje Y, se conoce como Pitch (θ) o ángulo de cabeceo.
cos(ψ) −sin(ψ) 0
ωz (ψ) = sin(ψ) cos(ψ) 0 (2-3)
0 0 1
2.2 Fundamentos Teóricos 26
Esta matriz representa la rotación en el eje Z, se conoce como Yaw (ψ) o ángulo de derrape. Las
derivadas de los ángulos pueden expresarse en la siguiente matriz resultante:
φ sin(ψ)/sin(θ) cos(ψ)/sin(θ) 0 p
θ = cos(ψ) −sin(ψ) 0 q (2-4)
ψ −cos(θ)sin(ψ)/sin(θ) −cos(θ)cos(θ)/sin(θ) 1 r
Finalmente, ωB es el vector de velocidad angular expresado en una terna de cuerpo con rotaciones.
Esta ultima formula describe la actitud rotacional del celular en grados o radianes que se pueden
expresar como momentos de inercia.
Para traducir las rotaciones del Telefono móvil a un motor de desarrollo es necesario expresar sus
tranformaciones rotacionales de forma matemática.
• Cuaterniones y rotaciones
Los cuaterniones son números hipercomplejos que permiten representar las rotaciones de un
objeto rı́gido en espacios tridimensionales. Un cuaternión se compone de una parte escalar y
una parte vectorial, su representación tı́pica se puede ver en la ecuacion 2-6 [47]:
q = s + xi + yi + zk (2-6)
Donde:
q es el cuaternión.
s es un valor escalar.
x es el vector unitario del eje X.
y es el vector unitario del eje Y.
z es el vector unitario del eje Z.
q = [s, v] (2-7)
Para realizar el calculo de las rotaciones utilizando cuaterniones, se usa la ecuación 2-8 [46]:
R = qpq −1 (2-8)
Donde:
R es la matriz de rotación estándar.
q es un cuaternión (q0 , q1 , q2 , q3 ) que cumple con |q| = 1.
p es el cuaternión con las coordenadas del teléfono móvil (0,X,Y,Z).
1 − 2(q2 )2 − 2(q3 )2 2((q1 )(q2 ) + (q0 )(q3 )) 2((q0 )(q2 ) + (q1 )(q3 ))
R = 2((q0 )(q3 ) + (q1 )(q2 )) 1 − 2(q1 )2 − 2(q3 )2 2((q2 )(q3 ) + (q0 )(q1 )) (2-9)
2((q1 )(q3 ) + (q0 )(q2 )) 2((q0 )(q1 ) + (q2 )(q3 )) 1 − 2(q1 )2 − 2(q2 )2
De donde se obtienen la ecuación 2-10, 2-11, 2-12 y 2-13, útiles para hallar los componentes de un
cuaternión posición:
r
T r(R) + 1 (2-10)
q0 =
4
r
R11 1 − T r(R) (2-11)
q1 = +
2 4
r
R22 1 − T r(R) (2-12)
q2 = +
2 4
r
R33 1 − T r(R) (2-13)
q3 = +
2 4
Donde:
Rii son los componentes de la diagonal principal en la matriz de rotación estándar.
qi son los componentes escalares y vectoriales de un cuaternión.
T r(R) es la sumatoria de la traza de matriz que corresponde a un eje de rotaciones.
2.2 Fundamentos Teóricos 29
A partir de las matrices de rotación descritas como “Ángulos de Euler” en las ecuaciones 2-1, 2-2 y
2-3 es posible deducir el cuaternión de la posición que adquiere el teléfono móvil con cada transfor-
mación. Los componentes del cuaternión de rotación se obtienen de las ecuaciones 2-10, 2-11, 2-12
y 2-13 [46].
De la traza de las matrices Rx (φ), Ry (θ) y Rz (ψ) se obtiene el valor de Tr(R), donde α representa
los tres ejes de las matrices rotación:
Finalmente se obtienen las fórmulas 2-15, 2-16 y 2-17 para modificar las rotaciones de un teléfono
móvil en un motor de desarrollo como Unity.
φ φ
qφ = cos( ) + i sin( ) (2-15)
2 2
θ θ
qθ = cos( ) + j sin( ) (2-16)
2 2
ψ ψ
qψ = cos( ) + k sin( ) (2-17)
2 2
C) SDK Google VR
Una vez se ha definido como es que un teléfono móvil puede tomar los ángulos y rotaciones de
la cabeza del usuario, en este apartado se presenta una de las herramientas mas utilizadas para
el desarrollo de programas orientados a la realidad virtual, que a la fecha es un software de códi-
go abierto [48]. Se trata del kit de desarrollo de software Google Cardboard, que permite a los
desarrolladores generar aplicaciones para transformar dispositivos Android e iOS en pantallas de
realidad virtual y es la herramienta por excelencia tanto para realizar un correcto seguimiento a las
rotaciones de la cabeza del usuario como para implementar visión estereoscópica en un proyecto.
Entonces los grafos son solo abstracciones matemáticas que pueden trascender problemas matemáti-
cos como sociales y son útiles en la práctica porque nos ayudan a resolver numerosos problemas y
algoritmos importantes [50]. Un grafo G es una terna (V, E, θ), donde V es un conjunto finito de
elementos llamados vértices o nodos del grafo, E es un conjunto finito de elementos llamados lados
y θ es una función que asigna a cada elemento de E un par de elementos de V ası́ es, de acuerdo
con Mesa y Ortega [49].
X
|E| = ( x∈V d(x))/2 (2-18)
como:
(
1 si (i, j) ∈ A
aij = (2-19)
0 si (i, j) ∈
/A
Para representar a un grafo en una matriz de adyacencia primero se debe organizar los nodos o
vértices de forma simétrica en los extremos izquierdo como en el superior, posteriormente se debe
llenar la matriz con las aristas donde las conexiones entre nodos se representan con algún sı́mbolo,
lo más convencional es que una conexión se represente con “1” y los demás espacios se llenan de “0”.
Por ejemplo, el grafo de la figura 2-21 puede representarse como una matriz de adyacencia de la
siguiente forma:
0 1 1 0 0 0 0 0
0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 1 1 0 0
A(G) =
0 0
(2-20)
0 0 0 1 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
Una forma de determinar si un grafo es orientado o no, puede hacerse a través de su matriz de
adyacencia, sumando las aristas que integra cada uno de los vértices tanto en filas g + (i) como en
columnas g − (i) [52], si las sumas resultantes para las filas son simétricas a las sumas resultantes de
las columnas se concluye que se está tratando con un grafo orientado de otra forma el grafo no es
orientado.
g + (i) = 2 1 1 3 1 0 1 0 (2-21)
g − (i) = 2 1 1 1 1 2 0 1 (2-22)
2.2 Fundamentos Teóricos 32
De la ecuación 2-21 y 2-22 se deduce que el grafo perteneciente a la matriz 2-20 no es orientado.
C) Representación en el computador
Las estructuras de datos presentadas en las anteriores subsecciones son esenciales para la resolución
de algoritmos con operaciones en una computadora [49]. Existen diversos métodos para resolver un
problema según sus peculiaridades, los factores que se toman en cuenta son el número de vértices
o aristas, si es un grafo muy denso, si es un grafo dirigido o no, etc. Por lo general las primeras
resoluciones de algoritmos se implementan con arreglos o listas, sus ventajas y desventajas son:
• Representación en arreglos
Consiste en declarar el grafo como su matriz de adyacencia o en generar un “arreglo de
aristas” si se esta tratando con un grafo dirigido, de forma que solo se tengan dos filas con
los extremos de cada arista.
a desarrollar, con los requerimientos será posible reconocer los problemas y a qué escala se van a
diseñar las estructuras del sistema para un desarrollo ágil [53].
A) Elementos de desarrollo
La metodologı́a de desarrollo a elegir dependerá de los elementos principales [54], que son parte del
proyecto los cuales son:
• El cliente
Se identifica más como el problema ya que en base a sus observaciones y limitaciones el
proyecto podrá tener un final y estructuras especificas definidas.
• El usuario
Es el publico que utilizara el software como solución, de acuerdo a sus requerimientos se
implementa la interfaz de usuario.
• El tiempo
El proyecto debe tener un inicio y un final, en caso de cumplir con los requerimientos del
cliente se da por acabado el proyecto, entonces se pueden desarrollar nuevas versiones.
• Escalabilidad
El tiempo determina la escalabilidad del proyecto, y se refiere a la propiedad de aumentar
las capacidades de un programa sin arriesgar el funcionamiento del mismo.
• Jefe de proyecto.
Es el encargado de dirigir al equipo creando roles y responsabilidades, también define las
fases que van a componer el proyecto como los métodos de resolución de algoritmos.
B) Modelo de la cascada
Este método de desarrollo se utiliza cuando los requerimientos del problema son claros y razonables
de manera que el proyecto puede fluir de forma lineal. En muchos casos el modelo en cascada se
2.2 Fundamentos Teóricos 34
Primero se analizan los requerimientos del proyecto para posteriormente identificar los requerimien-
tos funcionales que son aquellos algoritmos programables y los no funcionales que caracterizan al
software con apariencia, sensaciones y operabilidad. Las desventajas de usar este método son:
• Puede causar confusión en el equipo al ser un modelo secuencial, ya que los errores en el
programa no se descubren hasta el final.
• Si un miembro del equipo se retrasa todo el equipo lo hace por su forma secuencial.
• El cliente debe tener paciencia ya que no existirá una versión funcional del proyecto hasta
que esté muy avanzado.
• Después de desarrollar los requerimientos iniciales y desplegar la primera versión del progra-
ma, es más sencillo asistir el proyecto con retroalimentaciones.
La herencia en su momento fue el enfoque mas vanguardista de POO ya que es útil para retrans-
mitir diferentes efectos en diferentes objetos dentro de un mismo sistema [57], tal es el caso que
describiendo similitudes en un Script podemos retransmitir comportamientos a diferentes objetos
que lo contienen. Por otro lado, el Dispatch dinámico se encarga de administrar las interfaces im-
plementadas en nuestro sistema de manera que se puedan invocar comportamientos por parte de
los objetos.
B) Fı́sicas
Unity tiene la capacidad de simular fı́sicas del mundo real en un entorno virtual, las principales
son las aceleraciones y las colisiones [58]. Las fı́sicas son útiles generando comportamientos pasivos
en los objetos de una escena y el motor de desarrollo Unity cuenta con dos motores de fı́sicas
incorporados, para desarrollo de una aplicación en realidad virtual lo más recomendable es usar el
motor Nvidia PhysX.
• Cuerpos rı́gidos
Los cuerpos rı́gidos también conocido en inglés como “RigidBodies”, permiten a los objetos
de una escena en realidad virtual recibir fuerzas o torciones de forma independiente y es un
componente que se puede cambiar a través de scripts, la desventaja de usar un cuerpo rı́gido
es el impedimento de poder hacer cambios en las transformaciones de un objeto de manera
directa afectando también jerárquicamente a los objetos hijos de otro que tenga un cuerpo
rı́gido.
Es un componente que hace a un objeto actuar según los cálculos del motor de fı́sica y puede
afectar a los objetos en sus propiedades de transformación de posición y rotación sin requerir
de sus valores. Existen casos en los que los desarrolladores requieren de un cuerpo rı́gido sin
que las transformaciones del mismo se vean afectadas por los cálculos del programa, esto se
puede hacer a través de la función “IsKinematic” que permite el control de un cuerpo rı́gido
a través de scripts.
• Colisionadores
Este componente se usa para efectos de detección fı́sica entre objetos, se caracterizan por ser
invisibles por lo que no necesariamente deben tener la forma en cuanto a malla del objeto que
lo contiene. Para optimizar el manejo de objetos en el procesador frecuentemente se recurre
2.2 Fundamentos Teóricos 36
a colisionadores conocidos como “primitivos” que se generan en base a modelos básicos como
cubos, esferas, cilindros o capsulas.
En realidad virtual los colisionadores son fundamentales porque permiten interactuar con
los objetos del entorno y generar cambios en la transformación de los mismos en cuanto a
posición y rotación, manteniendo una carga muy leve en los procesadores. Si en una escena
existen dos o más objetos con este componente pueden interactuar entre ellos como objetos
del mundo real, esta acción mejora la experiencia del usuario. Un objeto puede contar con
más de un colisionador y puede ser modificado a través de scripts.
• Articulaciones
Las articulaciones son componentes que sirven para relacionar a dos o más objetos en cuanto a
las fuerzas que se le aplican, el cálculo en la posición de cada componente como las rotaciones
se ejecutan junto al programa en tres grados de libertad, aunque el control que integra el
motor de fı́sicas en Unity suele ser inestable y es la razón por la que grandes compañı́as
desarrollan esta propiedad en base a scripts. Cada uno de los objetos que componen una
articulación pueden trabajar con cuaterniones para sus rotaciones, por lo que las formulas
tal y tal son aplicables de igual forma para este apartado.
• Interpolación lineal
Es un procedimiento numérico basado en la interpolación polinómica de Newton que comúnmen-
te se usa en programación para representación digital de funciones en base a dos puntos en
un mismo plano, con los valores de inicio y final [60]. En realidad virtual es útil para trazar la
distancia más corta aproximada entre objetos y utilizar el camino para manipular los objetos
utilizando un polinomio de interpolación de grado 1 que se define como:
2.2 Fundamentos Teóricos 37
f (x2 ) − f (x1 )
f (x|x1 ; x2 ) = f (x1 ) + (x − x1 ) (2-23)
x2 − x1
Donde:
f (x) es la distancia mas corta entre dos puntos.
x1 representan las coordenadas de un punto x1 en el espacio
x2 representan las coordenadas de un punto x2 en el espacio
• Integral de Verlet
Las integraciones numéricas en Unity se usan para calcular la posición de un objeto o para el
cálculo de trayectorias en función al tiempo cuando se están ejerciendo fuerzas en dicho objeto,
si esta función se ejecuta constantemente (un cuadro por segundo es lo habitual) también
se puede predecir sus futuras posiciones. La principal virtud de la integración de Verlet se
demuestra en el cálculo de trayectorias donde la velocidad no se maneja explı́citamente como
en otros métodos de integración, Euler por ejemplo, ademas esta integral permite realizar un
seguimiento de las posiciones actuales y anteriores de un punto respecto a un fotograma de
manera que sus aplicaciones son diversas.
La función principal de esta integración en Unity es hallar trayectorias solución, trabajando
sin velocidades y es la razón por la que en una simulación esta integración es más estable
en comparación con otras integrales más explicitas, el único inconveniente de Verlet es que
si se requiere manejar las colisiones en una trayectoria el problema puede llegar a ser más
complejo por lo que se recomienda tomar en cuenta la velocidad u optar por otro método
para hallar trayectorias.
Esta integración se obtiene truncando la serie de Taylor de las ecuaciones 2-24 y 2-25, a partir
de los terminos de cuarto orden para una pocisión variable en los instantes t + dt y t − dt
[61]:
Donde:
~r es la pocisión de una entidad respecto a un instante t.
~v representa la velocidad.
~a representa la aceleración.
~b representa la sobreaceleración.
2.2 Fundamentos Teóricos 38
A) Técnicas de modelado
Las técnicas de modelado y prototipado más reconocidas para la virtualización de objetos reales
son:
• Modelado poligonal
Tratándose de realidad virtual para teléfonos móviles, esta es la técnica utilizada por excelen-
cia ya que permite crear modelos con una cantidad muy reducida de polı́gonos. La creación
de modelos con esta técnica permite virtualizar objetos en base a formas prediseñadas como
cubos, esferas y planos, modificando su topologı́a. Errores comunes que existen al usar esta
técnica de modelado son orientar mal las caras normales del objeto virtualizado y realizar un
tratamiento incorrecto de la topologı́a del modelo.
• Modelado NURBS
Es un tipo de modelado que generalmente se utiliza cuando se requieren modelos de precisión,
no es recomendable usar este tipo de modelos en aplicaciones de realidad virtual para teléfonos
móviles ya que podrı́a afectar en gran medida el tiempo de refresco en el renderizado y la
latencia de los fotogramas dentro de la aplicación. Los softwares que se caracterizan por
utilizar este tipo de modelado se basan en geometrı́a de contornos en la categorı́a de diseño
asistido por computadora (CAD), lo habitual antes utilizar los modelos que se generan con
esta técnica en un entorno como Unity es realizar una reducción en la cantidad de polı́gonos.
Figura 2-25: Modelado poligonal, la topologı́a del modelo se ve reducida a medida que bajan
sus polı́gonos.
• Retopologı́a
La retopologı́a no es una reducción de polı́gonos, mas bien se enfoca en redibujar el modelo
en una malla. Es la manera mas efectiva de reducir los polı́gonos en un modelo, la desventaja
que trae es que consume mucho tiempo y para realizar una correcta retolopologı́a se requieren
de conocimientos amplios en el área de modelado poligonal.
Algo que se debe tener muy en cuenta, es que los dos primeros métodos de reducción se pueden
utilizar juntos para obtener resultados parecidos a una retodologı́a.
CAPÍTULO 3
Marco Práctico
En base a la tabla 3-1 se detectaron algunas restricciones y requerimientos del software que se
utilizaron para el posterior diseño de distintas mecánicas e interacciones, interfaces, modelos y
como punto más importante se estableció la escalabilidad del presente proyecto.
Figura 3-2: Analisis de componentes de la serie MICRO con el docente experto en la materia.
Con respecto a los requerimientos del área de modelado se tomaron en cuenta los instrumentos de
la serie MICRO previamente analizados como se muestra en la figura 3-2, puesto que naturalmente
las primeras prácticas de laboratorio en la materia se desarrollan con estos equipos. En ese sentido
se optó por modelar las piezas con una herramienta de modelado basado en NURBS ya que al
tratarse de piezas mecanizadas se requiere de mayor precisión, en esta etapa también se empezó
con la búsqueda de planos y catálogos pertenecientes a los instrumentos que se tienen en laboratorio.
Cabe considerar que existen otros requerimientos para el área de modelado ya que al tratarse de
un proyecto orientado a realidad virtual se estableció el diseño de un entorno virtual con el objeto
de conseguir por parte de los usuarios el fenómeno conocido como “Place illusion”, el plan para el
desarrollo del entorno virtual fue tomar las medidas del laboratorio real y de los objetos o muebles
mas llamativos de la habitación donde se desarrollan las prácticas de laboratorio.
Los casos de uso por lo general representan la forma en la que funciona un sistema que se va a
desarrollar, en él se incluyen la forma en la que los actores interactúan con el entorno. El programa
cuenta con un único actor que representa el usuario como se puede ver en la figura tal, al tratarse
del diseño de una aplicación de realidad virtual se desarrolló el diagrama basado en las acciones
naturales que se llevan a cabo al realizar el armado de un circuito en un laboratorio real.
Los requerimientos funcionales por parte de la interfaz del usuario se desglosan en la tabla 3-3.
Para establecer los requerimientos funcionales de las acciones principales del usuario se separaron
las funcionalidades en cuatro etapas que se realizan comúnmente en simuladores de neumática e
hidráulica y en la preparación del laboratorio real. La primera etapa se trata de la manipulación
de instrumentos de laboratorio, en la segunda etapa el usuario se encarga de hacer conexiones,
la tercera etapa es una revisión de la conexión del usuario para la etapa final que se trata de
experimentar y utilizar el circuito prestando atención a los actuadores.
Todas la etapas nombradas se desglosan en la tabla 3-4.
3.2 Planeación y requerimientos 46
B) Requerimientos no funcionales
Los requerimientos no funcionales generales se desglosan en la tabla 3-5.
Por otro lado, los demás requerimientos no funcionales se enfocan en cumplir con las tres ilusiones
que debe contener un programa orientado al entrenamiento en realidad virtual.
3.3 Modelado 47
3.3. Modelado
En el capitulo anterior se describe porque la realidad virtual debe cuidar la cantidad de polı́gonos
de sus modelos más que otro tipo de software, de manera que el objetivo principal de esta etapa fue
reducir al mı́nimo la cantidad de polı́gonos en los modelos tanto de instrumentos como de objetos
que forman parte del entorno. La reducción de polı́gonos será útil para optimizar el rendimiento
y evitar problemas en cuanto a procesamiento mejorando el tiempo de refresco de las imágenes
renderizadas para dispositivos de baja gama.
Un punto muy importante para el desarrollo de esta etapa fue que la plataforma Unity solo puede
procesar y renderizar modelos en formato FBX, por lo que para decidir las herramientas de mode-
3.3 Modelado 48
lado se tuvo cautela y como se puede ver en la figura 3-4, se utilizo modelado en NURBS al igual
que el modelado poligonal.
En el proceso de modelado no se han incluido tornillos y en algunos casos se han quitado re-
dondeos y chaflanes en las piezas, el motivo de esta decisión fue evitar un crecimiento elevado en
la cantidad de polı́gonos de cada modelo al exportar la pieza a un software de tratamiento poligonal.
El software integra ensambles de instrumentos neumáticos que forman parte del primer laboratorio
de la materia, entre los cuales existen algunos ensambles como los conectores rápidos y los soportes
que son piezas comunes en el ensamble de instrumentos principales.
Tabla 3-7: Ensambles comunes.
Ensamble Nro. de piezas
Conector rápido 4 piezas
Conector orientable 90º 6 piezas
Soporte 6 piezas
3.3 Modelado 49
Con el plano se comenzó con modelado de la habitación para lo cual se exporto la figura en una
imagen dentro de la escena de Unity y se agregó como shader en un objeto plano donde se hizo
la estimación de la unidad de medida de la figura y se desarrolló el modelo con la herramienta
ProBuilder, como resultado se obtuvo el modelo de la figura 3-7.
En la visita también se midieron las mesas y los tableros neumáticos que son los objetos principales
donde se desarrollan las prácticas de laboratorio de la materia en cuestión, los modelos para esta
parte se hicieron en Blender cuidando que los modelos tengan una cantidad mı́nima de polı́gonos y
para el resto se utilizaron modelos primitivos de Unity. La cantidad de polı́gonos de cada modelo
se encuentran en la tabla 3-9.
3.3 Modelado 50
Finalmente se modeló el botón de reinicio y salida, cumpliendo ası́ la norma de realidad virtual,
los botones están dentro del mundo virtual y no ası́ en un canvas. También se aprovechó para
modelar gafas protectoras para que los usuarios puedan aprender sobre los hábitos de seguridad
que se utilizan al momento de realizar una práctica de laboratorio de neumática.
Por otro lado, se realizó un retoque en la topologı́a de los modelos en NURBS para exportarlos
a Unity, este proceso fue la etapa más larga y compleja de la sección ya que algunos modelos
3.3 Modelado 51
contenı́an muchas caras, esto se debı́a en gran medida a los chaflanes y redondeos que aparecen en
las curvas de los modelos. Finalmente se procedió a hacer la reducción de polı́gonos en dos tiempos,
primero por conteo tratando de no deformar la pieza y después por cuadrangulación, es ası́ que se
obtienen los resultados de la tabla 3-10.
El ultimo paso antes de exportar los modelos de Blender a Unity fue corregir las normales de los
modelos importados de NURBS, para que dentro de la escena todas las caras de los instrumentos
sean visibles. La exportación y renderización de los modelos en Unity resulto exitosa por lo que se
dio esta etapa como finalizada.
3.4. Programación
El objetivo principal de esta etapa fue desarrollar los requerimientos funcionales detallados en las
tablas 3-2, 3-3 y 3-4 tomando en cuenta los requerimientos no funcionales de la tabla 3-5 y 3-6,
para empezar con un desarrollo en paralelo con la etapa anterior se desarrollaron scripts e hicieron
pruebas continuas con modelos primitivos de Unity. El diagrama de clases de la figura 3-9, contiene
los algoritmos nesarios para realizar un entrenamiento orientado a la materia de NEUMÁTICA E
HIDRÁULICA (IMT-241).
Tras cumplir con el requisito RF05 y RF06 se agregaron colisionadores en los botones y un activador
de eventos que genera un rotulo con el nombre de cada función de acuerdo a la posición del rayo
detector, es decir el texto aparece cuando la retı́cula principal detecta el botón. El diseño se hizo
de esta forma pensando en posteriores retroalimentaciones donde se requiera de un botón con
un comando diferente, finalmente se creó una animación para verificar el funcionamiento de los
comandos en sus respectivos guiones obteniendo el resultado de la figura 3-10.
requerimiento RF03 utiliza herramientas del SDK de Android que al exportar la aplicación genera
un renderizado para realidad virtual, los resultados de la prueba se muestran en la figura 3-11, que
se trata de un informe de depuración realizado vı́a USB.
En el informe muestra la inicialización del estado de realidad virtual, para activar este estado el
programa toma los valores del ancho y alto de la pantalla del dispositivo, luego divide la pantalla en
dos y renderiza imágenes estereoscópicas como dos cámaras principales diferentes, que se ajustan
a los ojos del usuario. El campo de visión y la separación se puede editar por código, el resultado
tras implementar el requerimiento RF03 se muestra en la figura 3-12.
En la figura 3-11 se puede observar el funcionamiento del requerimiento RF04, que también utiliza
herramientas del SDK de Android, primero para detectar los sensores del dispositivo y luego para
obtener en tiempo real sus ángulos de rotación ya que en el proyecto estos valores representan la
3.4 Programación 55
rotación de la cabeza del usuario. Posteriormente se utilizaron herramientas del SDK de Google-
Cardboard que inicializan las matrices de rotación Pitch, Roll y Yaw en las fórmulas 2-15, 2-16 y
2-17 respectivamente, para obtener un cuaternión que además de hacer seguimiento a la cabeza
del usuario, enlaza los valores de rotación obtenidos con cámara principal en la escena de Unity, el
resultado se puede observar en la figura 3-13.
La retı́cula principal es una herramienta que utiliza guiones del SDK de GoogleCardboard que va
en conjunto con el requerimiento RF05, se trata de una figura sobrepuesta a la cámara principal del
usuario en forma de punto que cuando detecta un colisionador se amplı́a, demostrando al usuario
que está tratando con un objeto interactuable, la implementación en conjunto del requerimiento
RF05 y RF06 se puede observar en la figura 3-15.
3.4 Programación 56
Para configurar esta retı́cula en el programa se cambió el tipo de imagen por defecto a un sprite
de lleno, como se muestra en la figura 3-16 y se le asigno a un canvas en la cámara principal.
La programación de su script consiste en tres funciones principales, la primera cumple una función
de animador en la imagen de la retı́cula de selección y la varia adquiriendo el tiempo de ejecución
3.4 Programación 57
que se va actualizando en cada fotograma, a su vez también contiene una variable que funciona
como memoria en la que se suma el tiempo ejecución cada vez que se detecta una colisión, llenando
o no la imagen de la retı́cula de selección de forma radial.
Las otras dos funciones sirven para detectar si el rayo de la retı́cula principal esta colisionando
con algún objeto, si es ası́ la primera función guarda en una variable el tiempo de ejecución com-
parándose en cada frame con un valor preestablecido en Unity, esto quiere decir que si el tiempo y
la animacion se completan, la acción se ejecuta; caso contrario la variable se reinicia en 0 al igual
que la animación de llenado en la primera función. La preuba de la retı́cula de selección fue exitosa
y se muestra en la figura 3-17
D) Locomoción – RF08
Con la retı́cula de selección implementada el siguiente problema a solucionar fue hallar un método
de locomoción a través del espacio 3D, para resolver este problema se optó por usar el método de
teletransportación antes visto en el capı́tulo 2. La idea principal fue usar un objeto primitivo de
Unity como referencia de transformación de posiciones, de manera que el usuario detecte el objeto
a través del requisito funcional RF05, para lo cual se creó un tag nombrado “teleports”.
Las transformaciones de posiciones en Unity se trabajan con variables de tipo Vector3, por lo que
3.4 Programación 58
Para solucionar este problema se creó una variable donde se guarda la coordenada en Y del usuario
al iniciar el programa y luego sumarlo a la posición del objeto destino, permitiendo al usuario
teletransportarse sin cambiar su perspectiva o campo de visión. Finalmente se agregó una animación
de desvanecimiento a la cámara principal para evitar mareos en el usuario y se cambió el aspecto
del punto teletransportación por una malla similar a un cilindro, que conserva el colisionador del
cubo de pruebas, como se puede ver en la figura 3-19, que posteriormente se transformó en un
objeto prefabricado para crear diferentes puntos de destino.
La manguera creada se instanciaba por código al igual que su longitud, cada capsula representa un
segmento de la manguera generada y todos los segmentos compartı́an la detección de colisiones, el
problema que surgió de este intento fue que la rotación de los ángulos de cada segmento era muy
inestable ya que la multiplicación de cuaterniones debı́a ser optimizada. Indagando más sobre la
solución se descubrió que al dı́a de hoy, la creación de una articulación con n segmentos, es uno de
los grandes problemas para los desarrolladores de video juegos, por lo que se desechó la idea y se
buscaron opciones alternativas.
B) Integración de Verlet
Para traducir esta integración numérica en un algoritmo programable se utilizó la ecuación 3-1
que simplifica en gran medida la ecuación 2-26, hallando los valores iniciales a través del método
implı́cito de Euler.
Donde:
r es la posición del objeto en el espacio, en un instante t
3.4 Programación 60
Para implementar el algoritmo funcional de la figura 3-21, se siguieron los siguientes pasos:
• Se creo visualmente una manguera con ayuda del componente Line Render, que a través de
código genera una cantidad finita de partı́culas que representan los segmentos de la manguera.
• El algoritmo vincula dos objetos que son la relación automática del inicio y final de la
manguera.
• Se agrego la ecuación 3-1 en un bucle que sirve para calcular la posición actual y la posición
anterior de cada segmento de la manguera en tiempo real.
• De la diferencia de las dos posiciones se obtiene una velocidad, a la que se le puede sumar
fuerzas. En el proyecto esta variable es una gravedad negativa y es el factor que permite al
usuario ver las conexiones del circuito.
• Para mantener todas las partı́culas del Line Renderer unidas se calcula una restricción de
distancia entre segmentos y se agrega un factor de elasticidad, mejorando el aspecto estético
de la manguera.
Para la construcción del circuito que se muestra en la figura 3-25, se tomaron en cuenta los
componentes modelados de la tabla 3-8.
requerimiento es que los extremos de la manguera tienen un nombre asignado en Unity que se debe
almacenar en una memoria cuando el usuario toma un extremo de la manguera, por lo que se creo
un tag al que se le nombro “Hose”. Para este requerimiento se agregaron dos colisionadores en los
extremos de una manguera que pasó a ser un objeto prefabricado como se muestra en la figura 3-26.
Para guardar el nombre de los extremos de mangueras en matrices de adyacencia o listas, se creó
una nomenclatura que permite extraer los datos de objetos prefabricados para asignar el dato
guardado en otras variables. La nomenclatura de la figura 3-27 divide dos tipos de datos con el
sı́mbolo “ ”, el primer dato que se puede extraer es si se esta tratando con una manguera o un
cable y que numero de objeto se está reconociendo, el segundo dato permite detectar si el usuario
a tomado el inicio o el final de la manguera.
Para detectar todos los conectores existentes en la escena de Unity se utilizaron los identificadores
de la tabla de instrumentos 3-8, de forma que el usuario obtenga propiedades como el nombre y
la posición del conector donde ha posado el rayo de la retı́cula. Los nombres de los conectores en
la escena de Unity se guardaron en objetos prefabricados, con la nomenclatura que se muestra en
la figura 3-29 donde el nombre de la pieza se representa por su identificador de la tabla 3-10,
el número de pieza se utiliza en caso de existir mas de una pieza del mismo tipo en una escena
armada, el pseudónimo se encarga de clasificar el tipo de entrada que puede tratarse del extremo
3.4 Programación 66
de una manguera o cable que se utilizan en botoneras o electro válvulas, finalmente se indica el
conector especifico de la pieza al que se esta conectando la manguera o cable.
El algoritmo que se desarrolló para el control de las n conexiones utiliza matrices de adyacencia,
primero se encarga de generar automáticamente un vector donde todos los nombres de conectores
en la escena se ordenan y almacenan alfabéticamente para identificar los vértices del grafo. Luego
crea una matriz nxn según la longitud del vector donde se guardan las conexiones en base a la
nomenclatura del requerimiento RF13 que contiene los nombres de los extremos de las mangueras
como se muestra en la figura 3-30.
booleanas, cuando se activan solo envı́an un cambio de variable como se puede observar en el
diagrama animador de la figura 3-32.
B) Actuadores – RF17
Similar al requisito RF16, el requisito RF17 funciona en base a animaciones solo que no son interac-
tuarles porque actúan de acuerdo a las variables que se envı́an por el requisito RF16. En el circuito
de prueba solo existe un actuador, su diagrama de animación se puede ver en la figura 3-33.
3.5. Validación
3.5.1. Retroalimentación Final
Como se planeó en la primera etapa del proyecto la retroalimentación del docente experto en la
materia y el docente Relator validaron la aplicación para proceder a hacer pruebas con los usuarios.
3.5 Validación 69
Esta etapa de retroalimentación se desarrolló en las semanas posteriores al WorkShop del taller de
grado de la carrera donde se obtuvo el visto bueno por los docentes, con las siguientes observaciones:
3.5.2. Actualizaciones
En base a las observaciones del anterior apartado se hicieron actualizaciones a dos requisitos fun-
cionales y se creó un requisito no funcional para las herramientas didácticas del entorno como se
muestra en la tabla tal.
• Se crearon rótulos con imágenes que contienen el sı́mbolo de todos los instrumentos de la
tabla 3-8.
3.5 Validación 70
3.6. Herramientas
3.6.1. Hardware
Las herramientas de hardware que se utilizaron a lo largo del desarrollo del proyecto para realizar
pruebas hasta validación del proyecto se muestran en la figura tal y son:
• Control bluetooth
Es un control programable con el que se puede operar el teléfono móvil aun si se encuentra
dentro del HMD, se conecta a través de bluetooth y funciona con pilas AAA.
3.6.2. Software
Los softwares que se utilizaron se muestran en la figura tal, la siguiente lista muestra el orden de
las herramientas de software según la utilidad y tiempo de uso:
• Unity
Es el motor de desarrollo elegido en el estado del arte, se puede decir que fue la herramienta
3.6 Herramientas 72
con la que se enlazo todo el contenido generado a lo largo del proyecto con el resto de
herramientas.
• Blender
Es un software de diseño 3D que se utilizó para modelar los objetos y entorno virtual en
general. Por otro lado, también se utilizó sus herramientas para el retoque de los modelos
en NURBS importados de SolidWorks lo que quiere decir que todos los modelos que forman
parte del proyecto pasaron por este software.
• SolidWorks
Es el software CAD que se utilizó para el modelado en NURBS de los instrumentos neumáticos
que aparecen en la escena de Unity.
• SDK GoogleCardboard
Es un kit de desarrollo que permitió desarrollar de manera ágil cuatro de los requerimientos
en la etapa de programación.
• Android Studio
El proyecto utiliza el SDK y NDK de Android principalmente para exportar el programa de la
computadora al teléfono móvil y evita problemas de compatibilidad con diferentes versiones
del sistema operativo Android.
3.7 Costos 73
• FluidSim
Es un simulador de neumática que se utilizó de referencia para la creación de herramientas
didácticas en la escena de Unity.
• JDK
Es una herramienta demandada por Android Studio ya que en esencia el sistema operativo
de Android se basa en el lenguaje de programación Java.
3.7. Costos
El cálculo del costo total del proyecto se muestra en la tabla tal, posteriormente se detalla el costo
por categorı́as en las subsecciones de este apartado.
Para hallar el consumo de energı́a total del tiempo de desarrollo, se consideró que la energı́a utilizada
en el proyecto fue aproximadamente de seis dı́as a la semana, entre 6 a 7 horas por dı́a. Por tanto,
los cálculos del gasto en energı́a de la tabla tal, se basan en el tiempo de trabajo que son cinco
meses o 855 horas de trabajo y la tarifa por KWh de consumo de energı́a que en la ciudad de La
Paz es de 0.77Bs.
3.8 Resultados 75
3.8. Resultados
En este punto el proyecto es funcional y se han implementado todos los requerimientos planteados
en la etapa de planeación y retroalimentación.
3.8.1. Resultados
A) Definición de la solución
El proyecto que se desarrolló se puede definir como un entorno de realidad virtual que se puede
exportar a teléfonos móviles para realizar prácticas de la materia neumática e hidráulica (IMT-
241), con modelos virtuales basados en instrumentos neumáticos existentes en el laboratorio de la
UCB y en especı́fico con componentes de la serie MICRO.
B) Validación final
La validación de habilidades y conocimientos por parte del público objetivo se realizó a través del
docente experto en la materia de forma presencial como se muestra en la figura 3-38, el motivo
fue evitar contagios y proteger la salud del alumnado siguiendo las normas de distanciamiento social.
Finalmente, tras la experiencia se obtuvo el visto bueno del docente que encontró la interfaz del
usuario intuitiva y finalizando las pruebas, pidió un cambio en el requerimiento RF07, ya que vio
conveniente agregar una segunda confirmación para mejorar la comodidad del usuario y otro cambio
en el requerimiento RF15 para que el usuario pueda ver su progreso en todo momento. Las correc-
ciones y actualizaciones de los requerimientos observados del entorno se realizaron en el apartado
de validación como se muestra en la tabla 3-11.
El prototipo funcional final con las actualizaciones implementadas se muestra en la figura 3-39,
donde se puede observar que todos los requisitos son completamente funcionales y que se puede
llegar hasta la última etapa de interacciones en la plataforma Android. Las conexiones realizadas
en el circuito de la imagen funcionan a través de la matriz de adyacencia que se muestra en la figura
3-41, donde se puede apreciar una simetrı́a que demuestra en base a informes de depuración que
el algoritmo de las n conexiones funciona de la manera esperada.
sonidos y respuestas automáticas por parte del entorno. Finalmente una de las mejores formas de
evaluar los resultados puede ser basándose en la apariencia, una práctica de laboratorio con los
mismo componentes se muestra en la figura 3-40.
4.1. Conclusiones
Terminado el desarrollo y documentación del proyecto se puede concretizar que:
• La premisa que plantea el objetivo general del proyecto se ha cumplido, ya que el software
desarrollado cuenta con algoritmos idóneos para que los alumnos de la carrera de ingenierı́a
mecatrónica experimenten y se familiaricen con los contenidos teóricos y prácticos de la
materia de NEUMÁTICA E HIDRÁULICA (IMT-241) a través de la realidad virtual.
• Si bien el trabajo cuenta con un análisis más profundo y enfocado a los instrumentos neumáti-
cos de la serie MICRO, no significa que los algoritmos desarrollados no se puedan aplicar a
otro tipo de circuitos y componentes que son parte de la materia, ya que las conexiones están
presentes en todo tipo de circuitos y en diferentes asignaturas a lo largo de la carrera, donde
las fı́sicas de manipulación de objetos e inclusive la de cables y mangueras es totalmente
aplicable y útil.
• Los modelos y prototipos tanto de los instrumentos, como del ambiente de laboratorio im-
plementados en el proyecto pueden generar en el usuario las tres ilusiones que distinguen a
la realidad virtual de otro tipo de simuladores, produciendo potencial para reducir el uso
indebido de los instrumentos del laboratorio y evitar los accidentes ocasionados por error de
principiante por parte del alumnado, ya que el entorno de realidad virtual implementado se
puede dotar a los estudiantes destinatarios previo a la realización de una práctica generando
en su memoria, conocimiento teórico y practico del área.
• El proyecto no solo es una solución a la problemática planteada, la razón es que viene con
múltiples beneficios que podrı́an ayudar a crecer aún más a la carrera, simulando laboratorios
de otras asignaturas que puedan utilizar la interfaz de usuario, los algoritmos y los modelos
que se ha implementado en el proyecto. El beneficio para la universidad seria la reducción en
gasto de recursos y mantenimiento de equipos.
de laboratorio se pueden llevar a cabo en cualquier momento y sin horarios. Claro está que
también cuenta con deficiencias y limitaciones que cualquier aplicación de realidad virtual,
la diferencia radica en que estas se pueden solventar en próximas versiones.
• El prototipo permite difundir aprendizaje con un método constructivista ya que las practicas
son individuales, debido a esto los alumnos podrı́an mejorar su capacidad de análisis y mejorar
su toma de decisiones en prácticas reales.
4.2. Recomendaciones
Los programas desarrollados para realidad virtual no son aptos para epilépticos, ya que se corren
altos riesgos de sufrir un ataque. Tampoco es recomendable el uso en niños menores a los 7 años, la
razón es que aun a esa edad el ser humano no ha desarrollado por completo la visión estereoscópica
y eso podrı́a generar problemas a la larga.
Antes de empezar con el desarrollo de un proyecto similar, es recomendable tener buenas prácticas
en programación orientada a objetos y saber sobre resolución de algoritmos, ya que en muchos
casos se deberá generar algoritmos muy especı́ficos o existirán una cantidad reducida de soluciones,
la razón es que el interés en realidad virtual recién ha brotado en los últimos años.
Tomando en cuenta que la realidad virtual es una tecnologı́a emergente no existen formas predefini-
das para aplicabilidad e ingenierı́a de software, es recomendable hacer una investigación exhaustiva
en metodologı́as que se ajusten a los requerimientos del proyecto.
• La segunda versión del proyecto podrı́a incluir un modo en multiusuario a través de internet,
para que las prácticas de laboratorio se realicen de forma grupal o con supervisión del docente
a larga distancia.
• La realidad virtual avanza muy rápido, quizá lo mejor para trabajos futuros sea cambiar de
plataforma a algún visor de la empresa Oculus, ya que es la única empresa que a empezado
a bajar el precio de sus visores y pronto podrı́an ser dispositivo accesibles para el público en
general.
Bibliografı́a
[2] J. Vary, “Informe de la reunión de expertos sobre laboratorios virtuales,” Instituto Interna-
cional de Fı́sica Teórica y Aplicada (IITAP), Ames, Iowa–UNESCO, Parı́s, 2000.
[6] A. Loureiro and T. Bettencourt, “The use of virtual environments as an extended classroom–a
case study with adult learners in tertiary education,” Procedia Technology, vol. 13, pp. 97–106,
2014.
[7] D. D. McMahon, D. F. Cihak, R. E. Wright, and S. M. Bell, “Augmented reality for teaching
science vocabulary to postsecondary education students with intellectual disabilities and au-
tism,” Journal of Research on Technology in Education, vol. 48, no. 1, pp. 38–56, 2016.
[8] R. Estriegana, J.-A. Medina-Merodio, and R. Barchino, “Student acceptance of virtual labo-
ratory and practical work: An extension of the technology acceptance model,” Computers &
Education, vol. 135, pp. 1–14, 2019.
[10] F. Wang, X. Xu, W. Feng, J. B. Vesga, Z. Liang, and S. Murrell, “Towards an immersive
guided virtual reality microfabrication laboratory training system,” in 2020 IEEE Conference
on Virtual Reality and 3D User Interfaces Abstracts and Workshops (VRW), 2020, pp. 796–
797.
BIBLIOGRAFÍA 83
[12] D. Kamińska, T. Sapiński, N. Aitken, A. Della Rocca, M. Barańska, and R. Wietsma, “Vir-
tual reality as a tool in mechatronics education,” in 2017 18th International Symposium on
Electromagnetic Fields in Mechatronics, Electrical and Electronic Engineering (ISEF) Book of
Abstracts, 2017, pp. 1–2.
[13] E. Handoko and D. Gunawan, “Parabolix: Educational simulation game on classical mechanics
based on virtual reality and perlin noise algorithm,” in 2019 5th International Conference on
New Media Studies (CONMEDIA), 2019, pp. 165–170.
[15] STRIVR. (2016-12-14) Safety on the floor: How bmw uses virtual reality for safety awareness.
[Online]. Available: https://www.strivr.com/resources/customers/bmw/
[17] D. Cantón Enrı́quez, J. J. Arellano Pimentel, M. Á. Hernández López, and O. S. Nieva Garcı́a,
“Uso didáctico de la realidad virtual inmersiva con interacción natural de usuario enfocada a
la inspección de aerogeneradores,” Apertura (Guadalajara, Jal.), vol. 9, no. 2, pp. 8–23, 2017.
[18] D. A. Garcı́a Fernández and D. L. Patiño Aguilar, “Desarrollo de una herramienta de apoyo
para el estudio de la naturaleza de la luz usando realidad virtual inmersiva,” 2017.
[19] F. E. Correa Falcón, “Creación de una aplicación interactiva utilizando realidad virtual para
plataforma android,” B.S. thesis, Quito: UCE, 2018.
[20] P. A. López Encalada, “Desarrollo de una aplicación para simular un vuelo con realidad vir-
tual por el entorno ecuatoriano con el avión de combate de las fuerzas armadas del ecuador
“tucano”, para plataformas android utilizando unity y google vr,” B.S. thesis, Quito: UCE,
2019.
[22] N. M. Papachristos, I. Vrellis, and T. A. Mikropoulos, “A comparison between oculus rift and
a low-cost smartphone vr headset: immersive user experience and learning,” in 2017 IEEE
17th International Conference on Advanced Learning Technologies (ICALT). IEEE, 2017,
pp. 477–481.
BIBLIOGRAFÍA 84
[24] A. Borrego, J. Latorre, M. Alcaniz, and R. Llorens, “Comparison of oculus rift and htc vive:
feasibility for virtual reality-based exploration, navigation, exergaming, and rehabilitation,”
Games for health journal, vol. 7, no. 3, pp. 151–156, 2018.
[27] M. A. Festini Wendorff and C. M. Torres Ferreyros, “Desarrollo de un videojuego con unreal
engine,” 2017.
[28] R. Boyd, “Implementing reinforcement learning in unreal engine 4 with blueprint,” Ph.D.
dissertation, University Honors College, Middle Tennessee State University, 2017.
[29] A. Juliani, V.-P. Berges, E. Vckay, Y. Gao, H. Henry, M. Mattar, and D. Lange, “Unity: A
general platform for intelligent agents,” arXiv preprint arXiv:1809.02627, 2018.
[30] N. Nurym, R. Sambetova, M. Azybaev, and N. Kerimbayev, “Virtual reality and using the
unity 3d platform for android games,” in 2020 IEEE 10th International Conference on Inte-
lligent Systems (IS). IEEE, 2020, pp. 539–544.
[32] C. Sultan, M. Corless, and R. E. Skelton, “Tensegrity flight simulator,” Journal of Guidance,
Control, and Dynamics, vol. 23, no. 6, pp. 1055–1064, 2000.
[34] P. Luckey, B. I. Trexler, G. England, and J. McCauley, “Virtual reality headset,” Sep. 8 2015,
uS Patent App. 29/472,807.
[35] D. W. Carruth, “Virtual reality for education and workforce training,” in 2017 15th Interna-
tional Conference on Emerging eLearning Technologies and Applications (ICETA). IEEE,
2017, pp. 1–6.
[36] M. Slater, “Place illusion and plausibility can lead to realistic behaviour in immersive virtual
environments,” Philosophical Transactions of the Royal Society B: Biological Sciences, vol.
364, no. 1535, pp. 3549–3557, 2009.
BIBLIOGRAFÍA 85
[37] A. Borrego, J. Latorre, M. Alcañiz, and R. Llorens, “Embodiment and presence in virtual
reality after stroke. a comparative study with healthy subjects,” Frontiers in neurology, vol. 10,
p. 1061, 2019.
[42] W. F. Santos Rodriguez et al., “Aplicación de sistemas mems integrados en smartphones para
la detección y análisis de vibraciones mecánicas de baja frecuencia de estructuras civiles.”
[43] K. L. Zegarra Tacsa, “Grúa mecatrónica de tres grados de libertad basada en cables y contro-
lada por dispositivo móvil: Gm-lk.”
[44] V. Google, “Google vr ndk controller, google developers,” Oct 2018. [Online]. Available:
https://developers.google.com/vr/reference/gvr-ndk-controller
[45] W. E. Acevedo Sierra, “Acelerometro, principio y aplicacion del sensor de aceleracion emplean-
do la tecnologia mems (micro electro-mechanical systems).” Ph.D. dissertation, Universidad
Industrial de Santander, Escuela de Ingenierı́a Eléctrica . . . , 2004.
[46] F. J. Somma, “Cuaterniones y ángulos de euler para describir rotaciones en,” Ph.D. disserta-
tion, UNIVERSIDAD ABIERTA INTERAMERICANA, 2018.
[47] G. T. del Castillo, “La representación de rotaciones mediante cuaterniones,” Miscelanea Ma-
temtica, pp. 43–50, 1999.
[48] J. Chen, “Open sourcing google cardboard,” Nov 2019. [Online]. Available: https:
//developers.googleblog.com/2019/11/open-sourcing-google-cardboard.html
[49] O. Meza and M. Ortega, “Grafos y algoritmos,” Equinoccio, Ediciones de la Universidad Simón
Bolı́var. Caracas, 1993.
[50] E. Coto, “Algoritmos básicos de grafos,” Lecturas en Ciencias de computación. ISSN 1316,
vol. 6239, 2003.
BIBLIOGRAFÍA 86
[51] E. Simó Mezquita, Vulnerabilidad del diámetro de ciertas familias de grafos. Universitat
Politècnica de Catalunya, 1995.
[52] F. Rincón, N. Henao, and P. Beltrán, “De los sólidos platónicos a los arquimedianos: un estudio
desde las matrices de adyacencia,” 2017.
[56] D. Gallardo López and C. Pomares Puig, “Programación orientada a objetos,” Lenguajes y
Paradigmas de Programación, 2008.
[58] U. Technologies, “Unity user manual (2019.4 lts),” 2020. [Online]. Available: https:
//docs.unity3d.com/Manual/UnityManual.html
[59] J. Antón Alonso and X. Zhu Chen, “Estudio y simulación de un vehı́culo autopilotado en unity
5 haciendo uso de algoritmos de aprendizaje automático,” 2018.
[61] J. Rojas, R. Martı́nez, and M. Morales, “Mecánica 3d: python y el algoritmo de verlet,” Revista
mexicana de fı́sica E, vol. 60, no. 1, pp. 51–65, 2014.
APÉNDICE A
Anexo: Scripts
En este apartado se incluyeron los guiones más esenciales para el funcionamiento del programa y
los que podrı́an ser de interés de los lectores.
using System . C o l l e c t i o n s ;
using System . C o l l e c t i o n s . G e n e r i c ;
using UnityEngine ;
using UnityEngine . UI ;
p u b l i c c l a s s TeleportManager : MonoBehaviour
{
#r e g i o n S i n g l e t o n
p r i v a t e s t a t i c TeleportManager i n s t a n c e ;
p u b l i c s t a t i c TeleportManager I n s t a n c e
{
get
{
i f ( i n s t a n c e == n u l l )
{
i n s t a n c e = new TeleportManager ( ) ;
}
return instance ;
}
}
#e n d r e g i o n
[ Header ( ” T e l e p o r t ” ) ]
A.1 Lógica de locomoción 88
p u b l i c Image imgFade ;
[ Range ( 0 f , 1 f ) ] p u b l i c f l o a t t i m e T e l e p o r t = 0 . 5 f ;
p u b l i c Transform p l a y e r ;
f l o a t playerGroundPos ; / / v a r i a b l e para e v i t a r que s e m o d i f i q u e l a
p o c i s i o n o r i g i n a l d e l p l a y e r en y
p r i v a t e v o i d Awake ( )
{
i f ( i n s t a n c e == n u l l )
{
instance = this ;
}
else
{
Destroy ( gameObject ) ;
}
}
void Start ( )
{
playerGroundPos = p l a y e r . p o s i t i o n . y ;
Fade ( t r u e ) ;
}
p u b l i c v o i d Fade ( b o o l i s F a d e I n )
{
i f ( i s F a d e I n ) imgFade . CrossFadeAlpha ( 0 , t i m e T e l e p o r t , t r u e ) ;
//0 i n v i s i b l e , tiempo 0 , 5 s , i g n o r a t i m e s c a l e
e l s e imgFade . CrossFadeAlpha ( 1 , t i m e T e l e p o r t , t r u e ) ;
}
p u b l i c v o i d T e l e p o r t ( Vector3 newPos ) // r e c i b e p o s i c i o n de t e l e p o r t
point
{
S t a r t C o r o u t i n e ( MovePosition ( newPos ) ) ;
}
IEnumerator MovePosition ( Vector3 newPos )
{
Fade ( f a l s e ) ;
y i e l d r e t u r n new WaitForSeconds ( t i m e T e l e p o r t ) ;
p l a y e r . p o s i t i o n = new Vector3 ( newPos . x , newPos . y +
playerGroundPos , newPos . z ) ;
y i e l d r e t u r n new WaitForSeconds ( t i m e T e l e p o r t ) ;
Fade ( t r u e ) ;
A.2 Integral de Verlet 89
}
}
u s i n g UnityEngine ;
u s i n g System ;
u s i n g System . C o l l e c t i o n s ;
p u b l i c c l a s s HoseComponent : MonoBehaviour
{
#r e g i o n C l a s s members
p u b l i c LineRenderer l i n e ;
p r i v a t e DrawVerlet [ ] p o i n t s ;
[ S e r i a l i z e F i e l d ] p r i v a t e Transform endPoint ;
public Material hoseMaterial ;
[ S e r i a l i z e F i e l d ] p r i v a t e f l o a t hoseLength = 0 . 5 f ;
[ SerializeField ] private int totalSeg = 5;
[ S e r i a l i z e F i e l d ] p r i v a t e f l o a t segpu = 2 f ;
p r i v a t e i n t segments = 0 ;
[ S e r i a l i z e F i e l d ] p r i v a t e f l o a t hoseW = 0 . 1 f ;
#e n d r e g i o n
#r e g i o n I n i t i a l s e t u p
void Start ( )
{
InitDrawVerlets () ;
InitLineRenderer () ;
}
void InitDrawVerlets ( )
A.2 Integral de Verlet 90
i f ( t o t a l S e g > 0)
segments = t o t a l S e g ;
else
segments = Mathf . C e i l T o I n t ( hoseLength ∗ segpu )
;
Vector3 c a b l e D i r e c t i o n = ( endPoint . p o s i t i o n − t r a n s f o r m
. p o s i t i o n ) . normalized ;
f l o a t i n i t i a l S e g m e n t L e n g t h = hoseLength / segments ;
p o i n t s = new DrawVerlet [ segments + 1 ] ;
f o r ( i n t p o i n t I d x = 0 ; p o i n t I d x <= segments ; p o i n t I d x
++) {
Vector3 i n i t i a l P o s i t i o n = t r a n s f o r m . p o s i t i o n +
( cableDirection ∗ ( initialSegmentLength ∗
pointIdx ) ) ;
p o i n t s [ p o i n t I d x ] = new DrawVerlet (
initialPosition ) ;
}
DrawVerlet s t a r t = p o i n t s [ 0 ] ;
DrawVerlet end = p o i n t s [ segments ] ;
s t a r t . Bind ( t h i s . t r a n s f o r m ) ;
end . Bind ( endPoint . t r a n s f o r m ) ;
}
void InitLineRenderer ( )
{
l i n e = t h i s . gameObject . AddComponent<LineRenderer >() ;
l i n e . SetWidth ( hoseW , hoseW ) ;
l i n e . SetVertexCount ( segments + 1 ) ;
l i n e . GetComponent<Renderer >() . e n a b l e d = t r u e ;
l i n e . material = hoseMaterial ;
}
#e n d r e g i o n
A.2 Integral de Verlet 91
#r e g i o n Render Pass
v o i d Update ( )
{
RenderCable ( ) ;
v o i d RenderCable ( )
{
f o r ( i n t p o i n t I d x = 0 ; p o i n t I d x < segments + 1 ;
p o i n t I d x++)
{
l i n e . SetPosition ( pointIdx , points [ pointIdx ] .
Position ) ;
}
}
#e n d r e g i o n
#r e g i o n V e r l e t i n t e g r a t i o n & s o l v e r p a s s
v o i d FixedUpdate ( )
{
for ( int verletIdx = 0; verletIdx < verletite ;
v e r l e t I d x ++)
{
VerletIntegrate () ;
SolveConstraints () ;
}
}
void V e r l e t I n t e g r a t e ( )
{
Vector3 g r a v i t y D i s p l a c e m e n t = Time . f i x e d D e l t a T i m e ∗
Time . f i x e d D e l t a T i m e ∗ −1;
f o r e a c h ( DrawVerlet p a r t i c l e i n p o i n t s )
{
p a r t i c l e . UpdateVerlet ( gravityDisplacement ) ;
}
A.2 Integral de Verlet 92
void SolveConstraints ( )
{
#e n d r e g i o n
#r e g i o n S o l v e r C o n s t r a i n t s
void SolveDistanceConstraint ( )
{
f l o a t segmentLength = hoseLength / segments ;
f o r ( i n t SegIdx = 0 ; SegIdx < segments ; SegIdx++)
{
DrawVerlet parA = p o i n t s [ SegIdx ] ;
DrawVerlet parB = p o i n t s [ SegIdx + 1 ] ;
v o i d S o l v e D i s t a n c e C o n s t r a i n t ( DrawVerlet p a r t i c l e A , DrawVerlet
p a r t i c l e B , f l o a t segmentLength )
{
Vector3 d e l t a = p a r t i c l e B . P o s i t i o n − par
A. P o s i t i o n ;
f l o a t c u r r e n t D i s t a n c e = d e l t a . magnitude ;
f l o a t e r r o r F a c t o r = ( c u r r e n t D i s t a n c e − segmentLength ) /
currentDistance ;
A.2 Integral de Verlet 93
void S o l v e s t i f f ( )
{
f l o a t d i s t a n c e = ( p o i n t s [ 0 ] . P o s i t i o n − p o i n t s [ segments
] . P o s i t i o n ) . magnitude ;
i f ( d i s t a n c e > hoseLength )
{
f o r e a c h ( DrawVerlet p a r t i c l e i n p o i n t s )
{
SolvestiffConstraint ( particle , distance
);
}
}
}
v o i d S o l v e s t i f f ( DrawVerlet DrawVerlet , f l o a t d i s t a n c e )
{
#e n d r e g i o n
}
A.3 Logica de Interpolación 94
u s i n g System . C o l l e c t i o n s ;
u s i n g System . C o l l e c t i o n s . G e n e r i c ;
u s i n g UnityEngine ;
p u b l i c c l a s s I n t e r p o l a t i o n M a n a g e r : MonoBehaviour
{
#r e g i o n S i n g l e t o n
private s t a t i c InterpolationManager instance ;
public s t a t i c InterpolationManager Instance
{
get
{
i f ( i n s t a n c e == n u l l )
{
i n s t a n c e = new I n t e r p o l a t i o n M a n a g e r ( ) ;
}
return instance ;
}
}
#e n d r e g i o n
p r i v a t e v o i d Awake ( )
{
i f ( i n s t a n c e == n u l l )
{
instance = this ;
}
else
{
Destroy ( gameObject ) ;
}
}
p u b l i c v o i d I n t e r p o l a t i o n ( Vector3 moveTo , GameObject o b j e c t )
{
S t a r t C o r o u t i n e ( I n t e r p o l a t i o n P o s i t i o n ( moveTo , o b j e c t , 0 . 7 f ) ) ;
//Debug . Log ( ” Mis manos e s t a n l l e n a s ” ) ;
}
IEnumerator I n t e r p o l a t i o n P o s i t i o n ( Vector3 t a r g e t P o s i t i o n ,
GameObject o b j e c t , f l o a t d u r a t i o n )
{
f l o a t time = 0 ;
A.4 Lógica del Grafo y Retı́cula de selección 95
Vector3 s t a r t P o s i t i o n = o b j e c t . transform . p o s i t i o n ;
w h i l e ( time < d u r a t i o n )
{
o b j e c t . t r a n s f o r m . p o s i t i o n = Vector3 . Lerp ( s t a r t P o s i t i o n ,
t a r g e t P o s i t i o n , time / d u r a t i o n ) ;
time += Time . deltaTime ;
yield return null ;
}
// o b j e c t . gameObject . S e t A c t i v e ( f a l s e ) ;
i f ( o b j e c t . name == ” l e n t e s ” )
{
object . SetActive ( f a l s e ) ;
}
o b j e c t . transform . p o s i t i o n = t a r g e t P o s i t i o n ;
}
}
u s i n g System . C o l l e c t i o n s ;
u s i n g UnityEngine ;
u s i n g UnityEngine . UI ;
p u b l i c c l a s s R e t i c l e S e l e c t i o n : MonoBehaviour
{
p u b l i c Image R e t i c l e T ;
p u b l i c f l o a t timTotal ;
p u b l i c f l o a t timCurrent ;
public bool i n t e r a c t i o n ;
p r i v a t e Ray cast Hit h i t ;
// t o o l s l o g i c
p u b l i c GameObject myHands ;
GameObject t o o l ;
[ SerializeField ]
p r i v a t e b o o l busyHands ;
p r i v a t e i n t a l l t o o l s =0;
// l o g i c h o s e
GameObject h o s e ;
A.4 Lógica del Grafo y Retı́cula de selección 96
// c o n e c t i o n s
private s t r i n g phrase ;
p u b l i c s t r i n g [ , ] c o n e x i o n e s = new s t r i n g [ 2 5 , 2 5 ] ;
// v e r i f i c a r
p r i v a t e i n t [ , ] s o l u t i o n s = new i n t [ 2 5 , 2 ] ;
// I n t e r a c t u a b l e s
A n i m a t o r C o n t r o l l e r P a r a m e t e r param ;
p u b l i c Animator ani , CDE;
p u b l i c GameObject c i l i n d r o ;
bool f l a g ;
// CountManager
p u b l i c CountManager countManager ;
p u b l i c i n t phase ;
i n t count ;
// G a m i f i c a t i o n
[ SerializeField ]
private Material HoseMaterial ;
[ SerializeField ]
private Material ConectorMaterial ;
i n t puntos ;
// Probe
public f l o a t rotationSpeed = 30;
void Start ( )
{
T im er E xi t ( ) ;
Crear Matriz () ;
phaseLab ( ) ;
countManager = GameObject . Find ( ” GameManager ” ) . GetComponent<
CountManager >() ;
}
v o i d Update ( )
{
Timer ( ) ;
p322 . t r a n s f o r m . p o s i t i o n = t e m p P o s i t i o n ;
mem++;
}
i f ( puntos ==9 && mem==0)
{
phaseLab ( ) ;
}
}
public void Cilindro ( bool estado )
{
CDE = c i l i n d r o . GetComponent<Animator >() ;
CDE. S e t B o o l ( ”COn” , e s t a d o ) ;
}
IEnumerator Espera ( b o o l e s t a d o )
{
y i e l d r e t u r n new WaitForSeconds ( 1 ) ;
a n i . S e t B o o l ( ”Go” , f a l s e ) ;
Cilindro ( estado ) ;
}
IEnumerator c o n e c t o r C o l o r ( MeshRenderer [ ] c o n e c t o r s )
{
y i e l d r e t u r n new WaitForSeconds ( 0 . 5 f ) ;
f o r e a c h ( var n e g r i i n c o n e c t o r s )
{
n e g r i . m a t e r i a l = Conector ;
}
}
p r i v a t e v o i d Timer ( )
{
i f ( interaction )
{
p r i n t ( ” Estoy d e t e c t a n d o a l g o ” ) ;
i f ( h o s e . GetComponent<CableComponent >() )
{
LineRenderer HoseMaterialx = hose .
GetComponent<CableComponent >() . l i n e ;
HoseMaterialx . material = HoseMaterial ;
}
break ;
A.4 Lógica del Grafo y Retı́cula de selección 99
c a s e ”mesa ” :
t o o l . t r a n s f o r m . S e t P a r e n t ( gameObject .
transform . parent ) ;
i f ( phase == 1 ) h i t . c o l l i d e r . gameObject .
GetComponent<B o x C o l l i d e r >() . e n a b l e d =
false ;
InterpolationManager . Instance . Interpolation
( h i t . point , t o o l ) ;
p r i n t ( ” Deje e l o b j e t o en : ” + h i t . c o l l i d e r .
name ) ;
break ;
case ” conector ”:
h i t . c o l l i d e r . GetComponent<B o x C o l l i d e r >() .
enabled = f a l s e ;
count = numberTool ( h i t . c o l l i d e r . name ) ;
p r i n t ( ” c o n e c t a n d o a ”+ h i t . c o l l i d e r . name ) ;
C l a s i f i c a d o r C R ( h i t . c o l l i d e r . name . S p l i t ( ’ ’ )
, count ) ;
break ;
case ” t e l e p o r t s ”:
p r i n t ( ” T e l e p o r t t o : ” + h i t . c o l l i d e r . name )
;
TeleportManager . I n s t a n c e . T e l e p o r t ( h i t . p o i n t
);
break ;
c a s e ” camera2 ” :
TeleportManager . I n s t a n c e . T e l e p o r t ( h i t . p o i n t
);
break ;
case ” interactuable ”:
a n i = h i t . c o l l i d e r . gameObject . GetComponent<
Animator >() ;
s w i t c h ( h i t . c o l l i d e r . name )
{
c a s e ”SeguroVC ” :
i f ( f l a g == t r u e )
{
A.4 Lógica del Grafo y Retı́cula de selección 100
ani . SetBool (” i n t e r r u p t o r ” ,
false ) ;
flag = false ;
p r i n t ( ” todo apagado ” ) ;
}
else
{
ani . SetBool (” i n t e r r u p t o r ” , true
);
f l a g = true ;
p r i n t ( ” todo e n c e n d i d o ” ) ;
}
break ;
c a s e ”1 Palanca V3 / 2 ” :
a n i . S e t B o o l ( ”Go” , t r u e ) ;
S t a r t C o r o u t i n e ( Espera ( t r u e ) ) ;
// C i l i n d r o ( t r u e ) ;
break ;
c a s e ”2 Palanca V3 / 2 ” :
a n i . S e t B o o l ( ”Go” , t r u e ) ;
S t a r t C o r o u t i n e ( Espera ( f a l s e ) ) ;
// C i l i n d r o ( f a l s e ) ;
break ;
default :
p r i n t ( ”NO HAY NINGUN INTERRUPTOR” ) ;
break ;
}
break ;
default :
p r i n t ( ” Tag d e s c o n o c i d o ” ) ;
break ;
}
}
}
}
}
p u b l i c v o i d Timer Enter ( )
{
interaction = true ;
A.4 Lógica del Grafo y Retı́cula de selección 101
}
p u b l i c v o i d T i me r E xi t ( )
{
interaction = false ;
ReticleT . fillAmount = 0;
timCurrent = 0 ;
}
public int Verification ( int [ ] spaceSolution )
{
int i = 0;
i n t j = s p a c e S o l u t i o n . Length −1;
w h i l e ( i <s p a c e S o l u t i o n . Length )
{
i f ( c o n e x i o n e s [ s p a c e S o l u t i o n [ i ] , s p a c e S o l u t i o n [ j ] ] ==
c o n e x i o n e s [ s p a c e S o l u t i o n [ j ] , s p a c e S o l u t i o n [ i ] ] &&
c o n e x i o n e s [ s p a c e S o l u t i o n [ i ] , s p a c e S o l u t i o n [ j ] ] != ””&&
c o n e x i o n e s [ s p a c e S o l u t i o n [ j ] , s p a c e S o l u t i o n [ i ] ] != ””
&& ! c o n e x i o n e s [ s p a c e S o l u t i o n [ i ] , s p a c e S o l u t i o n [ j ] ] .
Contains (” ”)
&& ! c o n e x i o n e s [ s p a c e S o l u t i o n [ j ] , s p a c e S o l u t i o n [ i ] ] .
Contains (” ”) )
{
p r i n t ( c o n e x i o n e s [ s p a c e S o l u t i o n [ i ] , s p a c e S o l u t i o n [ j ] ] +”
y ”+ c o n e x i o n e s [ s p a c e S o l u t i o n [ j ] , s p a c e S o l u t i o n [ i ] ]
+”son i g u a l e s ” ) ;
return 1;
}
i ++;
j −−;
}
return 0;
}
p u b l i c v o i d phaseLab ( )
{
i f ( phase == 0 )
{
s t r i n g [ ] d i s a b l e = { ” conector ” , ” hose ” , ” i n t e r a c t u a b l e ” } ;
disableBoxColliders ( disable ) ;
}
e l s e i f ( phase == 1 )
{
string [ ] disable = { ” tools ”};
A.4 Lógica del Grafo y Retı́cula de selección 102
disableBoxColliders ( disable ) ;
s t r i n g [ ] enable = { ” conector ” , ” hose ” } ;
enableBoxColliders ( enable ) ;
}
e l s e i f ( phase == 2 )
{
s t r i n g [ ] d i s a b l e = { ” conector ” , ” hose ” } ;
disableBoxColliders ( disable ) ;
s t r i n g [ ] enable = { ” interactuable ” };
enableBoxColliders ( enable ) ;
}
}
p u b l i c i n t numberTool ( s t r i n g nameTool )
{
int i = 0;
w h i l e ( nameTool != countManager . nameTool [ i ] )
{
i ++;
p r i n t ( countManager . nameTool [ i ] ) ;
}
return i ;
}
p u b l i c b o o l c o n e c t o r l i b r e ( s t r i n g e x t r e m o c a b l e , i n t pos )
{
i f ( c o n e x i o n e s [ pos , pos ] == ” ” )
{
c o n e x i o n e s [ pos , pos ] = e x t r e m o c a b l e ;
return true ;
}
A.4 Lógica del Grafo y Retı́cula de selección 103
return f a l s e ;
}
public int [ ] buscar par ( string extremo cable )
{
string extremo actual = extremo cable . S p l i t ( ’ ’ ) [ 0 ] ;
i n t [ ] c o n e c t o r e s = new i n t [ 2 ] ;
c o n e c t o r e s [ 0 ] = −1;
c o n e c t o r e s [ 1 ] = −1;
i n t aux = 0 ;
f o r ( i n t i = 0 ; i < 2 5 ; i ++)
{
i f ( c o n e x i o n e s [ i , i ] . S p l i t ( ’ ’ ) [ 0 ] == e x t r e m o a c t u a l )
{
c o n e c t o r e s [ aux ] = i ;
aux++;
}
}
return conectores ;
}
public void a s i g n a r i n s t r u m e n t o a l a m a t r i z ( i n t [ ] conectores , s t r i n g
cable )
{
f o r ( i n t i = 0 ; i < 2 5 ; i ++)
{
i f ( c o n e c t o r e s [ 0 ] == i | | c o n e c t o r e s [ 1 ] == i ) //
{
i f ( c o n e x i o n e s [ c o n e c t o r e s [ 0 ] , c o n e c t o r e s [ 1 ] ] == ”” &&
c o n e x i o n e s [ c o n e c t o r e s [ 0 ] , c o n e c t o r e s [ 1 ] ] == ” ” )
{
conexiones [ conectores [ 0 ] , conectores [ 1 ] ] = cable .
Split ( ’ ’) [ 0 ] ;
conexiones [ conectores [ 1 ] , conectores [ 0 ] ] = cable .
Split ( ’ ’) [ 0 ] ;
break ;
}
}
A.4 Lógica del Grafo y Retı́cula de selección 104
}
}
p u b l i c v o i d C l a s i f i c a d o r C R ( s t r i n g [ ] numero , i n t p o s i n s t r u m e n t o )
{
p r i n t ( ” Entre a l c o n e c t o r ”+ numero [ 2 ] +”de l a p i e z a ” + numero
[0]) ;
i f ( c o n e c t o r l i b r e ( h o s e . name , p o s i n s t r u m e n t o ) )
{
int negri ;
p r i n t(”=============================================”);
negri = pos instrumento ;
print ( negri ) ;
p r i n t ( ” e n t r e a l c o n e c t o r ”+ numero [ 2 ] + ” d e l i n s t r u m e n t o
e s t a l i b r e , conectando . . . ” ) ;
InterpolationManager . Instance . I n t e r p o l a t i o n ( h i t . point ,
h o s e ) ; / / r e c i e n i r a a su l u g a r
i n t [ ] c o n e c t o r e s = b u s c a r p a r ( h o s e . name ) ;
p r i n t ( ” l o s c o n e c t o r e s son : ” + c o n e c t o r e s [ 0 ] + ” , ” +
conectores [ 1 ] ) ;
i f ( c o n e c t o r e s [ 0 ] != −1 && c o n e c t o r e s [ 1 ] != −1)// s i ambos
c a b l e s e s t a n c o n e c t a d o s e s d e c i r guardados en l a m a t r i z
entran
{
p r i n t ( ” e l c a b l e e s t a c o n e c t a d o en ambas p a r t e s ” ) ;
a s i g n a r i n s t r u m e n t o a l a m a t r i z ( c o n e c t o r e s , h o s e . name ) ;
p r i n t ( ” Nueva c o n e x i o n en l a m a t r i z = ” + c o n e x i o n e s [
conectores [ 0 ] , conectores [ 1 ] ] ) ;
p r i n t ( ” Nueva c o n e x i o n en l a m a t r i z = ” + c o n e x i o n e s [
conectores [ 1 ] , conectores [ 0 ] ] ) ;
p r i n t(”==============================”);
// s o l u c i o n e s
i n t [ ] s o l = { 2 1 , 22 } ;
i n t [ ] s o l 2 = { 1 2 , 1 3 , 1 4 , 1 5 , 1 6 , 1 7 , 1 8 , 19 } ;
i f ( c o n e c t o r e s [ 0 ] == 7 && c o n e c t o r e s [ 1 ] == 2 3 ) puntos
++;
i f ( c o n e c t o r e s [ 0 ] == 8 && c o n e c t o r e s [ 1 ] == 2 4 ) puntos
++;
i f ( c o n e c t o r e s [ 0 ] == 10 && c o n e c t o r e s [ 1 ] == 1 1 ) puntos
A.4 Lógica del Grafo y Retı́cula de selección 105
++;
}
public void enableBoxColliders ( s t r i n g [ ] enable )
{
s t r i n g [ ] tagsToEnable = e n a b l e ;
f o r e a c h ( s t r i n g t a g i n tagsToEnable )
{
GameObject [ ] gameObjects = GameObject .
FindGameObjectsWithTag ( t a g ) ;
f o r e a c h ( GameObject gameObj i n gameObjects )
{
gameObj . GetComponent<B o x C o l l i d e r >() . e n a b l e d = t r u e ;
}
A.4 Lógica del Grafo y Retı́cula de selección 106
}
}
public void d i s a b l e B o x C o l l i d e r s ( s t r i n g [ ] d i s a b l e )
{
s t r i n g [ ] tagsToEnable = d i s a b l e ;
f o r e a c h ( s t r i n g t a g i n tagsToEnable )
{
GameObject [ ] gameObjects = GameObject .
FindGameObjectsWithTag ( t a g ) ;
f o r e a c h ( GameObject gameObj i n gameObjects )
{
gameObj . GetComponent<B o x C o l l i d e r >() . e n a b l e d = f a l s e ;
}
}
}
}