En este documento se explica el uso del nuevo operador de Python en Houdini 9.
Crearemos un nuevo SOP que modificará los puntos de una geometría generada para conformar un
Lorenz Attractor.¿Qué es un
atractor?
PreparaciónAbrimos Houdini 9 y guardamos el archivo en un directorio.
Creamos un nodo de geometría. Para ello pulsamos [TAB] y escribimos
ge. Pulsamos [ENTER] para confirmar.

Con el nodo Geo1 seleccionado pulsamos [ENTER] o [ i ] para entrar en el nodo y borramos el nodo file1.
Creamos un lineSOP y lo conectamos a un resampleOP.
Para hacer esto, pulsamos primeramente [TAB], escribimos line y pulsamos [ENTER]. Con el puntero seleccioando el output del nodo, pulsamos Shift+RMB y escribimos resa; pulsamos [ENTER] para añadir el resampleOP. Debemos tener un arbol como el de la imagen.

Ponemos la linea con unos 10000 puntos: desactivamos la opción
Maximum Segmente Length y activamos
Maximum Segments. Entonces en la casilla Segments escribimos 10000.

Con esto, ya tenemos la base de nuestro Lorenz Attractor. Guardamos el archivo.
El operador Python.Para comenzar necesitamos crear un nuevo operador Python: File > New Operator Type ...
Seleccionamos
Python Type y nombramos el OP. Por ejemplo le damos un
Operator Name rdg_lorenz_attractor y en
Operator Label, RDG Lorenz Attractor. Lo guardamos en un nuevo OTL, con la opción
Save To Library.

Aparece la ventana para editar propiedades del operador.
Creamos cuatro parametros de tipo
float y uno de tipo
float vector 3.
Nombramos los float con val_h, val_a, val_b, y val_c. Nombramos el float vector 3 con startpos. Etiquetamos los paramemtros con h, a, b, c, y Start Position respectivamente.

Vamos a la pestaña Channels y establecemos los siguientes valores en el Defaults de los parametros que acabamos de crear:
val_h = 0.01
val_a = 10
val_b = 28
val_c = 2.6667
startpos = (2, 1, 0)

Pulsamos
Apply para guardar nuestro operador. Dejamos abierto el Edit Operator Type Properties, ya que lo necesitaremos de nuevo.
El operado ahora está instalado y podemos crear una instancia: Pulsamos [TAB] en el visor de nodos y escribimos
rd; pulsamos ENTER dos veces para añadir el nodo. Conectamos el resampleOP al RDG Lorenz Attraktor. Para hacer esto, hacemos click en el output del resampleOP para sacar un conector y lo conectamos al input del RDG Lorenz Attractor.
Actualizamos el visor haciendo click en el boton azul del nodo:

Ya tenemos todo listo para introducir el script.
Volvemos al Edit Operator Type Properties que tenemos abierto, y vamos a la pestaña Code, donde introducimos ese bloque de código:
# This code is called when instances of this SOP cook.
geo = hou.pwd().geometry()
# Add code to modify the contents of geo.
# read the parameters of the node
startpos = hou.Node.evalParmTuple(hou.pwd(), "startpos")
h = hou.Node.evalParm(hou.pwd(), "val_h")
a = hou.Node.evalParm(hou.pwd(), "val_a")
b = hou.Node.evalParm(hou.pwd(), "val_b")
c = hou.Node.evalParm(hou.pwd(), "val_c")
# init some xyz
x1 = 0.
y1 = 0.
z1 = 0.
oldp = startpos
# loop through the point of the SOP
for pt in geo.points():
# do the lorenz attraktor
x1 = oldp[0] + h * a * (oldp[1] - oldp[0])
y1 = oldp[1] + h * (oldp[0] * (b - oldp[2]) - oldp[1])
z1 = oldp[2] + h * (oldp[0] * oldp[1] - c * oldp[2])
newpos = (x1, y1, z1)
# assign the new point position
pt.setPosition(newpos)
# save the position for recursive action
oldp = newpos

Presionamos
Apply de nuevo. Miramos en el Scene Viewer y presionamos [SPACE] y
a, para encuadrar en el atractor. Deberíamos ver algo como esto:

Podemos jugar con los parametros para modificar el atractor y buscar rangos de valores validos. Podemos cambiar esto en las pestaña Parameter del Edit Operator Type Properties.
ConclusionEsto ha sido simplemente una rápida introducción sobre como modificar geometría con Python, y el nuevo Python Operator de Houdini 9. Puede servir para añadir iconos, ser de ayuda en cualquier otro contenido digital, y crear algunos nuevos SOPs.