Crea videos panorámicos en Unity



¿Por qué necesitas videos panorámicos?



La mayoría de las publicaciones de mi blog están dirigidas a desarrolladores de juegos. Si usted es uno de ellos, es posible que se pregunte por qué podría estar interesado en crear videos de 360 ​​°. La realidad virtual es una industria muy exitosa con más juegos que se lanzan en varias plataformas cada año. Muchos jugadores aprenden sobre los juegos de realidad virtual a través de avances, que desafortunadamente están grabados en 2D.





Si quieres dar un paso más, puedes crear un tráiler panorámico opcional para mostrar todo el potencial de tu juego. Si bien la realidad virtual generalmente requiere un auricular costoso para reproducirse, YouTube admite de forma nativa los videos panorámicos sin la necesidad de hardware adicional. Y si tiene un teléfono, puede convertirlo fácilmente en un visor de realidad virtual con Google Cardboard .



Puede proporcionar a las personas una experiencia mucho más inmersiva y darles una idea de cuál es el objetivo de tu juego. Películas como It (ver avance a continuación) y The Conjuring aprovecharon al máximo esto al crear juegos de realidad virtual (con avances en video panorámico) para una experiencia más interactiva.





Por último, los videos panorámicos son excelentes para fines educativos, como se ve en Todos los exoplanetas descubiertos: un viaje narrado en 360 VR .



Manejo de videos panorámicos



Lo más probable es que esté familiarizado con YouTube y cómo funciona. Sin embargo, los videos panorámicos no son familiares para muchos. La mayoría de los videos se graban en una cámara que captura solo una pequeña parte del entorno. Los videos panorámicos registran simultáneamente todo lo que sucede en todas las direcciones. Esto generalmente requiere cámaras especiales llamadas cámaras omnidireccionales . Usan espejos curvos para reflejar el mundo que los rodea en una cámara tradicional (muy parecida a una lente de ojo de pez) o tienen varias cámaras orientadas en diferentes direcciones. Una de esas cámaras es la GoPro Omni (ver más abajo), que es esencialmente un dispositivo que contiene seis cámaras de ojo de pez estándar.





Es fácil ver por qué el equipo necesario para grabar videos panorámicos suele ser más caro que las cámaras tradicionales. Sin embargo, esta no es la única razón que limita su distribución. La reproducción adecuada de videos panorámicos requiere software y hardware especiales. Las pantallas, como las cámaras, están diseñadas para recrear solo una pequeña parte de los entornos. YouTube pudo sortear esta limitación al permitir que los espectadores "roten" el video para que puedan mirar alrededor. Si está viendo un video panorámico desde un teléfono o tableta, generalmente lo mueve en el espacio para ver diferentes partes de la "esfera" en 360 °.



YouTube admite dos tipos de videos panorámicos: mono y estéreo (estos últimos a menudo se denominan videos de realidad virtual). La diferencia entre los dos es que el video estéreo está diseñado para auriculares VR y puede transmitir una sensación de profundidad que no se puede sentir en los videos tradicionales. Esto se logra teniendo no uno, sino dos videos, uno para cada ojo. Estos dos videos son grabados simultáneamente por dos cámaras, la distancia entre las cuales es comparable a la distancia entre los ojos. Como resultado, los videos de realidad virtual pueden "engañar" al cerebro para que perciba la distancia real como en la vida cotidiana.



La tabla muestra los requisitos que tienen estos dos tipos de videos.



Nombre Video de 360 ​​° Video de realidad virtual
Mononucleosis infecciosa Estéreo
2D 3D
Enlace Apoyo Apoyo
Frecuencia de cuadro 24, 25, 30, 48, 50, 60 25, 30, 50, 60
Formato

Relación de aspecto equidistante 2: 1


Relación de aspecto equidistante arriba-abajo 1: 1
Resolución Recomendado: 7168 x 3584, hasta 8192 x 4096 5120 x 5120 hasta 8192 x 8192


Tenga en cuenta que YouTube trabaja constantemente para mejorar la compatibilidad con videos panorámicos, por lo que esto puede cambiar en el futuro. Lea la información de referencia en la tabla antes de seguir estas especificaciones.



Proyectando video



La primera parte complicada de los videos panorámicos es codificar la esfera en una superficie plana. Esto es necesario porque, aunque las cámaras omnidireccionales pueden grabar en todas las direcciones, cada fotograma debe convertirse en una imagen plana tradicional.



Hay muchas formas de transformar (estrictamente hablando, proyectar ) una esfera en un rectángulo. Probablemente la más conocida sea la proyección cilíndrica , que se popularizó después de que el cartógrafo Gerard Mercator comenzara a utilizarla en 1569 para transformar la superficie del planeta en mapas planos.



Sin embargo, la proyección equirrectangular se usa con mayor frecuencia en videos panorámicos (ver más abajo).





Sonido espacial



Los videos panorámicos, tanto mono como estéreo, pueden admitir audio espacial . Los videos estándar tienen dos canales de audio (izquierdo y derecho) que se utilizan para crear un sentido de dirección al escuchar con auriculares estéreo. El audio espacial le permite codificar la verdadera dirección de la fuente de sonido, en lugar de solo izquierda / derecha. Esto significa que con el equipo adecuado, puede sentirse completamente inmerso y comprender las direcciones de los sonidos circundantes.



A pesar de su nombre, los videos de realidad virtual no son tan buenos como los juegos de realidad virtual "reales" porque, aunque un visor de realidad virtual puede rastrear los movimientos de la cabeza, el video se procesa desde un punto fijo. Es imposible moverse y ver qué hay detrás del objeto, como sería en un juego de realidad virtual. Esto puede ser un poco desorientador, especialmente cuando se combina con sonido envolvente. Cuando ha estado trabajando en un proyecto de realidad virtual (juego o video) durante mucho tiempo, puede acostumbrarse. Es importante realizar una prueba de juego suficientemente detallada para garantizar la conveniencia del producto terminado y encontrar limitaciones que causen incomodidad a los jugadores o espectadores.



El video panorámico no necesita tener audio espacial. YouTube admite dos formatos:



  • Ambisónicos de primer orden
  • Ambisonics de primer orden con estéreo con bloqueo de cabeza


Ambisonics es un formato de sonido que se utiliza para grabar no solo el sonido, sino también la dirección de donde proviene. First-Order Ambisonics (FOA) utiliza cuatro canales de audio para codificar la directividad de la fuente de sonido. Para tener una idea aproximada de cómo funciona esto, diré que grabar sonido FOA es un poco como grabar con cuatro micrófonos. El error común es que estos cuatro micrófonos están ubicados en puntos cardinales (uno frente al espectador, otro detrás, tercero a la izquierda y cuarto a la derecha). No es así como funciona Ambisonics, pero podemos hablar de ello en otras publicaciones.



Aunque FOA usa 4 canales, YouTube también admite una versión de 6 canales, que simplemente agrega los canales estéreo izquierdo y derecho tradicionales. Este formato se llama FOA con Head-Locked Stereo...



Se debe prestar especial atención a la codificación de video panorámico (estéreo o mono) porque no todos los formatos admiten 4 o 6 canales de audio. YouTube recomienda lo siguiente:



  • Formato: MP4, MOV
  • Códec: H.264, ProRes, DNxHR


Si está utilizando Premiere Pro 2018 o una versión posterior, es mejor codificar su video como un códec Quicktime ProRes. Puede leer más sobre los formatos de audio espacial compatibles con YouTube aquí .



Cómo crear video panorámico en Unity



Una de las muchas características agregadas en Unity 2018.1 es la capacidad de tomar capturas de pantalla de la cámara en un formato compatible con los videos panorámicos de YouTube. Esta función se describe brevemente en una publicación en el sitio web de Unity: Captura de imagen y video Stereo 360 . Desafortunadamente, no hay ninguna referencia de escena para probar.



Teoría



La mayoría de las veces, los clips del juego se graban mientras se ejecuta el juego. Esto está bien para videos estándar, pero generalmente no para videos panorámicos. La razón principal es que se requiere un área mucho más grande para renderizar un juego panorámico, lo que hace que la velocidad de fotogramas disminuya drásticamente. Un enfoque más estándar es renderizar y exportar cada fotograma en segundo plano para que puedan editarse más tarde en software de terceros, como ffmpeg o Premiere Pro. Esto es lo que haremos en nuestro tutorial.



Renderizar una escena panorámica en Unity es un proceso de tres pasos bastante simple:



  • Renderice una escena en una textura de mapa de cubos (el formato preferido de Unity para texturas panorámicas)
  • Conversión de un mapa de cubos en una proyección equirrectangular (formato preferido para videos panorámicos de YouTube)
  • Guardar proyección equidistante como PNG


Los dos primeros pasos son necesarios debido a la forma en que funcionan las cámaras en Unity.



Si está familiarizado con Unity, probablemente sepa que la forma preferida de almacenar texturas panorámicas es con un mapa de cubos , que es una forma de empaquetar seis imágenes diferentes sin deformaciones (ver más abajo). Los mapas cúbicos se utilizan a menudo para palcos y sondas de reflexión, por lo que es probable que los haya encontrado antes.





Para crear una textura panorámica, Unity renderiza la escena seis veces, cada vez en un ángulo diferente. La cámara gira como si estuviera alineada con uno de los seis lados del cubo. Como resultado, cada captura de pantalla panorámica son seis tradicionales enlazadas.



Después de completar el mapa del cubo, el segundo paso es convertirlo a un formato compatible con YouTube. Como vimos anteriormente, YouTube requiere videos panorámicos equirrectangulares. Esta transformación generalmente requiere codificar sombreadores complejos, pero afortunadamente se ha agregado una función a Unity específicamente para esto.



El paso final será exportar la textura equidistante a un archivo PNG. Una vez que se hayan renderizado todos los fotogramas de vídeo, puede combinarlos con un programa como ffmpeg o Premiere Pro.



El código



El primer paso es crear un script (llamado en los fragmentos a continuación Camera360) y adjuntarlo a la cámara que se va a renderizar. Sin embargo, el código cambiará dependiendo de si queremos renderizar el video en mono (360 ° / mono / 2D) o en estéreo (VR / estéreo / 3D).



Mononucleosis infecciosa



Comencemos con la versión mono:



public class Camera360 : MonoBehaviour
{
    public Camera Camera;
    
    public RenderTexture EyeCubemap;
    public RenderTexture EquirectTexture;

    void Update ()
    {
        Camera.RenderToCubemap(EyeCubemap, 63, Camera.MonoOrStereoscopicEye.Mono);
        EyeCubemap.ConvertToEquirect(EquirectTexture, Camera.MonoOrStereoscopicEye.Mono);
    }
}


El script anterior renderizará cada fotograma en una textura de renderizado titulada Equirect, que contendrá una captura de pantalla panorámica guardada en una proyección equirrectangular.



El valor 63utilizado en el método RenderToCubemapsignifica que queremos tomar capturas de pantalla de los seis lados del cubo.



Ambos EyeCubemap, y EquirectTexturese pueden crear en el editor o en código.





Estéreo



El código de la versión estéreo es muy similar, pero requiere un paso adicional:



    void Start ()
    {
        Camera.stereoSeparation = 0.064f; // 64mm
    }

    void Update ()
    {
        Camera.RenderToCubemap(EyeCubemap, 63, Camera.MonoOrStereoscopicEye.Left);
        EyeCubemap.ConvertToEquirect(EquirectTexture, Camera.MonoOrStereoscopicEye.Left);

        Camera.RenderToCubemap(EyeCubemap, 63, Camera.MonoOrStereoscopicEye.Right);
        EyeCubemap.ConvertToEquirect(EquirectTexture, Camera.MonoOrStereoscopicEye.Right);
    }


Para renderizar una imagen estéreo, necesita renderizar dos mapas de cubos. stereoSeparationestablece la distancia entre estos mapas de cubos. El valor estándar es 64 mm, que es aproximadamente igual a la distancia entre los ojos izquierdo y derecho.





Creando y guardando texturas



Los dos fragmentos de código anteriores solo escriben en la textura, pero no la guardan en ningún lado. Si queremos que los marcos se guarden en el disco, debe hacerlo manualmente.



Desafortunadamente, exportar una textura de renderizado a un archivo PNG no es tan fácil como debería ser. El primer problema es que Unity no le permite acceder directamente a píxeles individuales RenderTexture. Primero, la textura de renderizado debe copiarse en un objeto Texture2D.



El fragmento de código a continuación hace exactamente esta tarea, utilizando el método, ReadPixelscopia los píxeles de la textura de renderización actualmente activa .



public string FileName;

void Update ()
{
    ...    

    // Creates buffer
    Texture2D tempTexture = new Texture2D(EquirectTexture.width, Equirect.height);

    // Copies EquirectTexture into the tempTexture
    RenderTexture currentActiveRT = RenderTexture.active;
    RenderTexture.active = EquirectTexture;
    TempTexture.ReadPixels(new Rect(0, 0, EquirectTexture.width, EquirectTexture.height), 0, 0);

    // Exports to a PNG
    var bytes = tempTexture.EncodeToPNG();
    System.IO.File.WriteAllBytes(FileName, bytes);

    // Restores the active render texture
    RenderTexture.active = currentActiveRT;
}


Siempre que FileNamecontenga la ruta correcta al archivo PNG, el código anterior funcionará. Solo hay un pequeño cambio que debe realizarse: para asegurarse de que el script no sobrescriba el mismo archivo una y otra vez. Para hacer esto, simplemente agregue el contador de nombre de archivo a la reescritura repetida frame.png, estaba escribiendo frame_0.png, frame_1.pngy así sucesivamente.



Problemas



Esta solución también tiene sus problemas. El más importante de ellos es que algunos efectos de posprocesamiento pueden no funcionar como se esperaba.



Actuación



Renderizar cuadros panorámicos en Unity es una tarea muy costosa. En mi solución, la escena se renderiza 6 o 12 veces (dependiendo del formato de video, mono o estéreo). El posprocesamiento necesario para fusionar imágenes y guardar cada fotograma en el disco puede reducir el rendimiento en un factor de 10-15. Si renderiza un video en alta calidad (8192 x 8192 píxeles), entonces cada cuadro individual puede tener un tamaño superior a 100 MB. Evidentemente, si no tienes una máquina muy potente, no podrás jugar en tiempo real y exportar tomas panorámicas simultáneamente.



Postprocesamiento



El viñeteado , por ejemplo, agrega un halo oscuro alrededor de la cámara. Dado que Unity crea una imagen panorámica renderizando la escena seis veces, se aplicará un efecto de viñeteado a cada imagen. Como resultado, un extraño halo negro estará presente en las uniones de las imágenes.





Asimismo, los efectos de desenfoque y flor también provocan errores en los bordes, demostrando la existencia de costuras. No hay soluciones fáciles para este problema, porque ninguna de las pilas de posprocesamiento creadas por Unity está diseñada para trabajar con imágenes panorámicas.



Sin embargo, los efectos de desenfoque y flor aún se pueden aplicar con moderación. Si necesita estos efectos, es mejor aplicarlos en posproducción con Premiere Pro.



Renderizadores de línea



Un gran problema con las imágenes panorámicas es que los renderizadores de líneas pueden no mostrarse correctamente . Si una línea está configurada de modo que siempre debe estar mirando a la cámara, cuando la renderice en una imagen panorámica, Unity simplemente la descartará. Esto es extremadamente molesto porque no hay una razón real para ello.



Unity ha desarrollado una versión alternativa del renderizador de líneas llamado XRLineRenderer que funciona correctamente. Aunque no admite toda la funcionalidad del componente Line Renderer estándar, podrá implementar la mayor parte de la funcionalidad.



XRLineRenderer también tiene la capacidad de crear efectos de brillo simples, lo que puede reducir la importancia de los problemas descritos en la sección anterior.



Ver también:






All Articles