
Hoy vamos a desarrollar un fx visual muy interesante, podemos encontrar una referencia de este efecto, en la intro del set audiovisual HOLO realizado por Eric Pryz.
En esta ocasión usaremos una técnica similar con líneas verticales y horizontales, las cuales se deformaran con la presencia de un objeto determinado.
Vamos a comenzar con el sistema, explicando la función que cumple cada grupo de operadores.
Podes descargar el archivo para hacer un seguimiento de cada sección: Archivo toe / by Yeataro
Objetos:
El primer grupo de operadores son los elementos que colisionaran con la grilla, en este caso se trata de una Sop Box, y un objeto con forma de cabeza humana, a través del Switch1 Sop, vamos a poder seleccionar uno de los objetos.
Sop Box 1: Size x,y,z: 1.4 Rotate x: 30 Rotate y: 40 Scale: 0.3
Grid & Groups
Utilizando los operadores Group Sop, que genera grupos de puntos o primitivas y le permite actuar sobre estos grupos.
vamos a crear un área especifica, que contenga la sección interactiva.
Grid1 contiene el tamaño de nuestro grilla principal.
Grid1 Sop: Primitive Type: Polygon Size x: 2 Size y: 1 Rows: 30 Columns: 60
Group1 será el operador que nos limite el área de interacción en la grilla, esto es posible utilizando la opción Bounds de dicho operador.
Podemos elegir entre diferentes formas, para este ejemplo vamos a utilizar el tipo Bounding Box.
El tamaño de nuetra grilla era de 2×1, devemos generar un bounding box mas pequeño que la grilla:
Group1 Sop: Group Name: group1 Entity: Points Create/Bounds: ON Create/Size x: 1.95 Create/Size y: 0.95 Create/size z: 0.5
Group2 trabajara en conjunto con group1, lo veremos a continuación en la configuración de Group3
Activamos la opción de agrupación por números, en este ejemplo se seleccionaran 1800 puntos, correspondientes a nuestra grilla (Grid1)
Group2 Sop: Group Name: group2 Entity: Points Create/Number: ON
Group3 se encarga de combinar los diferentes operadores Group que tenemos en el sistema, vamos a utilizar la operación de sustracción entre el grupo 1 y 2, de esta forma obtendremos un área azul interactiva, y un marco amarillo estático, para nuestro sistema.
Group3 Sop: Group Name: group3 Entity: Points Combine/Group: group3 Combine/Group1: group2 / Operation: Subtraction Combine/Group2: group1
Ray Sop
Ray1 Sop se utiliza para proyectar una superficie sobre otra. Los rayos se proyectan desde cada punto de la geometría de entrada en la dirección de su normal. Esto se puede usar para colocar ropa sobre superficies, envolver un objeto con otro y efectos similares.
Activaremos la opción Interceptar la superficie más lejana, veamos un ejemplo visual para entender como funciona este parámetro:
Interceptar la superficie más lejana: ON
Interceptar la superficie más lejana: OFF
Como se ve en los ejemplos, el lado mas alejado del objeto es quien intercepta con la grilla, cuando la opción esta actividad.
Luego debemos seleccionar la opción de Collision Normal del parámetro Point Intersection Normal , de esta forma actualizara cada punto de la geometría de origen (Grilla) con la normal en la superficie de colisión con la que se cruza.
En el ejemplo anterior esto sucede cuando las secciones que conforman la cabeza humana coinciden con los puntos en la grilla.
El parámetro Point intersection Distance, actualiza cada punto interceptado con la distancia a la superficie de colisión. Si el punto no se cruza en la superficie de colisión, se usa una distancia de 0
Activamos el parámetro Create Point Group, y dejamos su nombre rayHitGroup
Ray Sop: Intersect Farthest Surface: ON Point Intersection Normal: Collision Normal Point intersection Distance: ON Create Point Group: ON Ray Hit Group: rayHitGroup
Spring
El Spring SOP deforma y mueve la geometría de entrada usando «fuerzas» de resorte en los bordes de los polígonos y en las masas unidas a cada punto.
La geometría se deforma usando fuerzas que simulan la física simple en los puntos y bordes. Se asigna una «masa» simulada a cada punto. Sus bordes primitivos actúan como «resortes» que se oponen a las fuerzas y empujan las puntas hacia sus posiciones originales. Cuando los resortes se estiran por las fuerzas, intentan tirar de las puntas hacia atrás. Sin embargo, los puntos no dejan de moverse cuando vuelven a sus posiciones originales, sino que continúan oscilando debido a su masa, hasta que la oscilación se extingue.
Las fuerzas que actúan sobre los puntos son las siguientes:
- fuerza externa (gravedad)
- viento (similar a la fuerza externa)
- turbulencia (fuerzas caóticas)
Cuanto mayor sea el valor de arrastre, o menor sea la masa, más rápido se extingue la oscilación.
Repasemos los parámetros que están activados en este operador y que función cumplen:
Fixed Points Group vamos a especificar los grupos de puntos que se verán afectados por las fuerzas, no todos los puntos se modificaran, como vimos antes en la creación de grupos, limitamos una sección utilizando la opción Bounding Box, solo los puntos dentro de esa caja roja serán modificados.
Copy groups from source utiliza los grupos agregados en la sección anterior «Fixed Points Group» el contenido de estos grupos se mantendrá actualizado mientras surjan cambios.
Add Mass Attribute Se calcula la masa para la geometría deformada, Los puntos más pesados tardan más en ponerse en movimiento y en detenerse.
Spring Constant determina que apretados están los resortes. si se aumenta este valor los resortes estarán más apretados, haciendo que sea mas rígido. A medida que este número aumenta, los resortes pueden oscilar sin control.
Spring Sop: Accurate Moves: ON External Force x: 0/ y: -0.2 / z: 0.1 Turbulence x: 0.6 / y: 0.6 / z: 0.6 Turb Period: 0.5 Fixed Points Group: group3 rayHipGroup Copy groups from source: ON Spring constant: 100 Initial Tension: 5
Conversión de datos y Render
Nos queda hacer la conversión de datos provenientes del Spring Sop, y luego crear el sistema de render utilizando los componentes Cámara, luz y geometría, junto al Top Render, como solemos hacer habitualmente.
Line Material
Este operador tendra unas modificaciones, podemos notar su efecto en el siguiente Gif, a medida que avanza la geometría, las lineas se vuelven mas brillantes y blancas.
Eso se logra modificando unos parámetros en el operador Line
Line Mat: Distance Near: me.par.distancefar - 0.6 Distance Far: op('cam1').par.tz Width Near: 6 Width Far: 2 Line/Line Near Color: r: 1 / g: 1 / b: 1 Line/Line Far Color: r: 0.6 / g: 0.6 / b: 0.6
El parámetro Distance Far, esta enlazado a la distancia que tenga nuestro componente de cámara.
Los colores de las lineas Near/Far, pueden ser cambiados a gusto, al igual que otros parámetros, pueden experimentar con diferentes valores una vez que vean todo funcionando.
Grid2
Este operador se encarga de convertir las líneas que conforman la grilla en 2 tipos de primitivas, Polígonos y NURBS
Según cual elijamos, la tensión en las líneas se harán mas rígidas o elásticas, veamos las diferencias entre ambas:
Polígono:
Se conectan cada 3 puntos, para formar un polígono triangular o cuadrado. Se procesa en la GPU, ahí la geometría es convertida en polígonos triangulares y se dibuja. Tiene ventajas en términos de eficiencia.
NURBS:
En lugar de conectar puntos y caras en línea recta, se dibuja una superficie lisa con curvas calculadas matemáticamente, utilizando puntos como elementos de control.
El Parámetro Primitive Type, estará conectado a la variable rselect, la cual veremos mas adelante.
Esta variable servirá para cambiar entre ambos tipos de primitivas, generando un efecto diferente en la tensión de las líneas, y la propagación de las ondas.
Cámaras y seguimiento de objeto
Utilizaremos para este sistema 3 componentes nulos, nos servirán para determinar como queremos que se muevan los objetos y se posicione la cámara en nuestro proyecto.
Null3
Modificaremos los parámetros de translación en X e Y , utilizando los valores que llegan desde el operador Panel Chop
Panel Chop muestra los valores de interacción con nuestro componente principal «Tension Grid Sop«, cuando el Mouse pasa sobre el componente o hace click, esos datos podemos visualizarlos en el Panel, utilizaremos algunos de esos datos para generar los movimientos y selección de objetos.
Null 4
Se encarga de posicionar el objeto en un valor inicial de Translación Z en -0.8
y estará observando el movimiento en X e Y de Null3 (Look At)
Null 6
Utilizamos en este caso un Select Chop para obtener el valor Rollv
Math Chop tendrá una configuración de rango determinada:
Agregamos un Lag Chop para suavizar los valores, y asignamos esa variable a la Translación Z del Null 6
En el siguiente Gif podemos ver como el Null 4 permanece rotando sobre su propio eje (Cruz Verde), siguiendo el movimiento de Null 3
La distancia de acercamiento que tiene la cabeza humana, esta determinada por Null 6
Por ultimo asignamos algunos valores para la selección del objeto, su translación y rotación:
Cuando se presione el botón izquierdo del mouse, Lselect contara 1 valor a través del Cout1 Chop, y modificara el parámetro Index del Switch1 Sop
Cuando se presione el botón derecho del mouse, Rselect contara 1 valor a través del Count2 Chop y modificara el tipo de primitiva del operador Sop Grid2
Los valores del operador Null5 irán a la Translación, rotación y escala del operador Sop Transform2
Puede hacer una combinación muy buena, utilizando la información de posicionamiento y rotación que nos entrega el sistema de FaceTracking, explicado en este tutorial: FaceTrack + TD + Nvidia
Esto ha sido todo por hoy, espero que les haya gustado!
Una vez completado y este funcionando su ejemplo, pueden experimentar cambiando algunas variables y configuraciones, para encontrar nuevos aspectos visuales y lograr otros resultados interesantes.
Nos vemos en la próxima, muchos éxitos!
Interpretación y traducción del sistema by: Tolch