Llego tarde, pero más vale tarde que nunca. Aunque ya hace tiempo que estoy interesado en VR (realidad virtual) y AR (realidad aumentada) apenas he tenido tiempo de estudiar al respecto y realizar pruebas. Hasta el momento he estado más interesado en capturar live action para VR que en generar contenido 3D, aunque ahora también estoy empezando a estudiar al respecto.

Hace un par de días tuve la oportunidad de probar el HTC Vive durante unas cuantas horas y definitivamente, poco a poco iré realizando más pruebas relacionadas con realidad virtual, al tiempo que voy estudiando la materia. Me interesa especialmente la evolución que sufrirá la narrativa, y los cambios que veremos en el lenguaje cinematográfico tal cual lo conocemos hoy.

Probando el HTC Vive.

Probando el HTC Vive.

Como primer ejercicio tanto de captura como de generación de contenido 3D, he realizado una prueba muy sencilla, pero que me sirve como primer contacto para renderizar imágenes estereoscópicas mediante estereográfica y probarlas utilizando el headset más simple y barato del mercado, Google Cardboard y UMI 3D. (más info abajo).

Antes de explicar la sencillísima forma de renderizar este tipo de imágenes, vamos a explicar un poco del contexto necesario para entender de forma muy básica algunos principio de VR.

Existen dos tipo de sistemas de realidad virtual. Aquellos en los que podemos rotar la cabeza alrededor de un mundo virtual, y aquellos en los que además de rotar, también podemos trasladarnos por el espacio, incluso interactuar con el. En el caso de las Google Cardboard y otros headsets para smartphones, solo podemos rotar la cabeza para inspeccionar alrededor del entorno. Para ello, nos servimos del giroscopio y del acelerómetro que incorporan los teléfonos hoy en día.

Hoy por hoy utilizamos dos tipos de formatos de imagen. Cuando hablamos de contenido pre-renderizado. Por un lado tenemos las imágenes lat-long, o también llamadas equirectangular, y por otro lado las imágenes cúbicas. Las dos se mapean de forma esférica para crear un mundo virtual. Básicamente necesitaremos generar dos imágenes esféricas, una para cada ojo.

Las imágenes lat-long son geniales, porque podemos ver todo el mundo en un solo golpe de vista. El problema que acarrean, es que el 66% de la imagen corresponde a los polos de la esfera virtual donde se mapean, y en esos polos hay demasiada distorsión.

Proyeccion lat-long.

Las imágenes cúbicas para este tipo de contenido son quizás más efectivas que las lat-long, ya que las imágenes se mapean virtualmente en el interior de un cubo, de tal forma que los polos estarán proyectados en dos caras del cubo, lo que corresponde a un 33% del total de la imagen. Esto significa menos distorsión cuando se convierte a espacio esférico.

Proyección cúbica.

Estereografía. Es el acto de proporcionar dos imágenes desde dos cámaras distintas. Entre cada una de las dos cámaras existe un desfase que representa la distancia entre un ojo y el otro. En el caso de cine stereo, esto se realiza renderizando una imagen para el ojo izquierdo y otra para el derecho, y ambas se proyectan en una pantalla plana. 
En el caso de VR, necesitamos renderizar no solo izquierda y derecha, si no también frontal y trasera, siempre manteniendo el mismo desfase entre cámaras, para así poder rotar en todas direcciones.

Por supuesto, hay mucha teoría y conceptos básicos que necesitamos conocer a la hora de trabajar con VR, pero para este simple ejercicio, creo que este es contexto suficiente.

Trabajando en software 3D

  • En esta ocasión, voy a combinar material rodado con material generado mediante VFX.
  • Ya tendremos tiempo en otra ocasión para hablar sobre sistemas y metodologías de captura de fotografía y video. Hoy nos basta con saber que he capturado una imagen panorámica utilizando un rig Nodal Ninja y un fisheye lens, montado sobre una Canon 5 Mark III. La resolución capturada es de alrededor de 12k
  • Con esa imagen puedo fácilmente crearme un mundo virtual fotorrealista, ya que está basado en fotografías. Como este es un ejemplo sencillo, no quiero perder tiempo en crearme un mundo virtual por completo empezando desde cero. Además, lo que más me interesa en VR es precisamente combinar elementos reales con elementos virtuales.

Tate Modern, Londres.

  • Esta imagen de arriba es el panorama que he creado a partir de varias fotografías realizadas en Tate Modern, aquí en Londres. Puedes descargarte este panorama y otros completamente gratuitos aquí. Además, son imágenes HDRI, con lo que podré utilizar el mismo mapa para iluminar mi escena, al menos en parte.
  • Como el mapa panorámico es 360 x 180 puedo cubrir todo el campo de visión para posteriormente rotar mi cabeza con el headset de VR y mirar en cualquier dirección.
  • El siguiente paso es crear los elementos virtuales de mi escena. En este ejercicio simplemente voy a posicionar un robot en el centro de la escena y un par de esferas.
  • Lo ideal es colocar la cámara virtual en aquella posición del entorno donde quieres que los espectadores estén colocados posteriormente en la experiencia de realidad virtual. Recuerda que en este ejemplo utilizamos un headset de smartphone, con lo que el espectador no podrá caminar alrededor del entorno, solo mirar en todas direcciones.
  • Como podéis ver más abajo, la escena es muy simple. Utilizo el propio HDRI panorámico para iluminar. También estoy utilizando un par de softboxes como key lights.
  • Vray no renderiza el fondo en sus environment lights (how clever...). Así que como quiero ver el entorno en el render tengo que crear un environment override con la misma imagen panorámica que utilizo para iluminar, asegurándome que está en la misma orientación.
  • Tambien utilizo un shadow catcher para proyectar las sombras de mis assets 3D en el entorno live action.
  • En este punto, si realizo un render, deberia de obtener el resultado esperado. Simplemente trabajo mi escena como lo haria en cualquier otra ocasion. En este caso con una camara rectilinear y con resolucion HD.
  • El siguiente paso es añadir un Vray extra attribute para convertir nuestra cámara en una cámara estereoscópica. Por defecto dejamos la distancia entre ojos A 6.5cm que es más o menos lo normal en el ser humano. También dejamos desactivada la opción de especificar un punto de enfoque concreto, a menos que creativamente queramos dirigir la mirada del espectador a un lugar concreto del entorno.
  • Si volvemos a renderizar, obtendremos un render para cada ojo. Ya tenemos estereoscopía.
  • Ahora que ya tenemos un render para cada ojo, lo siguiente que tenemos que hacer es renderizarlo de forma esférica para poder mapearlo en un mundo virtual. En este caso vamos a utilizar una proyección cúbica, que como vimos anteriormente tiene menos distorsión.
  • Para ello basta con crear un override de camara tipo cube 6x1
  • Finalmente tenemos que indicar la resolución del render. Esto depende del dispositivo VR que vayas a utilizar, aplicación, soporte, etc. Los desarrolladores de hardware tienen documentación al respecto, recurre a ella. En este caso, para Google Cardboard y similares utilizamos una resolución de 9216x1536. 
  • Como buena práctica es recomendable desactivar el filtrado, para así no acentuar los posibles errores de stitching.
  • Si chequeamos el render en Nuke obtendremos algo similar a esta imagen.
  • Perfecto, ya solo nos queda publicar nuestra imagen para visualizarla en un dispositivo VR.
  • Estoy utilizando irisVR que permite subir las imágenes a través de una aplicación web, para posteriormente visualizarlas a través de su propia app (apple y android) utilizando tu VR headset.
  • Simplemente tienes que crearte una cuenta gratuita y subir las imágenes.
  • Una vez subidas las imagenes, apareceran en tu libreria.
  • Ya utilizando tu smartphone, ejecuta la app de irisVR llamada Scope y en tu libreria podras ver todas tus imagenes subidas a traves de la web.
  • Selecciona cualquier de ellas y la propia app te indicara que coloques tu movil en el VR headset.
  • En este caso estoy utilizando dos diferentes, Google Cardboard y UMI Box 3.
  • Y con esto ya tenemos nuestros renders 3D y fotografias listas para ver en un VR headset.
  • Asi es como se ven el el movil cuando no tenemos el headset puesto.
  • Obviamente esta experiencia dista mucho de interactuar con contenido digital o fotogrametría dentro de un headset como el HTC Vive, pero como primer ejercicio no estaámal. Seguiremos hablando de VR en el futuro a medida que aprendamos mas al respecto.

Bueno, quizás no es para tanto, pero al menos a mi me ha ahorrado muchas ¿horas? de trabajo, y sigue haciéndolo.
Como ya sabeis, Nuke es una de las herramientas más comunes utilizadas en todos los estudios de efectos visuales, y por supuesto, el standard de la indsutria en cuanto a composición se refiere. Hoy en dia, prácticamente todos utilizamos Nuke, no solo los compositores. Lighting TD's utilizan Nuke a diario, Look-Dev Artists utilizan Nuke todos los dias, también Texture Painters, Matte Painters, etc. Incluso modeladores, pre-viz artists, etc. Me he dado cuenta de que salvo los compositores, el resto de profesionales no conocemos más que cuatro cosas de Nuke, y esta opción que os presento hoy, no es una de ellas.

¿Nunca te has preguntado por qué el orden de composición en Nuke no parece tener ninguna lógica? ¿Nunca has buscado cómo remediarlo? En este video te explico como hacerlo.

A estas alturas no vamos a explicar nada relacionado con Linear Workflow, Gamma Correction, Color Spaces, etc. Seguramente ya todos llevamos años trabajando así y de lo contrario, existen muchos recursos en internet con información al respecto. En este mismo blog podéis encontrar información relacionada con este tópico en esta entrada del blog, o en esta o quizás en esta. También si buscáis el término Linear Workflow en la sección tutoriales.

El caso es que Autodesk Maya 2016 viene con una serie de novedades, entre ellas la gestión de color, lo que hace que por ejemplo, el Gamma Correction en Arnold Render se vea ligeramente alterado con respecto a versiones anteriores de Maya. Parece que esto está causando algunas confusiones entre algunos usuarios de Arnold, así que vamos a explicar de forma sencilla como configurar Maya 2016 y Arnold para trabajar de forma correcta. Nótese que esta no es la única forma de configurar LWF correctamente, pero es la que más me gusta a mi.

En las preferencias de Maya tenemos que activar el Color Managment. Lo ideal es renderizar siempre de forma linear y que el view transformation sea siempre sRGB (o LUT en el caso de estar utilizando uno). El input color space vamos a dejarlo como sRGB aunque después será Arnold el encargado de dictaminar el color space de nuestras texturas.

Como prueba para chequear que todo funciona correctamente, vamos a utilizar dos texturas de Macbeth Chart. La primera es una textura linear en formato .exr y la segunda una textura sRGB en formato .jpg Estos son generalmente los dos tipos de inputs que vamos a encontrar en una producción, linear y sRGB.
Si leemos ambas como linear, que es lo que ocurre a la hora de renderizar (hay que linearizar las texturas siempre) comprobaremos que la textura sRGB no se ve de forma correcta. Bien, lo mismo debería ocurrir en Maya y Arnold.

En las opciones de render de Arnold, en el apartado Gamma Correction, tenemos que poner todos los parámetros a 1.0
Esto quiere decir que Arnold espera que todos los inputs estén linearizados. Como ya dije anteriormente, hay que linearizar las texturas siempre.

El Macbeth Chart de arriba es el que tiene aplicado la textura linear .exr y el Macbeth Chart de abajo tiene aplicada la textura sRGB .jpg
La esfera diffuse tiene aplicado un color neutral grey 50%

Cuando lanzamos un render, ya que Arnold espera que todos los inputs estén linearizados, el Macbeth Chart de abajo y la esfera gris se van a ver de forma incorrectaLa solución es linearizarlos antes del render.

Existen dos formas de linearizar los inputs. La primera pasa por colocar invert gamma correction en todas las texturas que no estén linearizadas. Es decir, cualquier textura en espacio de color sRGB sea cual sea su formato. En este ejemplo solo tendremos que corregir la textura del Macbeth Chart de abajo.

Si renderizamos de nuevo, los dos Macbeth Charts deberían de verse de forma correcta.

La esfera diffuse sigue sin verse correctamente. Esto ocurre porque Maya está tratando al color plano 50% grey como si estuviese en el espacio de renderizado (linear). Así que tenemos que decirle que lo trate como si estuviese en el espacio de visionado (sRGB).

Ahora si renderizamos de nuevo, todo se verá de forma correcta.

Antes comentaba que existen dos formas de linearizar las texturas. La primera es la que hemos visto, la segunda, es la recomendada, ya que obviamos gamma correction nodes y ahorramos tiempo de computación al render.
Consiste en convertir las texturas al formato .tx que por otro lado me imagino que ya estás acostumbrado a convertir tus texturas a este formato ya que las texturas han de ser convertidas a MIP-mapped textures sobre todo, para ahorrarte infinidad de tiempo en el renderizado.

En el caso de texturas en espacio de color sRGB no olvides utilizar la opción "--colorconvert sRGB to linear"

Si ahora eliminamos todos los nodos gamma correction y sustituimos las texturas por su equivalente .tx obtendremos el resultado esperado.

No está de más mencionar que en la última versión de Arnold, SolidAngle proporciona su propio Frame Buffer. Puedes encontrarlo en el menú Arnold -> Experimental -> MtoA RenderView

Donde entre otras opciones, puedes cargar directamente un LUT.

Huelga decir que nuestros renders siempre van a ser lineares, así que se verán correctamente en Nuke. Basta con leerlos como linear y visionarlos como sRGB (o LUT) al igual que en Maya.

Cualquier duda, pásate por el foro o deja un comentario en el blog.