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.

Render utilizando Ptex.

¿Qué ocurre si estás trabajando con Ptex pero necesitas hacer algún tipo de detalle de desplazamiento en Zbrush? ¿Cómo se puede renderizar eso?

Como seguramente sepas, en este momento Zbrush no soporta Ptex. Como ya comentaba en el post anterior, no soy un gran fan de Ptex, pero eso va a cambiar en el futuro, probablemente. La mayor ventaja (para mi) de utilizar Ptex, es como comentaba, la posibilidad de no tener que realizar UV mapping. Pero entonces, si Zbrush no soporta Ptex, y no tengo tiempo/ganas de realizar UV mapping, ¿cómo puedo esculpir en Zbrush y exportar mis mapas de desplazamiento para ser renderizados en Ptex?

Render sin displacemet.

  • En la imagen de abajo, tengo un scan 3D el cual he procesado en Meshlab para reducir la cantidad de poligonos a un numero aceptable para poder trabajar en otros software.
  • El siguiente paso, es importar el modelo en Zbrush. 500.000 polígonos son suficientes para poder trabajar de forma fluida y mantener los detalles que me interesan en este particular modelo.
  • Voy a utilizar Zbrush para generar una retopología rápida, automática. Puedes por supuesto utilizar Maya o Modo para generara un modelo consistente de quads, listo para producción. Para el propósito de esta demo, una retopología automática es suficiente.
  • Utilizando la herramienta Zremesher podemos crear una topología más que digna para este propósito en diez segundos.
  • El siguiente paso consiste en exportar tanto el modelo original de alta resolución, como el modelo de baja resolución. Puedes utilizar el formato .obj
  • Vamos a importar los dos en Mudbox para extraer el mapa de desplazamiento utilizando Ptex. Mudbox si soporta Ptex.
  • Una vez importados los dos modelos, mantén los dos visibles.
  • Exporta los displacement maps de forma normal.
  • Lo más importante de las opciones que has de tocar está señalado en la imagen de abajo.
  • Y ya está, todo debería de renderizarse correctamente.

Si buscas a lo largo y ancho de los posts que he escrito en este blog, encontrarás varias entradas sobre trabajo "Linear Workflow" en las diferentes aplicaciones que utilizo en mi día a día.
A raíz de una pregunta que me han hecho en twitter, aprovecho para dejar un ejemplo muy sencillo y directo, que espero sirva como medida aclaratoria.

Pregunta: Hola @xuanprada , ¿Una textura PTEX 16bit float necesita corrección de gamma en un workflow linear? Muchísimas gracias!!

Respuesta: No. Si es float image 1.0 ya viene linearizada.

Una imagen vale mas que mil palabras, así que aquí dejo algunos ejemplos gráficos.
Si los inputs son imágenes floating point (hdr, exr, 16bit, 32bit, etc) no hace falta corregirles el gamma. Si los inputs son imagenes sRGB con corrección de gamma "bakeada" si hace falta corregirles el gamma en shading, para que no se le aplique la misma información dos veces.

  • Sirva este diagrama como ejemplo.
  • En este sencillo ejemplo, tengo en Nuke la misma imagen en dos nodos diferentes. La imagen original es un .hdr 32bit floating point. He hecho un crop y la he salvado a dos archivos diferentes, uno 32bit .exr (linear) y otro 8bit .tif (sRGB).
  • Ambas las visualizamos en un espacio de color sRGB gamma 2.2 y se ven exactamente igual.
  • Cargo las dos imágenes en Maya, utilizando dos shaders diferentes de VRay.
  • Si aplico cada uno de los shaders a dos planos diferentes y lanzo un render obtengo lo siguiente: La textura linear (1.0) funciona bien, y la textura sRGB (2.2) no. ¿Porqué? Pues porque la textura sRGB tiene una doble corrección de gamma, la propia "bakeada" mas la que le aplica tu monitor (sRGB 2.2)
  • Para que la textura sRGB se vea como debería verse, es necesario corregirle el gamma. Para ello hay que utilizar un nodo gamma correction con valor 4.55 (1/2.2)
  • Si renderizamos de nuevo, todo funciona correctamente.

¿Qué es Ptex?

Ptex es un sistema de mapeado desarrollado por Walt Disney Studios que está siendo utilizado en producciones de animación y efectos visuales en diferentes estudios alrededor del mundo. Si bien no podemos considerarlo como un estandard dentro de la industria, si que ha tenido una excelente acogida por parte de usuarios y colectivos.

¿Qué tiene de particular?

  • No requiere de UV Mapping tradicional, lo que permite a los modeladores ahorrarse un proceso tedioso, complicado y que puede ser bastante lento en función del asset a texturizar.

  • Ptex crea una textura para cada uno de los polígonos que forman la geometría de un asset.

  • El formato de archivo utilizado por Ptex es capaz de almacenar cientos de texturas en un solo fichero.

  • El filtrado en render es de mejor calidad que en las texturas tradicionales basadas en UV Mapping.

¿Puedo utilizar Ptex en cualquier software?

No, solo algunos motores de render y software de texturizado soportan esta tecnología, aunque bien es cierto que cada día son más. Estos son algunos de los que sí soportan Ptex.

  • Vray
  • Arnold
  • RenderMan Studio
  • MentalRay 3.10
  • 3D Light
  • Houdini
  • Mari
  • Mudbox
  • 3D Coat

Paso a paso como utilizar Ptex en Mari, Maya y VRay.

  • Chequear el asset en Maya, cerciorarse de que no tenga UV Mapping alguno y exportar como .obj

  • Crear un nuevo proyecto en Mari e importar el .obj exportado desde Maya.
  • Seleccionar Force Ptex como Mapping Scheme y seleccionar Create From Face Groups en Selection Sets. Esto forzará a Mari a trabajar con Ptex por si acaso nos hemos olvidado algunos restos de UV Mapping, y nos creará un grupo de selección por cada cara de la geometría.
  • Finalmente elige las opciones de textura que necesites.

En la nueva ventana que aparece, tenemos varias opciones. La primera es para cargar un archivo de Ptex en el caso de que ya hayan sido creadas texturas para el asset. Supongamos que otra persona ha trabajado en las texturas y nos pasa la geometría y el archivo para cargar en Mari.

La siguientes opciones son relativas a crear Ptex desde cero. Nos encontramos dos opciones diferentes.

  • Uniform Face Size: Solemos utilizar esta opción cuando todas las caras de una geometría tienen similar tamaño. Con esta opción tenemos que seleccionar Per Face Texture Size, que es el tamaño en texels de cada textura que se aplica a cada una de las caras. Y finalmente el Format (8bits, 16bits o 32bits) y un Color base.
  • Worldspace Density: Aplica la resolución de textura en texels a cada centímetro de geometría. Con este método las caras pequeñas tendrán menos resolución que las caras grandes. Generalmente yo utilizo este método.

Vemos que Mari se inicia, se carga nuestro asset y se crea un channel y una layer llamados Ptex. Fijaos que no tenemos acceso a la pestaña UV.

  • Si seleccionamos, podremos comprobar que un Selection Set ha sido creado para cada una de las caras de nuestro asset. Ptex siempre funciona bajo polígonos individuales, así que poder seleccionarlos uno a uno es muy importante.
  • Podemos pintar y ver que tal se comporta el trazo.
  • En la barra de herramientas de Ptex podemos cambiar la resolución de las texturas de las caras seleccionadas. De este modo, si vemos que al pintar no tenemos suficiente resolución, simplemente seleccionamos las caras y aumentamos el número de texels. No olvides darle al icono redondo para aplicar los cambios.
  • En este ejemplo he reducido el número de texels, y como podéis ver, el trazo es apenas visible y de muy mala calidad.
  • Huelga decir que se puede utilizar cualquier herramienta de forma normal. Proyecciones, displacements, etc.
  • Una vez terminada tu textura, para exportarla sigue el mismo proceso que con texturas basadas en UV Mapping. Simplemente click derecho encima del channel deseado y Export Current Channel Flattened.
  • Utilizar las siguientes opciones en la ventana de diálogo.
  • La forma mas rápida para comprobar si se ha exportado bien, es crear una capa vacía e importar el archivo.
  • Para renderizar en Maya, simplemente importa el asset como .obj o cualquier otro formato.
  • Crea un VRay Material y un nodo VRay Ptex.
  • Listo, lanza el render y voilá!

Se que en algunas ocasiones, puede resultar un tanto complicado hacer que los desplazamientos esculpidos en Zbrush funcionen correctamente en un software 3D.

Puede que los detalles no se vean exactamente igual, que la calidad del desplazamiento no sea la esperada, y un largo etcétera de problemas.

He grabado un vídeo tutorial donde explico los diferentes tipos de desplazamientos que nos podemos encontrar hoy en día.
Como exportar correctamente los mapas de desplazamiento desde un software de esculpido como Zbrush.
Y finalmente, como trabajar en Maya con Vray 2.0 para que el desplazamiento funcione exactamente igual que en Zbrush.

Además de eso, también explico como re-proyectar detalle en Zbrush desde un modelo esculpido a un modelo de producción, listo para render.
Como realizar de forma muy breve UVs en UV Layout.
Y finalmente, todo el proceso de exportación de mapas de 16 bits, 32 bits, vector displacement, y su utilización en Maya y Vray.

Espero que os sirva y podáis aplicarlo en vuestros pipelines personales.
Cualquier duda o sugerencia, dejad un comentario.

Este post es una traducción del original escrito en Septiembre del 2013 en el blog de Xuan Prada.

He hecho un pequeño breakdown de las texturas que normalmente hago cuando trabajo con piel humana.
Digamos que lo mismo que muestro aquí podría extrapolarse para el resto del cuerpo.
Dependiendo de la producción, el pipeline, el motor de render o los shaders, las texturas pueden variar, pero estas son más o menos las genéricas que siempre están.

  • Renders utilizando un set-up neutro para look-dev.
  • Mapas diffuse.
  • Mapas overall.
  • Mapas scatter.

Mapas displacement.

  • Mapas fine displacement.
  • Mapas specular.