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.

Una de las situaciones más comunes que nos podemos encontrar durante la etapa de look-dev de un asset, es que tengamos mapas de desplazamiento procedentes de diferentes aplicaciones. Generalmente Zbrush/Mudbox y Mari. Esto puede suponer un par de problemas, el primero las diferentes escalas para cada una de las capas, y el segundo, el offset, o también llamado valor de no-desplazamiento.

Lo más inteligente es trabajar siempre con .exr 32 bits, para al menos solventar el segundo problema, ya que el primero siempre estará presente. De todas formas, veamos como solventar esta situación en Clarisse. Ya habíamos visto hace tiempo como hacerlo en Maya/Arnold.

  • Empecemos echando un vistazo a los mapas que vamos a utilizar. En este ejercicio tendremos tres capas de desplazamiento diferentes.
  • La primera capa ha sido realizada en Zbrush. Ha sido exportado como .exr 32 bits cuyo valor de no-desplazamiento es cero.
  • La segunda capa es un high frequency realizado en Mari. Ha sido exportada también como .exr 32 bits cuyo valor de no-desplazamiento es también cero. Es decir, técnicamente este mapa y el de Zbrush son iguales, la única diferencia es la escala.
  • La tercer capa de desplazamiento es un low frequency y también viene de Mari, pero en este caso se trata de un .tif de 16 bits cuyo valor de no-desplazamiento es 0.5
  • El objetivo es combinar todas las capas en Clarisse y utilizar el resultado como desplazamiento.
  • Antes de nada, crea version mipmapped de todos los mapas. Conviértelos a .tx
  • Lo primero que tenemos que hacer es crear un nodo displacement y conectarlo al asset 3D.
  • Vamos a considerar la capa de Zbrush como nuestra capa primaria, así que el displacement deberá tener un front value de 1 y un offset de cero. Esto quiere decir que el valor de no-desplazamiento es cero, como corresponde a los mapas de 32 bits. Y si conectamos nuestro mapa de Zbrush, se verá exactamente igual a como lo veíamos en Zbrush, no necesitamos ajustar nada.
  • Con todos los mapas en el material editor, lo primero que hago es conectar un multiply node delante de cada textura, así puedo controlar fácilmente la intensidad. Por defecto se multiplica por 1, es decir, se queda como está. Aumentando o disminuyendo valores afectaremos la potencia de cada capa de desplazamiento.
  • En el caso del desplazamiento de Zbrush no necesitas tocar su intensidad (a menos que quieras hacerlo). Si deberás reducir la intensidad de los desplazamientos de Mari, ya que están en una escala completamente diferente a Zbrush.
  • Delante del desplazamiento de 16 bits cuyo valor de no-desplazamiento es 0.5 he puesto un nodo add donde le resto -0.5 para así re-mapearlo a valor de no-desplazamiento cero, para que se iguale al resto de capas de desplazamiento.
  • Finalmente sumo todo con nodos add y conecto el resultado al nodo de desplazamiento.
  • Es buena practica testear cada capa por separado hasta encontrar el look que buscamos, para que después la mezcla funcione correctamente.
  • No desplazamiento.
  • Capa de Zbrush.
  • Capa de Mari high frequency.
  • Capa de Mari low frequency.
  • Todas las capas de desplazamiento juntas.

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.

Uno de los tratamientos más habituales que sufre un footage en VFX es el delensing, es decir, eliminar la distorsión de lente. Este es uno de los primeros pasos e indispensable para un sin fin de tareas, como tracking, rotoscoping, image modelling, etc.
En otras ocasiones, también es muy importante copiar esa información de lente y aplicarla a otro footage o a nuestros renders.

Debido a que utilizamos diferentes software, como 3D equalizer, Nuke, Flame, etc, resulta muy conveniente pasar la información de distorsión de lente utilizando Stmaps, ya que a fin de cuentas, son imágenes .exr de 32 bits, perfectamente legibles por la mayoría de software standard de la industria.

  • Como punto de partida, empezaremos haciendo el delensing de nuestro footage utilizando lens grids.
  • Lens grids son el metodo mas rapido y preciso de realizar delens.
  • Si cambiamos el output a displacement y seleccionamos el canal forward en el visor, podemos ver la informacion de uv.
  • Si escribimos el output como .exr de 32 bits obtendremos un uv map que posteriormente podremos aplicar en cualquier software.
  • Para aplicarlo a cualquier footage en Nuke, basta con utilizar un Stmap. Conectar el input src al footage y el input stmap a la imagen con la información de uv apuntando al canal forward.
  • Listo, la misma información de lente ha sido aplicada al footage, pero en esta ocasión sin necesidad del nodo lens distortion propietario de Nuke, si no utilizando uv maps genéricos.