Experimentar con la vista previa remota instantánea de Unity en Vive Focus

Estos días estoy jugando un poco con los dos dispositivos independientes que tengo en la oficina: el Vive Focus y el Oculus Go. Me gustan estos dos juguetes … ofrecen realidad virtual fácil de usar. Pero hay una cosa que detesto desarrollar para auriculares independientes: el tiempo de despliegue.

Si alguna vez desarrolló para dispositivos móviles, seguramente conoce el dolor de tener que construir continuamente para probar todo: cada vez que desee probar una modificación, debe presionar el botón «Construir y ejecutar», esperar años para el programa. para compilar y especialmente para implementar en el dispositivo y al final finalmente puede probar el programa … tal vez solo para descubrir que hizo la compilación con un parámetro incorrecto y, por lo tanto, tiene que compilar nuevamente para realizar la prueba. Edades de desarrollo pasaron de esta manera.

Es por eso algunos entornos de desarrollo XR le ofrecen la función Vista previa instantánea. Esta función le permite simplemente presionar Reproducir dentro del Editor de Unity para ver mágicamente el contenido de la aplicación dentro de sus auriculares XR, sin construir nada. Esta magia es posible porque en el dispositivo se instala una aplicación complementaria que funciona junto con el editor de Unity, de modo que:

  • Unity realmente ejecuta la aplicación en la PC y luego transmite el renderizado de la cámara a la aplicación complementaria, que lo muestra en la pantalla del dispositivo.
  • La aplicación complementaria obtiene los datos de los auriculares. (rotación, posición, etc…) y los envía a Unity que puede cambiar la pose de la cámara principal.

He usado esta característica asombrosa con HoloLens, donde Realmente me resultó muy útil hacer prototipos rápidamente… Y sé que también se ha implementado en la plataforma Daydream. Otras plataformas, incluida Gear VR, no cuentan con este truco útil … es por eso que cuando se desarrolla para Gear VR, generalmente se sugiere desarrollar en PC con un Rift adjunto (las Utilidades de Oculus para Unity son las mismas para todos los dispositivos Oculus …) y luego use un dispositivo Gear VR real solo para los refinamientos y pruebas finales.

cómo grabar vídeo en directo del enfoque vive
Yo jugando con los auriculares Vive Focus

Intenté buscar algo similar para el Vive Focus y … en realidad no encontré nada. Entonces, tuve esta loca idea: ¿Por qué no escribo un prototipo yo mismo? Soy un desarrollador mediocre y soy muy vago, pero tal vez pueda encontrar una manera de hacer algo que funcione. Me sentí empoderado por el espíritu de los 30 días en realidad virtual, así que decidí sumergirme en esta experimentación, con la idea de crear algo genial para la realidad virtual y luego compartirlo con la comunidad. Muy orgulloso de mí mismo, comencé a pasar los últimos dos días experimentando con la implementación de una función de vista previa instantánea para mi Vive Focus (en realidad, el de Mister President).

Siendo perezoso, no quería desarrollar todo desde cero, así que busqué algo que ya hiciera algo similar. Descubrí con mucha sorpresa que Unity ya cuenta con una función de vista previa instantánea móvil súper útil: se llama Unidad remota. Tienes que instalar la aplicación Unity Remote 5 en tu teléfono Android, luego establecer una configuración de editor especial dentro de Unity … ¡y puedes probar una aplicación en tu teléfono con solo presionar play dentro de Unity! Y funciona como un encanto. Pasé toda mi vida sin saber esto … ¡Quiero recuperar un año de mi vida dedicado a probar cosas realizándolas en teléfonos Android!

De todos modos, el problema es que Unity Remote 5 es una aplicación estándar de Android, por lo que no es compatible con el ecosistema Vive Wave y no se puede ejecutar en el Focus. Maldita sea, se veía tan bien. Pero afortunadamente, su versión anterior, Unity Remote 4, está disponible como Unity Package en la tienda de activos. Así que lo descargué dentro de un proyecto, importé el SDK de Vive Wave e implementé la aplicación en el Focus. Se lanzó correctamente. Presioné Reproducir dentro de un proyecto de Vive Wave en Unity y con mucha sorpresa, ¡noté que realmente funcionaba! ¡Podía ver el contenido de la cámara Unity directamente desde el auricular! ¡GUAU!

Vive Focus vista previa instantánea unidad vr remota
Esta es la salida que da Unity en la ventana de Juego para un proyecto de Vive Wave: como puede ver, es exactamente como aparecería en la pantalla del dispositivo. ¡Así que solo tenemos que tomar estos marcos y pegarlos en la pantalla del dispositivo y listo! La aplicación Unity Remote hace exactamente esto, por lo que es perfecto

Obtuve un punto … pero había un gran problema: las aplicaciones de Android generalmente reaccionan solo a la orientación aproximada de la pantalla, pero la cámara principal no gira siguiendo la orientación del dispositivo como con los cascos de realidad virtual. Necesitaba una forma de rotar la cámara en Unity siguiendo la orientación de los auriculares. Afortunadamente, la aplicación Unity Remote ya transmite los datos del giroscopio desde el dispositivo hacia Unity, por lo que solo tuve que crear un pequeño script para tomar los datos aproximados de los giroscopios y aplicarlos a la cámara Unity. ¡Funcionó! Podía girar la cabeza y ver la escena actualizándose correctamente … ¡Podría modificar la escena dentro de Unity y ver los resultados inmediatamente en los auriculares! ¡Guau!

Estaba feliz y listo para compartir mis resultados con la comunidad, pero algo en mi cabeza decía que podía hacer algo mejor. Esto se debe a que la solución presentaba varios problemas enormes:

  • Gran retraso y mala resolución.
  • No hay soporte para la traducción de los auriculares, y esto no es bueno para un dispositivo de 6 DOF.
  • Mal soporte para la rotación de los auriculares.: los datos sin procesar de los giroscopios son bastante inutilizables y, a veces, los resultados eran bastante extraños.

Entonces, sintiendo el espíritu de Enea Le Fons dentro de mí, seguí trabajando en ello. Decidí que en lugar de tomar datos del giroscopio, debería haber tomado datos directamente de la plataforma Vive Wave, pedir la posición y rotación de los auriculares y enviarlos a Unity. Y aquí empezaron mis dolores de cabeza: Vive Wave es bastante complicado y todavía está muy mal documentado, por lo que es muy difícil hacer con él cosas que están fuera de lo que fue concebido.

30 días en realidad virtual 30 días en realidad virtual
Enea Le Fons con el Vive Focus

Agregué el script WaveVR_DevicePoseTracker a la escena que había usado hasta ese momento, con la esperanza de que me diera la pose de los auriculares, pero el script simplemente se negó a funcionar. Parecía que para funcionar necesitaba un prefabricado WaveVR en la escena. Pero no quería usar el método de renderizado Vive Wave VR estándar, porque Unity Engine, cuando presiono Reproducir, ya me dio una vista distorsionada de la escena, así que tuve que tomarlo y mostrarlo en la pantalla del dispositivo sin más distorsiones ni cálculos. Quería usar una cámara estándar y adjuntar el marco enviado por Unity en la pantalla del dispositivo: la vista distorsionada que ya me proporcionó Unity, junto con la distorsión de las lentes, deberían darme la visualización correcta. El renderizado estándar del prefabricado Vive Wave VR, en cambio, renderiza toda la escena y le aplica distorsiones, que son útiles en el escenario estándar, pero que fueron un problema en este.

Me volví loco, porque no pude encontrar la manera: con la cámara estándar pude obtener el renderizado correcto pero sin datos de los sensores del dispositivo, mientras que con el prefabricado WaveVR tenía los datos de los sensores, pero no el renderizado correcto . Al final, descubrí que para tener las actualizaciones del sensor, tuve que llamar a algunas cosas extrañas como este para inicializar el dispositivo

WaveVR_Utils.IssueEngineEvent(WaveVR_Utils.EngineEventID.HMD_INITIAILZED).

y luego este en el ciclo de actualización para actualizar los datos leídos de los sensores

WaveVR.Instance.UpdatePoses(WVR_PoseOriginModel.WVR_PoseOriginModel_OriginOnGround).

¡BAM! Tenía los datos de los sensores… Pero, desafortunadamente, la primera llamada para inicializar el HMD hace que la pantalla se vuelva negra, así que nuevamente no tuve imágenes. Muchos dolores de cabeza después, descubrí que para mostrar algo en las pantallas de la pantalla, había otras llamadas mágicas. Por ejemplo, con estas tres llamadas

WaveVR_Utils.SetRenderTexture(currentRt.GetNativeTexturePtr()).
WaveVR_Utils.SendRenderEventNative(WaveVR_Utils.k_nRenderEventID_SubmitR).
WaveVR_Utils.SendRenderEventNative(WaveVR_Utils.k_nRenderEventID_RenderEyeEndR).

podría enviar una textura directamente al renderizador del ojo derecho, esa es la pantalla derecha del auricular. Uhm, entonces, ¿qué pasa si tomo la textura obtenida de Unity, la divido en dos, cambio el tamaño de las dos mitades a las dimensiones correctas de las pantallas de Vive Focus y luego envío estos datos a las dos pantallas de Focus? Deberia de funcionar. De hecho, lo he hecho, también con la ayuda de un script que se encuentra en Unity Wiki. ¿El resultado? Funcionó … pero como a 1 FPS. ¡Lo leíste bien! 1 fotograma por segundo … cuando lo hice, estaba tan feliz de que funcionara que llamé a Max para verlo. Él dijo: “¡Uh, genial! ¡Pero es tan descuidado que puede usarse como método de tortura dentro de Guantánamo! ”. Ehm … 1 FPS tal vez no sea la velocidad de fotogramas ideal para una aplicación de realidad virtual …

vive focus unidad vista previa instantánea
Donald Trump en mi proyecto experimental (Imagen de Know Your Meme)

El problema estaba en el hecho de que estaba usando los malditos GetPixels y SetPixels en los objetos Texture2D. Si alguna vez has jugado con Textures, seguramente sabrás que estas funciones son daaaaaaaamn lentas y pueden acabar con el rendimiento de cualquier aplicación. Y al matar el rendimiento, me refiero a algo así como un factor 10x: requieren que mueva la textura de la memoria de la tarjeta gráfica a la memoria RAM y esto es un cuello de botella. ¿Cómo evitarlo? Por haciendo todas las operaciones en la tarjeta gráfica.

Escuché a alguien decir la palabra RenderTexture dentro de los foros, así que comencé a experimentar con Materiales, Texturas y RenderTexture y … al final lo hice! De 1 FPS a tal vez 20. La aplicación sigue siendo una máquina de vomitar, pero al menos tiene un sentido como prototipo: rastrea tanto la posición como la rotación de los auriculares y le muestra el contenido de la escena de Unity dentro de los auriculares!! Para ser realmente utilizable, debe llegar a una velocidad de cuadros decente de al menos 60FPS, funcionar a través de Wi-Fi (desafortunadamente, Unity Remote 4 solo funciona con el dispositivo conectado a través de USB) y dejar de activar una excepción GL en cada cuadro … pero a quién le importa 🙂 Estoy tan orgulloso de eso que Decidí compartirlo con toda la comunidad de realidad virtual.

Y ahora en GitHub hay un proyecto de código abierto que ofrece una terrible función de Vista previa instantánea para Vive Focus. Se comenta mucho, para que puedas entender cómo lo hice, aprender de él y también actualizarlo. Está bajo licencia del MIT, por lo que puede hacer con él lo que quiera. Si te interesa, puedes encontrarlo aquí. Es mi primer proyecto completo empujado en GitHub, así que perdona todos los errores que he cometido.

(en este GIF puedes ver el sistema funcionando dentro de Unity y dentro de los auriculares … ¿no es genial?)

Realmente espero que lo que hice inspirará a los desarrolladores de Vive Wave a tomar mi prototipo y realizar una solución funcional para esta plataforma: conocen muy bien su sistema, así que estoy seguro de que saben cómo optimizar todo y corregir la excepción GL. Además, si Vive se asocia con Unity, tal vez la función de vista previa podría ser integrado directamente en el motor, como ha sucedido con HoloLens por ejemplo.

De todos modos, en dos semanas, Vive hará un gran evento dentro del cual se anunciarán muchas noticias importantes (y ya estoy entusiasmado por ello) … quién sabe si la Vista previa instantánea para el Focus será una de ellas … 🙂

Mientras todos esperamos esta noticia de HTC, ¡disfruta de mi pequeña función de vista previa instantánea! Espero que sea de utilidad para alguien, y también espero que lo que hice inspirará a otros desarrolladores a tomar su Vive Focus (o cualquier otro auricular) y comenzar a hacer experimentos locos con él: haz algo nuevo con él, diviértete y comparte tus resultados con la comunidad … y si lo que haces funciona solo a 1 FPS, no te preocupes, ¡será increíble lo mismo!

(Imagen de encabezado de Engadget)

Deja un comentario

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad