Houdini

Houdini es un programa de animación 3D, que tiene una interfaz complicada.

Houdini Apprentice es la versión gratuita que te permite utilizar casi todas las herramientas del de paga, con la condición de que los renders salen con una marca de agua y una resolución máxima de 1280 × 720 pixeles.

Tú tal vez te preguntarías: “Bueno, ¿Y para qué quiero descargar un programa que impone limitaciones tan importantes a mis gráficos?”

Yo pensé lo mismo.

Más aún, como explicaré en párrafos posteriores, los gastos crecen, comenzando por la renderización. Pero a pesar de todo me ganó la curiosidad de aprender un poco de VFX, y así descargué este pedazo de software.

El primer tutorial que realicé fue el de partículas verdes que emanan de la figura de un puerquito.

Fue difícil exportarlo en video. Más bien, el primer render logrado fue una imagen fija del mismo puerquito; añadí iluminación y un material.

Puerquito (20 de octubre de 2019).

A continuación es lo que se puede considerar mi primer diseño original, en donde utilicé MOPS (Motion Operators).

Diseño original en Houdini (28 de octubre de 2019).

Finalmente, en la víspera de navidad, a partir de loops creé una estrella:

Estrella (25 de diciembre de 2019).

De las cosas más sencillas en Houdini es generar un cubo (creas un geometry node y adentro un box).

Lo siguiente que se podría hacer con un cubo, sería agregarle una textura, e ir subdividiéndola. Así:

Luego, lo que tal vez querrías hacer con un cubo, es hacerlo caer sobre un suelo. Y tal vez que se rompiera en cachitos.

Simon Holmedal es un chavo que hace gráficos en movimiento y yo veía su conferencia.

En un anuncio que elaboró para Nike, simula el interior y exterior de un tenis utilizando varias técnicas. Por ejemplo, a la figura geométrica que modela la superficie del zapato se le puede encimar la animación de “una infección que va atravesando todo el zapato.”

En otro anuncio de Logitech, utiliza varios sistemas de partículas, los cuáles integra en el video.

En Houdini, todo comienza con una figura modelada en 3D, muy llana. Ésta se anima, y luego, es posible usar esa figura para que termine pareciendo una fotografía.

Algunos ejemplos de cosas que se pueden lograr en Houdini:

  1. En un plano, asignar un ruido con un patrón de infección. Y usar otro ruido que dependa del primero, que genere otro patrón más complicado.
  2. Usar una fotografía, y sobre ésta, crear una infección.
  3. Sobre una superficie se puede hacer una ola. Como la que se ve cuando tiende uno las sábanas o cuando se tira una piedra a un estanque.

4.  Luego, se puede combinar este efecto con el de una infección, a partir de “conectar líneas.”

5. Separadamente, crear dos figuras geométricas, como un cubo y una esfera texturizadas; luego combinarlas, y animarlas a partir de otra textura, creando al final una estalactita.

Algunos efectos de simulación requieren mucho procesamiento de memoria (me refiero por ejemplo, a un mesh que tiene muchas subdivisiones o a que existan muchas partículas en cierta superficie), y eso afecta la velocidad con que se puede efectuar la animación. En una computadora laptop normal difícilmente se podrá hacer un render a alta velocidad.

6.  La siguiente figura se obtuvo a partir de generar polígonos aleatoriamente esparcidos, usando un loop de 4 vueltas, que fue creando, en cada iteración, más polígonos aleatoriamente esparcidos.

Inspeccionando los nodos incluidos en Houdini que implementan ciertos efectos, encuentras la programación de éstos. No es necesario saber programar,  y en vez de eso, es plausible usar nodos. Pero se puede programar en Vex; estrategia que, bien utilizada, simplifica el trabajo. Debiera ser sencillo, por ejemplo, programar lo siguiente: Una vez construido un suelo al que se le añadieron divisiones, generar una ola que provoque un esparcimiento de éstas.

¿Es posible usar códigos de Processing u Openframeworks para crear efectos en Houdini? NO. Sólo se puede usar Vex.

¿Se puede pasar de un lenguaje a otro usando un nodo que haga el trabajo de conversión, Vex a Processing, por ejemplo? No. Así la explicación literal, en un foro:

“Hay que poder entender ambos lenguajes en un nivel intermedio. Una parte esencial es comprender cuáles porciones del código son intercambiables y cuáles no lo son. La implementación y cosas relacionadas con la arquitectura del código suelen no poder traducirse de un lenguaje a otro, a excepción de cuando ambas plataformas son muy similares. Por otro lado, los algoritmos sí suelen poder traducirse desde las fórmulas matemáticas, los pseudo-códigos de Wikipedia, o desde secciones de códigos que está escritos en otros lenguajes de programación. La sintaxis también puede ser muy similar y los tipos, constantes y funciones (types, constants, and functions) suelen también parecerse. Trigonometría, álgebra lineal, trazo de rayos (ray-trace), ruidos y PRNGs pueden estar implementados de manera diferente, pero hacen lo mismo en un entorno o en otro.

Por ejemplo, te tomaría como una hora traducir un algoritmo de intersección en 2D escrito en C++ a su versión en Vex.

Una ventaja del código de Vex es que es preciso y usa menos líneas. Desarrolladores de bibliotecas suelen ocuparse de convertir a Vex ciertas funciones y clases cuyo código, digamos en C++, tenga miles de líneas. Aunque a veces lo mejor es salirse de Vex y en vez de eso utilizar un par de nodos SOP. Que sean éstos los que calculen algunos atributos útiles.”[1]

Esta es mi guía de efectos visuales basada en videos de Youtube:

  1. En https://youtu.be/4gYLIOaUjMY ( “Point Waves with VOPs“) te tomas un toro y creas una ola en movimiento de partículas que se mueven en el toro. Con mantra (el renderer por default en Houdini) exportas el archivo en formato .exr, y así lo puedes abrir en After Effects. En After Effects puedes enfatizar la luminosidad y crear un visual un poquito más impactante.
  2. En https://youtu.be/CQ9VmCN2EsE (“How to render a million of objects in Blender“) creas un tapiz de donas, y un modelo virtual en movimiento aparece de entre las donas. Es como la cabeza de un niño que sale de una alberca de pelotas. Sorprendentemente, el maniquí virtual es reemplazado por una persona real en el videomontaje final.
  3. En https://youtu.be/4hednNHS3JE (“Simple Disintegration”) creas un geometry node, adentro de este creas un Font node. Con un Polyextrude conviertes la letra a un objeto 3D. Al lado creas una esfera, le conectas a un mountain node (que deforma la esfera), le conectas a esta un transform node, con lo que puedes mover el objeto y automatizar este movimiento. Conectas PolyExtrude y Transform a un Boolean node. Con el boolean node seleccionas la opción “substract” y así programas quitar cada punto de una de las figuras cuando hay otro punto de la otra figura en ese mismo lugar (con la figura A sustraes la figura B). Con otro boolean node encuentras la intersección de las dos figuras. Le conectas a este un popnet, para que se emitan partículas a partir de esa línea. Añades un merge node y un windforce node. Unos tweaks y ya tienes un efecto de texto que se desvanece. Lo exportas como .exr y en After Effects haces los toques finales. Dos segundos de animación tardaron una hora y media en convertirse en ese render.
  4. En https://youtu.be/uicuyjiDfiI (“Volume Abstract Formas”), importas el mesh de la cabeza de una persona. Con un ruido en un cloud node, se produce un efecto de deformación del volumen, que hace que el mesh se vea como una escultura. Un volume vop le añade hoyos al volumen, y una impresión de vejez, desgaste o lava. Estos efectos están basados en el trabajo de Lee Griggs.
  5. En https://youtu.be/ECRemmexgP0 (“Infecting points using VEX & the solver SOP”), con ayuda de Vex, se programa un algoritmo en el que, en el primer paso, un solo punto está infectado de rojo y todos los demás son blancos. En el segundo paso, los cinco puntos más cercanos se infectan de rojo y los demás se quedan en blanco. En el tercer paso, los a lo más cinco puntos blancos más cercanos de cada punto rojo se infectan de rojo y todos los demás puntos se quedan blancos. Y así sucesivamente hasta que casi todo punto blanco de la figura queda rojo.
  6. En https://youtu.be/JXr6wkJeqK8 (“Face Melt Tutorial”), aprendí a derretir el mesh de la cabeza de una persona. La secuencia inicial pasa de usar a un actor de carne y hueso a usar el mesh del actor, el cual es derretido.
  7. En https://youtu.be/-FAwlk_BGVQ (“Using Volumes, Flow Fields and Volume Velocity”), creas unos “hilos” que giran en torno a una esfera o cerca de esta, creando un efecto muy interesante.
  8. En https://youtu.be/-l9Cot3jVY8 (“A few things to know before learning Houdini”) se explican qué son los puntos, atributos, primitivos y detalles (points, attributes, primitives and detail), algunos comandos de teclado tipo I, G, P, o cómo ver dos figuras al mismo tiempo, creadas en un geometry node; agregar color, etc.
  9. En https://youtu.be/8VrbBE-XnXA (“Applied Houdini Volumes I”) aprendí a convertir el mesh de un puerquito en humo. Esto se hace usando “volúmenes”, que es cuando empleas una figura que no está hueca por dentro. Luego encierras el volumen dentro de un contenedor, que es donde sucederá la simulación. Todo ese espacio está lleno de voxels. Los voxels son el equivalente a un pixel. Son unidades de medida con tres coordenadas, que almacenan la información de cada pedazo de volumen que compone a todo un mesh. Aumentar la resolución de los voxels implica más uso de memoria para la computadora.

Ya que tengo una idea suficiente de cómo funciona Houdini, hay detalles que  son importantes de controlar. Por ejemplo, la interacción de los objetos 3D. En el tutorial (5), se afirma que en un video posterior se explicará cómo hacer que la infección sea provocada por otro objeto que se mueve a través de ese plano, pero no existe tal tutorial. De modo que si yo quiero usar la misma infección que acabo de aprender, se me debe ocurrir cómo incluir la parte en que otro objeto influye.

Ya sé transferir el color de una figura a otra figura que le atraviesa: Pon tú que primero creaste un grid (un plano)  en un geometry node y al lado creaste una esfera. Conéctale un transform a esa esfera para que puedas moverla en el espacio (en particular, para poder automatizar ese movimiento). Después del transform conecta un color. Este es un atributo y colorea la esfera, digamos de rojo. Después del color, conecta un Attribute transfer node. Un Atribute transfer node recibe dos inputs (la figura desde la que transfieres y la figura a la que transfieres el color). Con el parámetro Distance Threshold ajustas cuánta región del grid se coloreará cuando pase la esfera.

Esto es un principio básico de Houdini. De esto, partes para hacer todo el show de destruir una pared. Aquí, en vez de transferir el color estás activando la destrucción, cuando otro objeto pasa por ahí.

Hay que pensar. En un grid siempre es posible ver los puntos que le componen (seleccionar view points o ver el geometry spreadsheet). Luego, ya que tengo mi modelo de una infección, hay que añadir, digamos una esfera y tal vez conectar un booleano que diga: Si un punto en la esfera intersecta a un punto del plano, márcalo como rojo y empieza la infección.

¿Cómo está esa parte del código en el tutorial de la infección?

Es así: Creas un grid, le conectas un scatter node y a este le conectas un Attribute Wrangle. Este nodo, tiene al principio una opción “Group” al que le escribes el número 182. 182 es el nombre de uno de los puntos del grid.

En la parte de VEX Expression (En Attribute Wrangle) escribes:

@infect = 1;
@Cd = {1,0,0};

 

Lo que significa: asigna valor 1 y color rojo al grupo 182. Es decir, al punto 182 le dará un color rojo, y en el geometry spreadsheet observas que ese punto tiene infect = 1, mientras que los otros puntos tienen infect = 0.

Después del Attribute Wrangle creas un Solver y adentro le conectas un Attribute Wrangle (otro) que tiene el código respectivo a la infección, que es:

if(@infect == 0){

float search = ch('search');

int spnts[] = nearpoints(0, @P, search, 5);

int pt;

foreach(pt; spnts) {

if(point(0, 'infect', pt) == 1){

@infect = 1;

@Cd = {1,0,0};

}

}

}

nearpoints es una función de Vex. Está buscando los 5 puntos más cercanos al punto actual P, con respecto a la distancia (especificada en search, una opción del Attribute Wrangle). Esos 5 puntos que encuentra los guarda en un arreglo (spnts). Luego, el for each hace lo siguiente: para cada punto que tenía valor de infección igual a 0 en spnts, cambia su valor de infección a 1 y el color del punto a rojo.

En principio, creo que el chiste está en cambiar el valor del Group, para que esté no sea un solo punto, sino un conjunto de puntos (los que están en la intersección de la esfera con el plano). Y observar que eso multiplica las veces en que el algoritmo de búsqueda se tiene que inicializar: primero habrá un solo punto en esa intersección, justo en el momento en que haya una tangente a la esfera (aunque eso depende totalmente de cómo están situados la esfera y los puntos). Así se comenzará la infección, tomando ese punto rojo y luego los 5 puntos más cercanos, etcétera. Pero la esfera rápidamente atravesará más puntos en el plano (a manera de semicírculos o esferas) y cada uno de estos tendría que comenzar una nueva propagación de la infección desde ese punto. Observar, que muchos de los puntos de intersección (los interiores cercanos al centro de la esfera) tendrán vecinos que son todos rojos y en ese caso, el algoritmo no haría nada. Tendría que implementar esta idea y verificar que funciona. Es muy posible que sólo cambiando el group node, no baste para lograr el efecto.

Supongo que hay varias formas de fusionar los cuerpos o caras de dos personas. Ciertamente, una manera es con GANS.

También se trata de decisiones estéticas, tiempos y presupuestos. En (6), el paso de un personaje de carne y hueso a un mesh se ve muy artificial y eso  no me latió tanto, en lo personal. Eso no significa que tal vez exista una aplicación de esa idea, que mezcle mejor la realidad con la simulación 3D. Tal vez lo que yo necesite no sea una imagen fija de un modelo 3D la cual quiera disolver en pedacitos, sino una captura de movimiento, lo que agrega dificultades (ver por ejemplo el Keentools Face Tracker, con un periodo de prueba de 15 días y un precio de $149 dólares). Si no, tal vez otra posibilidad es trabajar únicamente en un mundo virtual; hacer un mesh muy parecido a las personas que protagonizarán el video y a partir de ahí trabajar en puro 3D.

De hecho, esto hace ver que mi querer establecer una relación más personal con mi actriz y dar un carácter performativo al visual, va totalmente en desacuerdo con elegir el camino de únicamente fotografías en 3D. Para hacer el mesh, sólo tendría que sentar a mi actriz en una silla, durante uno o varios días (por la cuestión de la prueba y el error), y tomarle fotografías. Voilá. No tendría ella que saber nada más de mí por el resto de su vida. Para tal caso, me sirve más hacer el modelado 3D de mi propia imagen.

En cambio, planear una coreografía, una trama, un beso, o un escenario físico detallado se acerca más a generar una experiencia física, inmediata y divertida para los involucrados. También requiere presupuesto. Tal vez son dos ideas que deben mantenerse separadas, pensando con sencillez y en lo que es funcional para mí.

Regresando a hablar sobre Houdini. En (7), un efecto de hilos gira en torno a una esfera, pero este objeto podría ser cambiado por el mesh de mi propia cabeza. Ya que el procedimiento para modelar un mesh, y haber llegado al punto de poder entender ese código plantea toda una hazaña, más la bronca de crear un buen render, se podría hacer un video sólo con eso. Sin embargo, en una exploración más profunda de Houdini podría querer utilizar por lo menos dos efectos entrelazados (tomemos en consideración que los visuales se prestan para incluir mucho detalle en apenas 2 segundos de una secuencia). El paso de un mesh a un convertirse en hilos o la manera de lograr una secuencia agradable entre dos efectos que están cambiando, parece un problema.

Otro efecto que me gusta es el Fog. Esta es una propiedad de los volúmenes en Houdini (Ver (9)).

El trabajo de Simon Holmedal a veces parece muy simple: creas una figura con muchas subdivisiones, como un único polígono que tiene una textura fractal en la superficie. El material se ve casi como una cerámica (muy orgánico), y a esto le agregas iluminación. Luego le tomas fotografías desde muy de cerca, para que se vea sólo una parte de la figura y en diversos ángulos, alternando vistas cercanas y lejanas del mismo objeto. O en otro ejemplo, una cámara está programada en forma de espiral (como las tomas aéreas de la ciudad de Nueva York en una superproducción Holywoodense) mientras que una simulación de una textura peluda se mueve en forma de crecimiento.

Simon Holmedal hace algunos de sus renders en RedShift, que es un renderer singular ya que utiliza GPUs en vez de CPUs (puede utilizar hasta 8 GPUs concurrentes por máquina). Nota cultural: una licencia de RedShift cuesta $500 dólares (aproximadamente $9,400 pesos) y un GPU Aorus RTX 2080 Ti Xtreme Waterforce 11GB cuesta $1350 dólares en Amazon (aproximadamente $25,420 pesos). Lo que hace las cosas aún más inaccesibles para una persona como yo, que ni tiene un trabajo estable. A la fecha no conozco alguien en México que posea un GPU de este tipo al cual yo pueda solicitar un acceso cada que necesite hacer un render de una escena modelada en 3D, ni sé cuál sería el precio exacto por este servicio. Yo creo que en México, hacer tanta inversión en una tontería como esta sería muy pero muy idiota, ya que nadie imaginaría los altos precios que implican esos gráficos para los cuáles que a ti te pagarían $3,000 pesos por crear un conjunto de flyers que se situarían en el background de la publicidad para redes sociales de las películas de la Cineteca Nacional.

Si no es que deberías dedicar tu vida a los motion graphics de malísimas series de TV comerciales; un ambiente de trabajo en donde a pocos les interesaría el paradigma científico de utilizar o no las redes neuronales para realizar una captura de movimiento.

Por otro lado, hay personas como Gene Kogan, que ilustran el lado académico del Machine Learning aplicado a las artes, y es ejemplo de alguien que, de algún modo u otro, financió instalaciones de arte contemporáneo que requirieron emplear GPUs.

Before your very Eyes” de Atoms for Peace, es un video musical que dirigió Andrew Thomas Huang, el cual puedo analizar mejor ahora que estuve aprendiendo Houdini.

A continuación puedes ver la foto que me tomé con el cineasta en su conferencia en Björk Digital México.

 

[1] https://forums.odforce.net/topic/28099-converting-java-processing-code-to-vex/

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *