En este tutorial, usaremos POPs para crear una simulación de hielo rompiéndose. La geometría y el POP network son realmente simples. El POP network usa funciones muy útiles que serán vistas mientras vayamos avanzando en el tutorial.
CONSTRUYENDO LA SUPERFICIE DE HIELO1. Añadimos un
Geometry, y lo renombramos a
Ice.
2. Entramos en el y borramos el
File.
3. Añadimos un
Grid y especificamos los siguientes parámetros:
·
Primitive Type como
NURBS ·
Orientation como
ZX plane.
· Le damos un valor de 11 a
Size en ambos ejes.
· Incrementamos el valor de
rows y
columns a 20.
4. Añadimos un
Point SOP que conectaremos al
Grid, y activamos su visualización (Cook).
Este SOP lo usaremos para crear algo de ruido aleatorio en los puntos del
grid para que las primitivas individuales de la superficie no tengan un aspecto reticular. Podemos darle esa aleatoriedad a los puntos con una función.
5. Entramos las siguientes expresiones en cada uno de los campos para
X Y y
Z del parémetro
Position:
$TX+noise($TX,$TZ,2) $TY $TZ+noise($TX,$TZ,1)



noise()
float noise (float X, float Y, float Z)
Esta función puede ser usada para aplicar ruido a geometría.
Por ejemplo, para crear un relieve sobre un plano se puede añadir un point SOP y usar la siguiente función en el eje Z:
noise($TX,$TY,$TZ)
En este ejemplo usamos la siguiente función en el eje X:
$TX+noise($TX,$TZ,2)
¿Qué hace está expresión?
Toma la posición actual de cada punto en el eje X, uno por uno, y entonces añade ruido al mismo.
Al eje Y no se le aplicó función de ruido, por lo que los puntos mantendrán su misma posición en Y. En este caso decidimos que la superficie de hielo sea totalmente plana y suave.
En el eje Z usamos esta función:
$TZ+noise($TX,$TZ,1)
Hace lo mismo que la expresión aplicada al eje X, pero en este caso sobre el eje Z.
Esto es una función matemática, pero puede ser complicado para muchos. Simplemente podemos probar la función noise con tres valores separados con comas y podremos ver ilimitados aspectos aleatorios para la superficie. Las variables como $TX son importantes porque darán diferentes valores para cada punto usando números constantes.
Los siguientes ejemplos son perfectamente validos y darán simplemente una aleatoriedad a los puntos en una superficie a solo sobre X y de Z:
$TX+noise(2,1,2) $TY $TZ+noise($TZ,3,1)
$TX+noise($TY,3,$TX) $TY $TZ+noise(2,$TX,$TY)
Convert SOP1. Añadimos un
Convert SOP y lo conectamos al
Point SOP. Activamos su visualización.
2. Especificamos los siguientes parametros para el
Convert SOP:
· La opción
Convert To como
Polygon (es el valor por defecto).
· Incrementamos el valor de
Level of Detail a 1 para ambas direcciones (U,V).
Facet SOP1. Añadimos un
Facet SOP y lo conectamos al
Convert SOP. Activamos su visualización.
2. Especificamos los siguientes parametros para el
Facet SOP:
· Activamos
Unique Points marcando la opción
On.
Ahora cada polígono de la superficie es totalmente independiente de su vecino o polígono adyacente.
Primitive SOP1. Añadimos un
Primitive SOP y lo conectamos al
Facet SOP. Activamos su visualización.
2. Especificamos los siguientes parametros para el
Primitive SOP:
· En la pestaña
Face/Hull, fijamos el parametro
Vertex como
Reverse U.
Al final extrusionaremos las piezas de hielo para darles espesor. Para asegurar que se extrusionarán hacia abajo, necesitamos invertir las normales que por defecto están con dirección positiva en Y. Con esto podemos asegurar fácilmente que después lo harán bien.
Sort SOP1. Añadimos un
Sort SOP y lo conectamos al
Primitive SOP. Activamos su visualización.
2. Especificamos los siguientes parametros para el
Sort SOP:
· Vamos a la pestaña
Primitive y fijamos la opción
Primitive Sort como
Proximity to Point.
· En el parametro
Point ponemos los valores
-2 0 3 respectivamente.

En este punto debemos tener un árbol de nodos como este:
Con esto definimos un punto en el espacio alrededor de las primitivas que serán ordenadas. Este punto representa a partir de donde el hielo empieza a romperse. En la siguientes ilustraciones lo podemos ver:
El Sort SOP se ha usado en esta superficie para definir el punto de partida desde donde el hielo comenzará a romper.
Antes de establecer como Proximity to Point el parametro Primitive Sort, las primitivas se ordenaban por número de primitiva. La primitiva con ID 0, queda fuera de la ilustración, ya que está en una esquina de la superficie. Las primitivas son numeradas pues, en filas a través de la retícula que conforma la superficie. Esta es la configuración por omisión de cualquier grid.
En esta otra ilustración el parametro Primitive Sort está como Proximity to Point. Ahora las primitivas son numeradas desde la posición 0 que define el parametro Point, y radialamente hacia el exterior. Esto es sumamente importante para el efecto de hielo rompiéndose que queremos hacer.
CREANDO EL POP NETWORK1. Añadimos un
POP Network en el contexto obj, dentro de nuestro operador Ice.
2. Entramos en el y añadimos un
Source POP.
3. Activamos su visualización (cook) y también el template para poder ver la superficie en el viewport.
4. Especificamos los siguientes parametros para el
Source POP:
En la pestaña
Source:
·
Emission Type como
Prim Center (Ordered).
· En
SOP escogemos y seleccionamos el operador
sort1.

Esto le dice a Houdini que nazca una partícula solo desde el centro de cada primitiva. La opción Ordered hace que las particulas se generen secuencialmente siguiendo cada primitiva. Esto es, primitiva 0, primitiva 1, primitiva 2, etc.
En la pestaña Birth:
· En
Impulse Activation escribimos esta expresión:
$F>1 && $F<60
· A
Constant Activation le damos un valor de 0.
Las partículas ahora se generarán partiendo del fotograma y solo entre los fotogramas 1 y 60.
· En
Impulse Birth Rate escribimos la siguiente expresión:
nprims("/obj/Ice/facet1")/120

nprims()
Es una función la cual a partir de un SOP devuelve un numero de primitivas.
Como se produce la fragmentación es fácil de entender.
nprims("/obj/Ice/facet1")/120
Esto hace que vaya al directorio root de Houdini, y busque el objeto llamado Ice. Seguidamente entra en el, y busca el SOP llamado facet1. Una vez hallado el SOP, devuelve el numero de primitivas desde ese
Y ¿por qué dividimos entre 120?
Si miramos el Facet SOP podemos ver que tiene 1156 primitivas.
Sin dividir entre 120, el Source POP generaría 1156 partículas en cada fotograma. Una partícula desde el centro de cada primitiva. Por lo que todos los pedazos de hielo se romperían en el fotograma 1.
El valor de 120 es realmente arbitrario. Usando este valor, la expresión evalúa 9.63 y el Source POP genera 9.63 (redondeando, cerca de 10) partículas por fotograma. Así que en el fotograma 1, se romperán y moverán 10 pedazos de hielo, en el fotograma 2 lo harán otros 10, y así sucesivamente. En el fotograma 60 unas 560 piezas aproximadamente se habrán fragmentado y desplazado.
Si queremos que se rompan menos, simplemente incrementaremos ese valor.
Si queremos que se rompan más, reduciremos ese valor.
Técnicamente esta expresión no es necesaria. Podríamos simplemente especificar un valor de 10 por ejemplo. Lo que nos proporciona esta expresión es que si decidimos que nos gustaría que las piezas fueran más pequeñas, simplemente con incrementar el Level of detail en el Convert SOP sería suficiente. Así el facet SOP crearía más primitivas y no sería necesario ajustar esta red.
En la pestaña Attribute:
· Cambiamos el parametro
Initial Velocity a
Set Initial Velocity.
· Reducimos a 0 los valores para los tres ejes del parametro
Varience.
· Fijamos los valores para el parámetro
Velocity en X=0, Y=1 y Z=0.

En este punto activamos la visualización de los puntos, así veremos fácilmente las partículas, y le damos a Play. Debemos tener algo como esto:
Frame 40. La forma que describen las partículas es uniforme y con cierta forma de semiesfera.Como resultado de tener un valor de 1 para el Initial Velocity, cada partícula viaja con un ratio constante de velocidad en el eje Y.
Drag POP1. Nos aseguramos que estamos en el fotograma 1.
2. Añadimos un Drag POP y lo conectamos al Source POP. Activamos su visualización.
3. Escribimos la siguiente expresión en el parametro Scale:
rand ($ID)*2

4. Reproducimos la simulación de nuevo.
Frame 40. Ahora las partículas conforman una forma más aleatoria.
rand()
Esto es simplemente una función que genera un número aleatorio entre 0 y 1. Usamos rand(2). Una vez que un número aleatorio es generado por esta función, ese número no volverá a cambiar si la función es llamada de nuevo, a menos que hagamos un "re-seed" del generador aleatorio de números.
rand($ID)*2
$ID es una variable de sistema aplicada a cada partícula y es la abreviatura de Particle Identification Number (Numero de identificación de la partícula).
Cuando esta función es llamada, Houdini la aplica a cada partícula en la simulación a menos que se especifique un Source Group.
Force POP1. Nos aseguramos que estamos en el fotograma 1.
2. Añadimos un Force POP y lo conectamos al Drag POP. Activamos su visualización.
3. Especificamos un valor de -6 en el eje Y para el parametro Force.

Nuestro POP network debe ser como este:

4. Reproducimos la simulación de nuevo y debemos tener algo como esto:
Notas importantes:La velocidad inicial que especificamos en el Source POP es importante para el aspecto de esta simulación. No obstante es sutil.
En el visor prestamos especial atención entre los fotogramas 10 y 20. Como resultado de la velocidad inicial, notaremos que las partículas al inicio se mueven hacia arriba en el eje Y. Esto le da un aspecto hielo ondeando hacia arriba como si se rompiese hacia arriba antes. El Drag POP hace que las partículas se desplacen lentamente antes que el Force POP se aplique y las empuje hacia abajo en Y.
COPIANDO LA GEOMETRÍA A LAS PARTCIULAS1. Añadimos un
Primitive SOP. Desconectamos
popnet1 y conectamos
sort1 a
primitive2.
2. Conectamos
popnet1 a
primitive2.

3. Especificamos los siguientes parametros en
Primitive2:
· Activamos
Do Transformations.
·
Rotate to Template como
Match Normals.

4. Reproducimos la simulación en este punto. Si las piezas de hielo no se mueven, nos aseguramos que no hemos olvidado de activar
Do Transformations y hemos fijado
Rotate to Template como
Match Normals.
Mientras la simulación se reproduce, todas las piezas de hielo son copiadas a cada partícula y se rompen también todas.
· Escribimos en el campo Group 0-250

Esto simplemente limitará el numero de primitivas que serán copiadas a las partículas a 250.
5. Reproducimos de nuevo la simulación.
UN PAR DE DETALLES En el fotograma 2, las piezas de hielo se voltean con una extraña orientación, después se ordenan y finalmente comienzan a hundirse. Sino queremos que suceda este efecto así entonces:
1. Entramos en el
POP network.
2. Añadimos un
Look-at POP entre el
Source POP y el
Drag POP.

Para completar el tutorial daremos grosor a nuestras piezas.
1. Añadimos un
Extrude SOP dentro de nuestro Ice y lo conectamos a
primitive2.
2. Especificamos los siguientes parametros para el
Extrude SOP:
· Reducimos el valor Depth a 0.12


Y con esto ya habremos finalizado este ejemplo sobre como usar un POP para generar un efecto de fragmentación de bloques de hielo, transfiriendo la geometría al sistema de partículas.
