Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Objetivo:
1. Armar una Demo de Tour Virtual para VR utilizando Google VR
a. Demo de Google VR (que queremos lograr)
b. Ventajas respecto a técnicas anteriores (Custom Shader y raycast).
c. Concepto y entendimiento de Materiales y Pipeline de renderización (general)
d. Concepto y entendimiento de las funciones de la API Physics de Unity3D
e. Funciones de Debug
Queremos lograr al finalizar este trabajo práctico un tour virtual a través de un departamento
utilizando imágenes 360.
Para lograrlo haremos uso de las librerías de Google VR mas un par de materiales.
Es importante conocer para qué son y para que se utilizan los materiales en Unity, como así
también las ventajas que nos ofrecen a lo largo del desarrollo. En AR y VR muchas veces es
importante optimizar y como se mencionó en clases anteriores, comenzar con la parte gráfica
es lo más fácil y donde se pueden ver resultados a corto plazo.
Por lo tanto; antes de adentrarnos en el trabajo práctico vamos a entender las bases de los
elementos que lo componen y esto es;
● Materiales
● Raycasting (Explicación y funcionamiento)
Pero vamos a comenzar con el ejemplo práctico y explicando punto por punto:
Setting up de Unity
Antes de comenzar debemos tener:
1. El proyecto en Android
Además, modifica la mira (el aspecto de como se ve) para dar feedback al usuario de que está
apuntando a un objeto interactivo.
Este script simplemente lanza un RayCast al centro de la escena, seleccionando los objetos
que pueden ser “interactivos” (ya veremos luego cómo definir objetos “interactivos”).
Con estos pasos, podemos considerar que nuestra Cámara, pasó de ser una cámara normal a
una cámara AR.
Sin embargo vamos a hablar un poco más del concepto de “Raycast” mencionado unos
instantes atrás; ya que entender que es y cómo funciona nos será de utilidad para el trabajo
final (en caso de utilizar AR) y además nos servirá en cualquier proyecto que deseemos
encarar a futuro.
Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward),
out hit, Mathf.Infinity)
Entre otras ventajas de utilizar la API de physics se encuentra la de poder realizar las
comprobaciones en el momento que nosotros deseamos y no depender de que Unity realice
chequeos constantemente a ver que sucede.
Cable aclarar que para que el raycast funcione el elemento a colisionar debe tener un collider
asignado.
Un último elemento que nos falta asignar a la escena es el componente Gvr Pointer Input
Module al Event System.
GvrPointerInputModule
El componente provee una implementación del BaseInputModule de Google VR; el cual nos
permite interactuar no solo con objetos 3D en la escena sino también con los objetos de
interfaz.
Provee soporte para el controlador del DayDream y para los punteros de mira (Cardboard). Es
importante asociar este componente al EventSystem en la escena.
Al hacer esta operación nos permite que el un objeto que está siendo “apuntado” por el raycast
generado por GvrPointerPhysicsRaycaster pueda implementar un evento de interfaz
(EventTrigger).
Los eventos que dispara son: Enter, Exit, Down, Up, Click, Select, Deselect, UpdateSelected,
and GvrPointerHover.
EventSystem
Una escena de Unity debe tener una sola instancia del EventSystem. Cuando el
EventSystem está en la escena, comienza a buscar por cualquier otro componente (asociado
al mismo GameObject que el EventSystem) que sean del tipo (hereden) de
BaseInputModule, cuando el componente EventSystem detecta algún raycast o input,
comienza a actualizar esos scripts informando de la situación.
Por último para poder mover la cámara en el editor, es necesario que agreguemos un
“emulador” en la escena. Google VR nos provee dentro de la carpeta Prefabs un componente
GvrEditorEmulator.
La escena en este punto, debería verse similar a:
Es importante tener en cuenta ciertos factores de las imágenes que necesitamos utilizar para
crear el tour. Deben tener una relación de aspect ratio de 2:1 y proyección equirectangular
(haciendo referencia esto último al estiramiento que debe producirse en la parte superior e
inferior de la imagen).
Estas imágenes tienen que ser importadas en Unity como “Texture Shape: Cube”
Al seleccionar esta forma de textura, Unity considera la imagen como una colección de 6
texturas cuadradas, que pueden formar un cubo.
En la documentación de Unity hay más información al respecto (sobre todo para el uso de
cubemaps para mapas de reflexión): https://docs.unity3d.com/Manual/class-Cubemap.html Sin
embargo, la imagen que más nos interesa es la siguiente:
Como pueden ver, transforma la visualización de nuestra imagen de un plano 2D a una esfera
asignado distintos cuadrantes para cada parte de la misma (+/- X; +/- Y, etc).
Con esto ya tenemos lista nuestra imagen para utilizar en la escena. Sin embargo nos está
faltando algo muy importante para poder continuar y es el “Material” que nos permita utilizar
este cubemap en una Sphere de Unity.
Al hacer esto, nuestro material cambio de propiedades y como verán ahora nos deja incluir
como “Textura” un cubemap (y además setear la tonalidad).
Si hacemos click sobre el cuadrado de Textura (donde dice None) Veremos que la ventana que
se abre nos permite seleccionar nuestros texturas del tipo “Cube”.
a esto:
Y ya deberíamos tener una cámara que se mueve mirando alrededor de una esfera!.
Texturas son imágenes. Un material contiene referencias a texturas, para que el shader del
Material puede utilizar las texturas mientras calcula el color de la superficie de un objeto.
Entonces:
Un material especifica un shader en ser utilizado, y el shader utilizado determina qué
opciones están disponibles en el material. Un shader especifica una o más variables de
textura que espera utilizar.
Datos intrínsecos de los Shaders, pero que son importantes reconocer y tener en cuenta al
momento de determinar qué shaders utilizar y cuándo es el número de pasadas, el ideal de
escena debe contener la menor cantidad de materiales y la menor cantidad de pasadas por
material.
Unity nos provee una forma “Fácil” de estudiar los built-in shaders. Si seleccionamos un
material y nos vamos a la rueda de settings que aparece en la parte superior derecha de las
propiedades veremos que hay un opción “Edit Shader”.
Al hacer click nos lleva una ventana que es muy útil, por más que no estemos interesados en
modificar el shader en este momento.
Esto nos muestra un rápido overview del Shader, lo más interesante de esto, lo podemos ver
en la parte de Properties las cuales nos indican el nombre por el cual podremos acceder por
código a las propiedades del material y modificarlas!.
Como se puede ver, logramos acceder a una propiedad del material, que se llama _Color y
cambiarle el valor mediante código.
Por otro lado la misma pantalla nos provee un botón “Compile and Show code”, donde nos
muestra el código del Shader en cuestión.
Modificar cualquier valor ahí (sin saber mucho) puede causar que rompamos todo! así que
siempre es recomendable crear una copia del Shader antes de modificarlo.
Por último en la versión 2018 de Unity ya incluyeron un editor de Shaders (similar a lo que
hacia ShaderForge), que promete simplificar mucho el trabajo de armar custom shaders!.
Teletransportandome por los Rooms
Ya hemos visto cómo crear una cámara, un room; Nos estaría faltando la parte de poder
movernos entre los diferentes rooms.
Antes de comenzar vamos a clonar nuestra esfera inicial y nuestros Materiales. Es decir vamos
a crear una esfera por Room y además vamos a crear un material por esfera (utilizando las
distintas imágenes del Panorama).
Supongamos que tenemos 2 esferas, una para el Hall y una para el Dinning; en la ventana de
jerarquía deberíamos ver algo así:
Por último a la esfera recientemente creada le vamos a asignar un componente para que
capture el EventTrigger.
Add Component -> Event Trigger
Add New Event Type -> Pointer Click
Ahora bien, nos estaría faltando alguien que se encargue de recibir la orden de activar y
desactivar las esferas.
En la escena creamos un nuevo GameObject (empty), con el nombre que deseen. Dejando la
escena de esta forma.
Linkeamos de la misma forma todas las esferas. Y si hicimos todo bien y le damos play;
deberíamos poder navegar por todas las esferas.