Motion graphics con 3Dsmax y particle flow

Motion graphics con 3Dsmax y particle flow

Hoy toca hablar de Motion graphics y 3dsMAX.

Los motion graphics son aquel conjunto de imágenes de soporte, generalmetne animadas, que suelen ayudar a la la materialización de conceptos e ideas para un mejor entendimiento del público en general. Son el conducto visual de nuestras ideas.

Puede ser concretos o abstractos. Algunos ejemplos son la tipografía kinética, el video mapping, y un largo etcétera que puede apreciar si escriben “motion graphics” en los buscadores de youtube y vimeo o cualquier otra plataforma.

Los motion graphics han adquirido importancia porque actualmente todo lo que pretendemos entender tiene alguna representación gráfica .

Uno de los apartados que se habían descuidado con 3dsMAX era el de motion graphics.

Para realizar cualquier tipo de animación abstracta había que pensárselo mucho e incluso recurrir a la ayuda de plugins.

Esto se ha ido solucionando muy satisfatoriamente con la integración de tres sistemas muy potentes: el sistema mparticles y los añadidos de datos para el sistema de partículas y el Max creation Graph (MCG) que es un lenguaje completo para disponer de todos los comandos dentro de max de forma paramétrica y editable en todo momento.

Algún añadido más digno de mencionar puede ser el Camera sequencer que se encarga de edición no lineal del orden de cámaras (una especie de final cut o premiere pero con las cámaras de MAX).

Hoy realizaremos una introducción el Data operator. Una rutina dentro del sistema de partículas que nos permite controlar los atributos individuales de cada partícula dentro de un sistema de partículas.

Hasta la implementación de esta super función se podía tener el control de elementos individuales de un sistema de partículas de forma parcial y mediante script. Esto dejaba a un gran número de usuarios fuera de juego porque programar queda un poco apartado de las habilidades oficiales de los diseñadores.

El gran beneficio de las tres implementaciones es que tienen un entorno gráfico de nodos. Son equivalentes aun diagrama de flujo y eso ayuda muchísimo a un no programador .Si bien programar en necesario para llegar a la cúspide del control, esto acerca el mundo del caos controlado de los motion graphics a los menos aprendidos en código.

Otro sistema de nodos bastante práctico es el que ahora se tiene en el editor de materiales "slate". Con ese sistema es más fácil estructurar el material pues se ven todos los componentes y sus ramificaciones en una especie de árbol de jerarquías.

Otro sistema de nodos bastante práctico es el que ahora se tiene en el editor de materiales “slate”. Con ese sistema es más fácil estructurar el material pues se ven todos los componentes y sus ramificaciones en una especie de árbol de jerarquías.

Hoy veremos cómo se puede controlar una caja de pins “pin box” mediante el sistema de partículas y su operador de datos.

Si no saben lo que es un pinbox aquí tenemos una imagen:

pinbox-art-diffuse-1-HD

Y si quieren saber como se lo puede usar al más puro estilo de motion graphics Les dejo este video que seguro les entretiene. Por cierto hecho con Vray.

Por razones de tiempo nos hemos decantado por un demo un poco menos pretencioso que el video, pero cumpliendo el mismo objetivo. El resultado de lo que veremos será:

Vamos por partes: primero miremos la escena y cómo está armada.

03escena

Como ven no es nada complicado. Son cuatro elementos: 1.- La cámara 2.- la “cama” de pins 3.- un domo de luz ambiental y 4.-una fuente de luz principal.

La parte importante es la “cama” de pins que funcionarán como una matriz de partículas que operen de forma individual, pero manteniendo la unidad de la forma más grande.

Primero generamos un plano cuadrado (mismo largo que ancho) porque es la figura que hemos elegido. En el caso del video musical la cama de pines sería más como un rectángulo.

Ese plano tiene que tener tantos vértices como pines queramos en nuestro pinbox. Tampoco nos olvidemos de nuestro pin con el cual crear luego nuestras instancias en el sistema de partículas.

06

1.- Nuestro pin de muestra y 2.- el plano con un total de 961 vétices.

Los vértices serán los indicadores de posición de nuestras partículas y por eso necesitamos saber cuantos tenemos. Para que el generador de partículas sólo cree esa cantidad y ni uno más.

El siguiente paso es crear el sistema de partículas. No vamos al menú de crear y bajo el apartado “particle systems” creamos el PFsource (particle flow source)

07

El tamaño del icono no importa y en realidad la posición tampoco porque luego le diremos que emita partículas a partir del plano y no de donde se encuentre el icono. En la captura está en el centro de eje de coordenadas por ser práctico tenerlo ahí.

Ahora ya nos metemos un poco en el sistema de partículas. Con el icono seleccionado podemos acceder a su editor de sistema con la tecla “6” o desde el menú de modificadores tendremos un botón que hace la misma función.

08

La siguiente captura muestra al lado izquierdo los dos componentes que usaremos para realizar todo. (aparecen por defecto con el icono del sistema de partículas) y a la derecha el resultado final que buscaremos. El segundo evento de la captura (lado izquierdo) tiene sólo dos atributos. Cuando abran el Particle view verán que ese segundo evento tiene más características. Con el fin de saber qué hace cada una, borraremos todo lo que sobre (se borra haciendo click derecho sobre el atributo que se quiere borrar y eligiendo del menú emergente la opción “Delete”).

 

09

Los atributos que iremos añadiendo para terminaron el resultado de la derecha los iremos arrastrando desde el menú inferior. Como ejemplo pueden ver que los dos eventos iniciales de la izquierda corresponden a los dos elementos que llevan el mismo número del menú inferior.

El primer ítem sólo tiene la instrucción de renderizar. Con esto nos aseguramos que todo lo que suceda luego sea visible en el momento del render. De momento no tocaremos nada de eso.

El segundo ítem es el evento o conjunto de instrucciones que van a guiar a las partículas. De momento contamos con un comando birth que le dirá la cantidad de partículas que debe generar y el tiempo en el que debe generarlas.

La captura muestra que en este paso le ordenamos generar 961 partículas entre el fotograma cero y cero. Al poner que emita partículas y termine de emitirlas en un mismo fotograma le estamos diciendo que las genere todas de una sola vez. Si le dijeramos un rango de fotogramas las partíulas irían apareciendo a medida que pasa el tiempo.

La captura muestra que en este paso le ordenamos generar 961 partículas entre el fotograma cero y cero. Al poner que emita partículas y termine de emitirlas en un mismo fotograma le estamos diciendo que las genere todas de una sola vez. Si le dijéramos un rango de fotogramas las partículas irían apareciendo a medida que pasa el tiempo.

En una comparativa entre el Display de las partículas por defecto y el finalizado vemos que la diferencia es que se cambia la opción “Ticks” por “Geometry” Con esto nos aseguramos que el visor nos muestre los pines en vez de puntos en la pantalla, que viene a ser por defecto lo que vemos cuando vemos partículas.

011El material no es lo que viene luego y en realidad no recuerdo porque lo tengo ahí, pero como en el flujo de trabajo no hay ni una condición ni una entrada a otro evento, pues puede ir en cualquier sitio. Tampoco importa, para este caso, haber puesto material dinámico o estático porque no haremos cambios de ningún tipo. Es sólo para poder controlar el material asignado a cada partícula.

012

La instrucción “position object” nos permite localizar el emisor en un objeto y a partir de cualquiera de sus elementos, a diferencia del “position icon” que viene por defecto para hacer que las partículas se emitan a partir del ícono del Pflow. También iremos al desplegable que está subrayado y elegiremos que las partículas nazcan de todos los vértices. Como son el mismo número de partículas y de vértices cada partícula ocupará el lugar de cada vértice  formando la matriz que buscamos.

013 014

El “Shape instance” nos permitirá elegir el objeto que queremos que sea representado por cada partícula. O sea el pin. Si el tamaño que de nuestro pin es el adecuado poco más hay que hacer en este apartado, si por el contrario lo hemos hecho muy grande, podemos acomodar la escala otros atributos mediante este comando.

015

Se habrán dado cuenta que hemos dejado el “data operator” de lado. Y es que hasta ahora todo o que hemos hecho era con el objeto de crear un sistema de partículas que partiera y se posicionara en base al plano que habíamos elegido. Será el “data operator” el responsable de la forma de actuar de los pines para generar la animación.

El “data operator” abre una segunda ventana con características similares a la del particle flow. Es un sistema de nodos que permitirá interacción de las partículas con cualquier objeto de la escena.

Esto equivale a crear un “reaction manager” o un “wire parameters” pero en vez de hacerlo con un objeto o algunos objetos, podemos aprovecharnos de influir en tantos elementos queramos porque pertenecerán al mismo sistema de partículas.

016

Si abstraemos un poco lo que está pasando en el pinbox de nuestro ejemplo y del video veremos que la animación de los pines se genera en torno al cambio de posición en un eje determinado.

0405

 

El “control” que se encargue de guiar los cambios enel video es un rostro y en nuestro caso es una imágen que añadiremos como material al plano para que sea este el que tome el mando.

Piensen un momento en el mapa de bump o de relieve. Dado que lo que queremos es que los pines suban y bajen un criterio acertado para aumentar y disminuir los vaores de posición en Z podría ser un mapa en blanco y negro y en escala de grises.

En el caso del rostro animado se pueden haber valido de esta técnica extrayendo la información de profundidad del rostro. El mapa de profundidad o Zdepth es un mapa en blanco y negro que se calcula basándose en la posición  de una geometría respecto a la cámara. Las partes más cercanas son más claras o blancas mientras que las partes alejadas irán gradualmente tiñéndose de negro.

Dispositivos como la Kinect son capaces de generar estos mapas de profundidad para “saber” a la distancia o en que posición se encuentran los usuarios respecto a la cámara.

En MAX existe un elemento en el apartado de Render Elements que también puede darnos esa información para nuestros renders. Su principal objetivo era poder crear la profundidad de campo en post producción. La profundidad de campo suele demorar bastante al render cuando se calcula junto con el mismo render.

Las teteras más blancas están más cerca según el código de blanco y negro

Las teteras más blancas están más cerca según el código de blanco y negro

 

Un rostro en mapa de profundidad. Zonas como la naríz o la frente tienen valores claros mientras que los costados y el curepo son más oscuros.

Un rostro en mapa de profundidad. Zonas como la nariz o la frente tienen valores claros mientras que los costados y el cuerpo son más oscuros.

 

 

Cómo nos ve la Kinect creando una nube de puntos y mapas de profundidad.

Cómo nos ve la Kinect creando una nube de puntos y mapas de profundidad.

En el siguiente video veremos lo que armaremos dentro del data operator para que la animación suceda. Esta es una captura de MAX y hemos hecho una copia del plano “control” responsable de la animación, sólo para  que sea más fácil explicarlo.

 

 

Se ha asignado un mapa en blanco y negro al difuso del plano y se lo ha animado mediante el UVWmap (keyframes en cambios de escala y rotación del gizmo).

Podemos apreciar tres estados de la animación: al principio y al final los pines no obedecen a la imagen, por lo tanto los pines están planos. Al principio de la animación es como si la imagen cobrara fuerza sobre la posición de los pines en Z, pero antes de “estabilizarse” generan un poco de caos haciendo caso individualmente a distintas fuerzas en Z. Luego de estabilizarse recién comienzan a ser guiados por los cambios en las UV del modificador, porque hasta ese momento no se había producido ningún cambio en el material.

Pasamos a ver lo que sucede dentro del Data operator.

018

Si simplificamos un poco el gráfico en realidad sólo se trata de asignar algún atributo de algún objeto de la escena como control (el número uno con azul) y de decirle que atributo de las partículas estará condicionado por ese control en forma de salida de datos (el número dos en rojo). Todo lo intermedio sirve para interpretar los valores de cada atributo y poder cuadrar su resultado.

La primera parte es muy directa (select object) y en su menú encontramos un filtro para saber que tipo de elementos elegir (por defecto en “all” para todos) y la opción de elegir un solo objeto (en nuestro caso el plano) o varios Objetos de control.

019

Los siguientes operadores me permitirán usar dos criterios de información del plano. Los conectores tienen distintos colores que son una ayuda visual del tipo de datos que devuelven. el tipo de salida de dato, así como la cantidad de factores de entrada de datos depende de la información que estemos buscando. En el caso de los dos operadores, por ejemplo, ambos son del tipo “Geometry” pero el de la izquierda tiene cuatro criterios de entrada (los números que están en la parte superior de la casilla) mientras que el de la derecha sólo tiene una entrada. La diferencia está en el atributo que se quiere extraer en este caso del plano.

Respecto a los tipos de datos que se pueden obtener tenemos una descripción extensa en el archivo de ayuda de MAX. Una de las ventajas del código de colores para cada tipo de dato es que si no sabemos muy bien lo que tenemos que poner o buscar siempre podemos optar por seguir los colores y así sabremos que tipo de dato hay que colocar luego.

Descripción de los colores y sus respectivos valores de datos.

Descripción de los colores y sus respectivos valores de datos.

 

En el primer operador de geometría elegimos que queremos el color del vértice respecto al material “point color” (1) (elegido del desplegable) . El mismo menú nos avisa que el tipo de salida será un vector (2). Además activamos la casilla de “animado” porque ese valor cambiará mientras pase el tiempo (3).

021

Para el segundo operador lo mismo, pero esta vez extraeremos la posición más cercana al punto “closest point by surface” Aquí le decimos que queremos que identifique la posicione de la partícula con el punto del plano que esté más cerca. Como se trata de una partícula para cada punto esto simplemente confirma donde tiene que buscar. Si hubieran más partículas que vértices entonces cada partícula excedente obedecería al color del punto que tenga en porcentaje más cerca.

022

El resultado de lo que hemos creado desemboca en un Vector. Este resultado ya es operativo por si solo y si de ahí pasamos a la salida “Standard output” que es nuestro cambio en posición en Z de las partículas, tendríamos algo condicionado por el movimiento del mapa en el plano (escala, rotación y posición). Pero en este caso hemos decidido añadir un “potenciómetro” que me permita decir cuán fuerte va a ser el efecto de ese resultado.

El potenciómetro será un “scalar”. El operador “scalar” nos permite básicamente incluir un valor manual que podemos decidir en qué tipo de datos se presenta, para intervenir en el cálculo total de los valores.

En nuestro caso elegimos unidades de medidad del mundo (centímetros) y las dos casillas siguientes son el valor constante y el valor variable)

En nuestro caso elegimos unidades de medidad del mundo (centímetros) y las dos casillas siguientes son el valor constante y el valor variable)

Para que nuestro potenciador sirva como tal es necesario operar matemáticamente con los dos valores que tenemos: el valor en forma deVector resultado del cálculo vértice-color de vértice y el valor que asignemos a nuestro switch expresado en forma de valor Real.

Al tener un primer contacto puede que parezca algo demasiado complejo para aprender, sin embargo luego nos damos cuenta que sólo hay que usar un poco de lógica e ir llenando las casillas necesarias. Es lógico que alguien con las mátemáticas más frescas lo encontrará aún más accesible, pero lo bueno es que de esta forma todos podemos llegar a aprender a usar estos comandos con un poco más o menos de esfuerzo.

El operador que hace el cálculo  entre los dos valores es el de “function”

Una vez arrastrado el operador a nuestro área de trabajo tendremos que elegir los tipos de entrada de los valores que intervienen : 1.- primer operando 2.-segundo operando y el tipo de operación.

Una vez arrastrado el operador a nuestro área de trabajo tendremos que elegir los tipos de entrada de los valores que intervienen : 1.- primer operando 2.-segundo operando y 3.- el tipo de operación.

Para que sea posible la operación entre esos dos valores tienen que tener la misma naturaleza. (reales contra reales o vectores contra vectores). como el resultado que buscamos tienen que venir en forma de número real (la posición en Z de la partícula) optamos por igualar todo a valores reales. Afortunadamente si elegimos que el valor de un operando es del tipo “Real” y le insertamos un “Vector” (como en el ejemplo) veremos que la máquina añade de forma automática un operador de conversión (convert) para traducir el valor en cuestión.

Ahora sólo queda explicar porqué elegimos multiplicación como operación entre los valores. El objetivo es poder de alguna manera “apagar” la potencia del efecto para poder tener el control no solo de su fuerza sino de cuándo queremos que comience. Si queremos que todo esté “apagado” y no haya efecto necesitamos un número que me permita obtener cero independientemente del valor que devuelva el “color-vértice”. Cualquier número multiplicado por cero es cero y de ahí nuestra opción. Si queremos todo desactivado el valor controlado puede ser cero y si se multiplica por cualquier número de los datos obtenidos del material del plano tendremos siempre lo mismo.

De forma añadida el “Scalar” nos permite añadir algo de caos o aletoriedad al resultado por partícula con su segundo valor “variation” que hace las veces de un desfase para que no se aplique exactamente el mismo va los a cada partícula. si el resultado en Variation es “Cero” todos tienen el mismo valor para su respectiva gama de blanco. Si no tendremos distintas intensidades.

Ahora ya sólo queda jugar con esos valores a ver que hacen.

Por ultimo, y para animar el mapa que se encuentra en el difuso aplicaremos un modificador UVWmap sobre el plano y lo animaremos para obtener distintos resultados.

Y eso es todo.

Como ven se abren un mundo de posibilidades con los comandos ya nativos de MAX para motion graphics. Todo está en indagar por estas funciones y probar muchas, muchas mezclas.

Escribe un comentario