Tuesday, February 21, 2017

Leyendo los datos de entrada del Oculus

El objetivo de esta sesión fue aprender a leer y a usar los diferentes tipos de input que puede dar el oculus como el tracking de la cabeza y los botones del control remoto. Para lograr el objetivo, desarrolle parte de un demo en donde el jugador debe navegar por una escena de una ciudad en ruinas, la perspectiva del jugador es de primera persona, la dirección en la que se mueve está determinada por la posición de su cabeza y con el control remoto acelera o cambia su velocidad.


Tracker de rotación de la cabeza


Para entender cómo se leen los inputs del tracking, descargue el demo VR de "Flyer", en este demo se controla la dirección de una nave con el movimiento de la cabeza. Esta nave siempre está moviéndose hacia adelante.

Demo Flyer

Luego de un poco de búsqueda, encontré que en el script FlyerMovementController se cambia la posición de la nave teniendo en cuenta el movimiento de rotación de la cabeza del usuario.

Script del movimiento de la nave

Específicamente en el método MoveFlyer, en las dos primeras líneas se obtiene un cuaternio que representa la rotación de la cabeza, para acceder a este cuaternio se usa el método GetLocalRotation de la clase VR.InputTracking, a este método se le debe pasar por parámetro el nodo VR del cual se quiere obtener la información.

Código para leer el tracking


La clase VR.InputTracking ofrece los siguientes 3 métodos, el de interés es el método de GetLocalRotation como se mencionó anteriormente.

Documentación de la clase

El nodo VR mencionado es según la documentación, uno de 6 posibles elementos que le pueden dar datos de entrada de tracking a Unity, en este caso se quiere obtener el tracking de la cabeza.

Documentación de VRNode

Es interesante resaltar que gracias a las interfaces que expone Unity, estos métodos para obtener información de tracking no solo funcionan para el Oculus, sino que también funcionan para otros HDM como el HTC Vive, esto elimina el problema de tener que hacer un código diferente para cada tipo de dispositivo de entrada.

Input del control remoto


Leer este input no represento un mayor problema gracias a la documentación oficial, para leer el input se usa la clase UnityEngine.Input, si se desea verificar que el control remoto está bien configurado y listo para ser usado se puede usar el método UnityEngine.Input.GetJoystickNames(), este método retorna una lista de nombres que son los dispositivos de entrada que detecta Unity, el control remoto aparece con el nombre “Oculus Remote”. Para escuchar los eventos de los botones se usan los “mappings” descritos en la documentación.

Documentación de datos de entrada del control remoto
    


En caso de que no se disponga de un control remoto, se pueden realizar pruebas usando un control de Xbox como análogo.

Proyecto de aplicación


Para iniciar, descargué un asset de la ciudad en ruinas de la tienda de Unity.

Escena del asset descargado

Esta escena serviría como base para el demo de volar usando el tracking de la cabeza y el input del control remoto.
La razón por la que elegí esta escena es porque primero, la calidad y los efectos ambientales son bastantes buenos, por lo que la experiencia en un dispositivo como el Oculus va a ser mejor ya que gracias a su poder de procesamiento, todos estos detalles de la escena se podrán captar mejor y en turno la inmersión del usuario aumentara, la segunda razón por la que escogí esta escena, es porque fue diseñada para ser experimentada en primera persona, la escena tiene un objeto que representa el jugador, sobre este objeto se aplicara lo aprendido de como leer los inputs de tracking de rotación de la cabeza y del control remoto del oculus.
Se identificaron los dos scripts que son necesarios modificar para cambiar la rotación del jugador con el mouse a la rotación con el oculus y el movimiento hacia delante con el teclado al movimiento con el control remoto.

Scripts del objeto jugador


En la siguiente sesión hare las modificaciones necesarias y añadiré más datos de salida al oculus basándome en otros demos oficiales de Unity.

No comments:

Post a Comment