Comunidad Hispana de Houdini
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
10 de Febrero de 2012, 14:29:29

 
 
Houdini Forum  |  Houdini  |  Documentación  |  Tutoriales  |  Tema: Rompiendo hielo usando POPs

« anterior próximo »
Páginas: [1]
Imprimir
Autor Tema: Rompiendo hielo usando POPs  (Leído 1519 veces)
0 Usuarios y 1 Visitante están viendo este tema.
hmaster
Administrador
Apprentice
*****
Desconectado Desconectado

Mensajes: 43



Ver Perfil
« : 13 de Abril de 2008, 00:41:38 »

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 HIELO

1. 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:
Código:
$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 SOP
1. 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 SOP
1. 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 SOP
1. 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 SOP
1. 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 NETWORK

1. 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:
Código:
$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:
Código:
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 POP
1. 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:
Código:
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 POP
1. 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 PARTCIULAS

1. 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.





Citar
Este tutorial es una traducción y adaptación del tutorial original en el Houdini Training 4.0 de Side Effects
« Última modificación: 10 de Julio de 2008, 20:37:10 por hmaster » En línea
mrmojorisin
Apprentice
*
Desconectado Desconectado

Mensajes: 3


Ver Perfil
« Respuesta #1 : 07 de Noviembre de 2008, 00:54:01 »

Debo confesar que habia abandonado el foro... Triste... pero estoy de vuelta y lo primero que quiero hacer es agradecerte los tutoriales hmaster! Sonrisa, tambien aviso que estoy leyendo la ayuda (uf), he encontrado varias funciones con el famoso "$" pero todavia no se que significa $TX, $TY , etc.. en la ayuda encontré que por ej $T es tiempo en segundos, pero nada todavia de $TX, Y o Z (se que tiene algo que ver con las coordenadas)...
Bueno, nuevamente te agradezco el tiempo que dedicas a los tutoriales...

Saludos!
En línea
mrmojorisin
Apprentice
*
Desconectado Desconectado

Mensajes: 3


Ver Perfil
« Respuesta #2 : 07 de Noviembre de 2008, 02:49:51 »

Bueno, terminé, Cheesy... genial... pero una duda: vi que mediante el operador ch ("obj/etc") se puede usar para tomar valores de otros objetos... bueno yo cree un null lo movi en una linea recta, a estos valores los puse en sort, porque queria hacer que se vaya creando una grieta... pero lo que hace es que el agujero se va corriendo siguiendo el null... como puedo lograr lo que queria? o tengo que pensar en otra cosa totalmente distinta?
GRACIAS!
En línea
Damian
Apprentice
*
Desconectado Desconectado

Mensajes: 29


Ver Perfil
« Respuesta #3 : 07 de Noviembre de 2008, 23:10:31 »

Muchas gracias por el tutorial, lo entendi perfectamente. Por cierto, como se puede lograr que los pedazos de hielo que se rompen tengan alguna clase de variacion al momento de caer como rotar por ejemplo, es que todos caen de la misma forma. Y otra cosa, ese operador lookat no soluciona del todo aquella orientacion extraña que tienen los pedazos al comienzo, ¿eso se puede arreglar con alguno otro POP? ¿o seria mejor hacer esta clase de cosas con dinamicas?.
En línea
Unaided
Apprentice
*
Desconectado Desconectado

Mensajes: 61



Ver Perfil
« Respuesta #4 : 17 de Noviembre de 2008, 18:18:03 »

El tutorial es del Houdini Training 4.0, y lo que hay aquí es una traducción del mismo. Lo digo para que quede claro que no son "cosecha propia" del foro. El tutorial tiene su tiempo ya, pero creo es igualmente válido para entender un poco mejor el funcionamiento del programa.

En cuanto a lo que preguntais, lamento no poder ayudar, yo sé menos que vosotros. Ojalá le eche un ojo Miguel Perez o Slime, ellos seguro que saben poner luz a vuestras dudas.
En línea
tañedor
Apprentice
*
Desconectado Desconectado

Mensajes: 59



Ver Perfil
« Respuesta #5 : 23 de Enero de 2009, 18:00:11 »

Hmaster gracias por la iniciativa de los tutoriales, muy interesantes  Gi&ntilde;ar

mrmojorisin la idea que tienes del channel es buena, pero no necesitas para nada crear un nodo "Null" puedes referenciar los parametros del nodo "Sort/primitive/Point/X,Y,Z" a los valores de "Sort/Point/Point/X,Y,Z" de este modo donde digas que este el point la malla sera reordenada automaticamente, es muy muy útil.
En línea

Learning Houdini&Nuke
Sayden
Apprentice
*
Desconectado Desconectado

Mensajes: 88



Ver Perfil WWW
« Respuesta #6 : 27 de Enero de 2009, 23:53:06 »

Bueno yo ya lo he hecho.   Cheesy

Mil gracias a hmaster.

Yo estoy preparando un tuto sobre modelado procedural con nodos en castellano también.

A ver si lo termino de una vez que me tiene houdido  Sonreir
En línea

Páginas: [1]
Imprimir

« anterior próximo »
Houdini Forum  |  Houdini  |  Documentación  |  Tutoriales  |  Tema: Rompiendo hielo usando POPs
Ir a:  

 
Powered by SMF 1.1.12 | SMF © 2006-2009, Simple Machines LLC
Valid XHTML 1.0 Transitional Valid CSS 3.0