Hace ya algunos años, publicamos en este blog un completísimo curso online sobre photogrammetry, o fotogrametría (parece ser) en castellano. Desde entonces han aparecido nuevos software, alguna que otra herramienta, y quizás algunos de los procesos han cambiado ligeramente, aunque nada revolucionario, la verdad. Por mi parte, hace tiempo que no trabajo en un proyecto donde requiera de la captura de assets mediante fotogrametría, el útimo show en el que utilicé de forma notoria técnicas de fotogrametría fue Assassin´s Creed.

En aquella ocasión capturé y recreé posteriormente parte del vestuario y props utilizados por Michael Fassbender y Ariane Labed. Tras aquel trabajo, no he realizado más que tareas muy esporádicas y sencillas, en cuanto a fotogrametría se refiere. Aun así, he ido seguiendo nuevas técnicas, herramientas y formas de hacer las cosas, y practicando algunas de ellas cuando el tiempo me lo ha permitido.

En un futuro, pretendo crear un nuevo curso de fotogrametría, expandiendo los conocimientos adquiridos en el primer curso publicado, y actualizando todo aquello que ha cambiado durante estos años. En este post, y en una serie de post que vendrán en un corto periodo de tiempo, pretendo mostraros a aquellos que no tengáis demasiada experiencia en técnicas de fotogrametría, como capturar un par de assets sencillos, utilizando para ello diferentes técnicas y herramientas. Hay que tener en cuenta que no todas las tareas de fotogrametría son iguales, y que no se aplican de la misma forma en todas las industria. Por ello, siempre estaré hablando desde el punto de vista de efectos visuales.

Pasaremos por todas las fases comunes de un proyecto de fotogrametría, incluyendo captura, shooting pattern, color correction, software de fotogrametría, reconstrucción del asset, clean-up, retopología, de-lighting, texturizado, look-dev, y render test.

Este es el asset que pretendemos capturar, una roca incrustada en el suelo. No nos preocuparemos de la hierba, simplemente de la superficie rocosa. Siempre que capturo un asset, hago una fotografía de contexto o staging, simplemente para mostar cual es el asset a capturar y el entorno que le rodea, para tener en cuenta el contexto de cara a una futura reconstrucción.

Los suscriptores de elephant vfx pro, podéis descargaros las fotografías raw para trabajar en este proyecto.

Este tipo de assets son muy sencillos de capturar. Basta con hacer un “turntable” con un par de alturas diferentes. Sin necesidad de utilizar trípode. El único equipo utilizado es una Sony A6000 con un milti zoom y una Macbeth Chart. También conviene utilziar sistemas de medición o escala a la hora de captuar. En este caso no he utilizado ninguno, pero siempre tengo un macbeth chart en frame, con tamaño conocido, así que puedo escalar el asset para obtener una escala real posteriormente.

Los settings de cámara, para este caso en particular, son extremadamente básicos. Fstop 11, ISO 300, aperture priority, es decir, ajuste automático en función de la apertura. White balance fijo, no importa cual (disparamos raw), en este caso nublado, y foco automático. La iluminación es natural, así que no nos preocupamos en ese aspecto. Como decía, este es el “pattern” utilizado para realizar las fotografías.

Mi organización de ficheros, por el momento al menos, es muy sencilla. Diferentes directorios para cada tipo de formato fotográfico.

Quiero utilizar la herramienta color checker passport para calibrar el color de mis fotografías adecuadamente, pero para ello necesito antes convertir las fotografías a DNG. No es necesario convertir toda la secuencia, basta con convertir una sola fotografía en la que el Macbeth chart esté en foco y bien expuesto. Una ve convertida, podemos utilizar la herramienta color checker passport con ella.

Automáticamente los swatches del color chart serán seleccionados, de no ser así puedes ajustarlos a mano. Una vez hecho esto, el software ajustará los valores de los swatches de la fotografía acorde a los valores de medición ideales del fabricantes del color chart. Y con ello crearemos un perfil de cámara que reutilizaremos posteriormente en Adobe Camera Raw para aplicar a todas las fotografías del shoot.

Una vez creado el perfil de cámara, abrimos la fotografía con Adobe Camera Raw. Lo primero que necesitamos hacer es aplicar el perfil creado anteriormente.

Lo que pretendemos con este proceso es linearizar la imagen. Linearizar es un término utilizado para diferentes propósitos en vfx, en este caso nos referimos a dejar la imagen lo más neutra posible, entendiendo por neutra, plana.

El tipo de curva debe ser linear, para que la transformación aplicada sea lo menor posible, y todos los ajustes deberán desactivarse para neutralizar la imagen de la mejor forma posible.

Ahora toca utilizar al herramienta white balance para eliminar la mayor parte de transformación de color aplicada por tu cámara, en este caso, la mia :)
Después, selecciona dos o tres swatches para matchear los valores proporcionados por el fabricante, en este caso 243, 160 y 52 aproximadamente. Una vez terminado, hacemos click en “done” y toda la información será guardada en los meta datos de la imagen.

Abrimos todas las imágenes en Lightrooms y sincronizamos los settings acorde a la imagen DNG que hemos corregido en Adobe Camera Raw. De esta forma todas las imágenes, que han sido realizadas bajo las mismas condiciones lumínicas y con casi idénticos settings de cámara, vivirán en el mismo contexto. Las imágenes resultantes las exportamos como .JPG El software de fotogrametría, aunque entiende imágenes de alto rango dinámico, no lo utiliza para nada, así que siempre vamos a utilizar imágenes de bajo rango dinámico. El resultado será el mismo pero el tiempo de computación será mucho menor.

Como software de fotogrametría en este particular ejemplo, vamos a utilizar Agisoft photoscan. Las licencias personales son realmente asquibles, y los resultados obtenidos en este software son excelentes. El otro software hot del momento es Reality Capture, que es considerablemente más caro, pero muchísimo más rápido, especialmente cuando trabajamos proyectos con varios cientos de fotografías.
La rapides, es lo único que en mi parecer es mejor en Reality Capture que en Photoscan, el resto, prefiero Photoscan. En el futuro utilizaremos Reality Capture para varias tareas.

Nota importante, Reality Capture no está disponible ni para Mac ni para Linux.

Lo primero que conviene realizar en Photoscan es analizar la calidad de las fotografías y descartar aquellas por debajo de 0.2

Este asset es muy sencillo, y no utilizamos ningún setup especial para capturar las imágenes, así que poco más necesitamos hacer en Photoscan. Tenemos que alinear las imágenes en primera instancia. Tenemos unas 90 imágenes, con suficiente overlapping entre ellas, así que la tarea de alineación se con total seguridad que será un éxito. Procursa siempre realizar suficientes fotografías para generar un point cloud suficientemente detallado.

Tras unos minutos las fotografías son alineadas y una cámara es virtual por cada disparo. En esta ocasión todas las cámaras han sido perfectamente alineadas, sin ningún descarte. Sinónimo de que el material fotográfico es bueno.

El siguiente paso es generar el point cloud. Este es el proceso que más tiempo requiere, en mi caso, utilizando un iMac 2013 ha tardado alrededor de 4 horas y media. Conviene utilizar la calidad más baja posible, simplemente para testear que todo funciona correctamente. Con esta calidad tardará apenas uno minutos. Si prevees que todo está ok, utiliza calidad alta y genera el point cloud.

Una vez terminado el proceso, podremos ver un point cloud, incluyendo vertex colors (no teturas) bastante detallado. Eso simplemente es un point cloud, aun tenemos que generar el mesh y las texturas. La densidad del mesh dependerá de la calidad del point cloud generado.

Una vez finalizada la generación del mesh y de las texturas, podemos exportar el proyecto mediante .fbx de esta forma conseguiremos la geometría y las cámaras para su posterior utilización en Maya, Mari, etc. Ten en cuenta de que tanto el mesh como las texturas son simplemente placeholder, vamos a generar un mesh y unas texturas aptas para el trabajo de producción. Lo que estamos exportando desde Photoscan no nos sirve para viajar a traves del pipeline de vfx.

Importamos en Maya el .fbx y obtenemos el mesh, las texturas y las cámaras. Para alinear o escalar el asset es muy importante agrupar todo el contenido dentro de un locator o similar. Necesitamos las transformaciones originales para seguir trabajando el asset en el futuro.

Continuaremos trabajando este asset en el siguiente post.
Los suscriptores de elephant vfx pro, podéis descargaros las fotografías raw para trabajar en este proyecto de fotogrametría.

Llevamos al extremo la Ricoh Theta, tratando de capturar condiciones lumínicas complicadas. Para ello, nos aprovechamos del último firmware de la cámara y la última actualización de la app que controla la cámara de forma remota.

Te cuento mis impresiones, y te muestro los resultados obtenidos. Además, también podrás descargarte el material utilizado en el post para hacer tus propias pruebas.

Este es un post exclusivo para los usuarios de elephant vfx pro. Desde vuestra página de contenidos podéis acceder al artículo.

Tanto en el blog de elephant vfx como en los cursos online o talleres presenciales, hemos hablado en un sin fin de ocasiones sobre diferentes estrategias para separar renders de cara a facilitar la labor de composición, de modo que podamos dotar de mayor control al equipo de compositores que se encargará de recoger los planos de lighting y de finalizar el plano antes de pasar a DI.

Hemos hablado de render passes, render layers, AOVs, LPEs, light groups, etc. Por ello, a menudo me preguntan cual es la forma correcta de renderizar un plano, o cual es el método que yo utilizo.

La respuesta, como casi todo lo que realizamos en VFX es la misma, depende. Depende del show, depende de la secuencia, depende del plano, depende de los assets de los que se compone el plano, de los FX, de las preferencias del supervisor 2D, del visual effects supervisor, etc.

En el caso de que sea yo quien decide, la respuesta es clara, el setup más sencillo, el más rápido de montar y el que ofrezca lo mínimo que requieren los compositores. Como norma general no me gusta facilitar un control absoluto por el mero echo de tener la posibilidad de hacerlo. Si no hay una justificación clara, no necesito generar unos setups enormes que lleven mucho tiempo tanto de montar en 3D como de reconstruir en 2D. Además mi ideal de trabajo en VFX es que el 3D sea lo mejor posible, que el trabajo de composición sea para mejorar el 3D, no para arreglarlo.

Aunque raramente sea yo quien va a decidirlo, aunque actúe como supervisor de lighting. La razón de ello, es que siempre consulto al supervisor de 2D, o al sequence supervisor, o al compositor encargado del plano en última instancia. No siempre, pero en general me gusta que quien vaya a recoger el trabajo que sale de lighting, pueda opinar sobre el material que le gustaría recibir, y en la medida de lo posible y dentro de los estándares de ambos departamentos, hacer todo lo posible para facilitarle todo aquello que considere necesario.

Lo que procuro siempre es, tras analizar considerablemente la secuencia y el plano, sugerir el material a proporcionar por lighting al departamento de composición. Cuando se trata de look-development, siempre trabajo con AOVs tanto directos como indirectos. Me lo llevo todo a Nuke y ahí realizo el offline look-dev. De estar forma puedo trabajar muy rápido y crear diferentes versiones en un tiempo relativamente reducido.

Cuando se trata de un plano de lighting, si es posible y si consigo convencer al compositor, y sobretodo, si el 3D tiene una calidad excelente, no me gusta proporcionar AOVs. En estas ocasiones me gusta proporcionar light groups. Considero que los light groups son mucho más sencillos de utilizar que los LPEs y aunque no ofrezcan un control total, opino que ofrecen un control más que suficiente para poder satisfacer tanto a lighting como a compositing.

De nuevo, si puedo permitirme no dividir en componentes los light groups, prefiero no hacerlo. Como decía, si el 3D es bueno, prefiero que los compositores no lo toquen. De ser este el caso, los light groups que renderizo son los beauty de cada una de las luces que utilice en el plano. Aquí abajo muestro un ejemplo muy sencillo de como realizar el setup de light groups en Maya y Arnold. En elephant vfx procuramos siempre hablar de técnicas, de sistemas de trabajo, no de software. Así que recuerdo a los lectores, que los light groups son una técnica agnóstica de software, puedes extrapolar todo lo que estoy comentando en este post a cualquier renderer.

Esta es la escena que estoy utilizando para esta demo. No es un plano de lighting, no hay tiempo para preparar algo tan complejo. Pero hagamos un ejercicio de imaginación y supongamos que esta escena es un plano de lighting. En el plano tenemos un personaje, un fondo, y varias luces. Suficiente para ilustrar este texto.

En las opciones de AOV light group de cada luz, tenemos que nombrar al grupo donde queremos incorporar una luz determinada. Podemos agrupar varias luces si así lo creemos oportuno, de hecho es una práctica muy habitual. Por ejemplo, en el caso de que estemos iluminando un estadio de fútbol, quizás podríamos querer agrupar todos los focos que colocados en la parte superior. En otras ocasiones, especialmente cuando tenemos setups más sencillos, lo más común es individualizar cada una de las luces. Para ello necesitamos crear un AOV light group para cada luz. En las imágenes de más abajo vemos como voy nombrando light groups para las diferentes luces.

Una vez nombrados todos los AOV light groups, el siguiente paso es crear esos AOVs en el render. Como decía, de momento estamos mostrando como crear los beauties. Para ello, basta con añadir custom AOVs con el prefijo RGBA seguido del nombre de cada uno de los AOV light groups.

Como nota adicional. En este ejemplo concreto, he tenido que añadir dos AOVs extras para emission y transmission. La razón es que una de las luces utilizadas en la escena y que contribuyen a esos componentes, no es una luz propia de Arnold, y el sistema de AOVs no funciona correctamente del todo. Si fuese una luz Arnold, no hubiese hecho falta añadir estos dos AOVs, la información estaría incluida en los beauties. Procurad no utilizar luces de Maya.

Con este setup de RGBA por luz, los compositores deberían tener un amplio control sobre el look final de plano sin necesidad de cambiar el look particular de los assets.

En el caso de necesitar aun más control, y siempre que esté justificado, podemos mediante un setup sencillo separar los componentes que creamos oportunos para cada uno de los light groups.

En este ejemplo estoy separando los componentes diffuse, specular, sss, transmission y emission de cada una de las luces del plano. Si los assets del plano utilizasen otros componentes de shading, bastaría con añadir estos. Sinceramente, a menos que el look final del plano no esté para nada claro, o estemos realizando look-dev del plano, no veo razón justificada para separar los componentes de shading en direct, indirect y albedo. Si quisiéramos hacerlo, por supuesto que podríamos. Pero hay que tener en cuenta la cantidad de AOVs por luz que acabaríamos generando, y por supuesto, las probabilidades de cometer errores tanto en el setup de lighting como en la reconstrucción en 2D también aumentarían. Como digo, muy perdidos tenemos que estar en el look-development del plano para necesitar un setup más complejo que componentes de shading per light group.

El setup básico en Nuke siempre es aditivo, y el control que se otorga a los compositores es suficiente como para reinterpretar el plano con mucha facilidad.

Pues ya está, poco más que añadir a este post. Este es el setup de light groups separados por componente de shading que más utilizo en las secuencias que superviso. Son muchos los planos que he iluminado sin ni siquiera separar los componentes de shading, sólo separando las luces y los beauties de las mismas. Siempre tratando de mantener los setups lo más sencillos posibles, justificando todo el material creado y dándole mucha importancia a la calidad del render 3D, para que el trabajo de 2D sea siempre para mejorar, no para arreglar lo que ha salido mal del 3D.

Los suscriptores de elephant vfx pro podéis descargaros las escenas de Maya y Nuke para analizarlas.

Desde hace unos años, utilizamos Cryptomatte para crear todo tipo de IDs, mattes, etc. Sin duda, la mejor y más eficaz forma de realizar este tipo de máscaras. Pero en ocasiones, debido a ciertas limitaciones que nos podemos encontrar en nuestra producción, no nos queda otra que recurrir a IDs de "toda la vida".

En este video te muestro como realizar un setup de IDs basado en custom AOVs.

En este post vamos a ver como crear variaciones de color y texturas de diferentes formas utilizando Arnold render. La idea principal, es dotar a varios assets, ya bien sean geometría, aiStandins, partículas, scatterers o cualquier otro tipo de multitudes, de variaciones de look, utilizando solamente un shader.

Vamos a mostrar cuatro formas diferentes de realizar esta tarea, cada una de ellas puede aplicarse en función de las necesidades particulares que cada uno pueda tener en su pipeline de producción.

Diferentes colores definidos para diferentes objetos

  • Esta es la escena que vamos a utilizar para todos los ejercicios. Ocho cabezas de una figura de Lego. El objetivo, es utilizar un solo shader y que cada cabeza tenga un color o una textura diferente.
  • Si lanzamos un render, este es el aspecto actual. Un shader sencillo con un color amarillo en el base color y en el sss color.
  • Crea un aiUserDataColor y conectalo tanto al base color como al sss color.
  • En sus parámetros escribe color en el campo attribute.
  • Selecciona el shape de cada objeto, y añade un attribute.
    • nombre: mota_constant_color
    • data type: vector
  • Si ahora vas a los extra attributes, puedes utilizar el color que quieras mediante valores RGB.
  • En este render sólamente he definido un color rojo para uno de los objetos.
  • En este render he definido colores RGB para cada uno de los objetos de la escena.
 

Colores completamente aleatorios y/o texturas definidas de forma aleatoria

  • Al igual que en el ejemplo anterior, tengo el mismo shader, con sss. Además, tengo un mapa de displacement conectado.
  • Lo que pretendemos es utilizar un color aleatorio para cada uno de los objetos, o en lugar de un color, una serie de texturas definidas asignadas de forma aleatoria.
  • En estos momentos este es el aspecto del render. Mismo shader con mismos parámetros para todos los objetos.
  • Crea un aiUtility y conéctalo al base color y al sss color.
  • Pon en shade mode como flat y el color mode como object id.
  • Estos settings nos proporcionarán un color aleatorio para cada objeto.
  • Si lanzamos un render este es el resultado.
  • Conecta un aiRandom después del aiUtility.
  • Pon el type como color.
  • Introduciendo diferentes valores en el seed, obtendremos diferentes colores.
  • Render utilizando un seed con valor 2
  • Conecta un aiColorToFloat después del aiRandom y pon el mode como sum.
  • Con este nodo convertiremos los valores de albedo en datos, de donde podremos extraer máscaras.
  • Crea un aiSwitch y conecta tantos inputs como texturas necesites.
  • Conecta el aiColorToFloat al index input del aiSwitch.
  • Este es el resultado del render.
  • Para obtener diferentes variaciones podemos conectar un aiColorCorrect después del aiRandom y tocando por ejemplo su exposición, alteraremos los valores de albedo y por lo tanto de las máscaras.
  • Tambien podemos utilizar un seed distinto para obtener mayor variación.
  • Otro render diferente aumentando la exposición del aiColorCorrect.
 

Una textura diferente definida para cada objeto utilizando un solo shader

  • Renombre todas las texturas utilizando el siguiente template.
  • Añade el siguiente attribute al texture file node
    • /Users/xuanprada/Desktop/arnold_variance/textures/<attr:head default:COL1_head_a>.tx
    • Añade un attribute al shape de cada objeto
      • nombre: mtoa_constant_head
      • data type: string
    • Si ahora vas a los extra attributes, puedes llamar a una textura diferente basándote en naming convention.
    • Render final.
     

    Lo mismo que en el caso anterior, pero basándonos en naming convention de shape

    • Renombra las texturas basandote en el siguiente template
      • COL1_head_a.tx
    • Añade el siguiente tag al nombre del file texture node
      • /Users/xuanprada/Desktop/arnold_variance/textures/COL1_<shapeName>.tx
    • Los shapes de cada objeto han de ser renombrados utilizando la siguiente nomenclatura.
    • Render final

    Si eres usuario de elephant vfx pro, puedes descargarte las escenas utilizadas en este tutorial.