Skip to main content

Python API do Houdini (HOM)

O HOM (Houdini Object Model) é a API Python completa do Houdini. Tudo que você faz na interface pode ser feito via HOM, e algumas coisas só dá pra fazer via HOM.

Acessando o HOM

Python Shell: Windows > Python Shell ou Alt+Shift+P

import hou
# Toda a API do Houdini fica no módulo hou
# Você SEMPRE precisa do import hou

Hierarquia de nós

import hou
# Raiz da hierarquia
root = hou.node('/')
# Contextos principais
obj_context = hou.node('/obj')
out_context = hou.node('/out')
mat_context = hou.node('/mat')
# Acessando um nó específico
box = hou.node('/obj/geo1/box1')
print(box.name()) # 'box1'
print(box.path()) # '/obj/geo1/box1'
print(box.type().name()) # 'box'

Criando nós

import hou
obj = hou.node('/obj')
# Cria um geo object
geo = obj.createNode('geo', 'meu_objeto')
# Dentro do geo, cria um box
box = geo.createNode('box', 'box1')

Lendo e setando parâmetros

import hou
box = hou.node('/obj/geo1/box1')
# Ler parâmetro
size_x = box.parm('sizex').eval()
print(f"Size X: {size_x}")
# Setar parâmetro
box.parm('sizex').set(5.0)
box.parm('sizey').set(3.0)
# Setar tuple (ex: translate)
box.parmTuple('t').set((1.0, 2.0, 0.0))
# Setar expressão
box.parm('sizex').setExpression('sin($F * 0.1) * 2 + 3')

Keyframes

import hou
node = hou.node('/obj/geo1')
parm = node.parm('ty')
# Cria keyframe no frame 1 com valor 0
kf1 = hou.Keyframe()
kf1.setFrame(1)
kf1.setValue(0)
parm.setKeyframe(kf1)
# Cria keyframe no frame 48 com valor 10
kf2 = hou.Keyframe()
kf2.setFrame(48)
kf2.setValue(10)
parm.setKeyframe(kf2)

Selecionando nós

import hou
# Pega todos os nós selecionados no network atual
selected = hou.selectedNodes()
for node in selected:
print(f"{node.name()}: {node.type().name()}")
# Seleciona um nó específico
node = hou.node('/obj/geo1')
node.setSelected(True, clear_all_selected=True)
import hou
node = hou.node('/obj/geo1')
# Filhos
for child in node.children():
print(child.name())
# Todos os descendentes
for n in node.recursiveGlob('*'):
print(n.path())
# Pai
parent = node.parent()
# Inputs e outputs
inputs = node.inputs()
outputs = node.outputs()

Tip

O atalho hou.node('/obj/geo1').parm('tx').eval() funciona mas fica verboso. Em scripts longos, guarde o nó numa variável: n = hou.node('/obj/geo1') e use n.parm('tx').eval().