【Houdini】Python | HOM 介绍

简单示例:打印节点树:

【Houdini】Python | HOM 介绍

import hou
def print_tree(node, indent=0):
    for child in node.children():
        print (" " * indent + child.name())
        print_tree(child, indent + 3)

print_tree(hou.node('/'))

加载文件

import hou

try:
    hou.hipFile.load("myfile.hip")
except hou.LoadWarning as e:
    print (e)

访问Node

import hou
# hou.hipFile.clear()  // 清空项目

# 访问节点(没有返回None)
hou.node('/obj')
n = hou.node('/asdfasdf')
print (n) # 瞎几把写 返回None

# 创建节点(实例化)
g = hou.node('/obj').createNode('geo') 
print (g) # geo1(打印会显示节点名,不过g本身是节点对象)

# 访问属性(没有会报错)
tx = g.parm('tx')
print (tx) # <hou.Parm tx in /obj/geo1>

# 属性赋值
tx.eval() # 0.0
tx.set(3.5) # 设置为3.5
print(tx.eval()) # 3.5

# 不想用eval(),可以直接用evalParm
print(hou.evalParm('/obj/geo1/tx')) # 3.5
# 或者用ch
print(hou.ch('/obj/geo1/tx'))

# 打印所有参数
print([p.name() for p in g.parms()])
print(tuple(g.parmTuple('t')))

# 完整的
box = geo.createNode('box')
subd = geo.createNode('subdivide')
subd.parm('iterations').set(3)
subd.setFirstInput(box)
subd.moveToGoodPosition()
subd.setDisplayFlag(True)
subd.setRenderFlag(True)
subd.setCurrent(True, clear_all_selected=True)

使用动画参数和关键帧

当你听到 “动画参数 “这个术语时,通常会想到关键帧的值、贝塞尔曲线以及动画图编辑器。不过,回顾前面的内容,有表达式的参数也被认为是动画参数。所有的动画参数至少有一个关键帧,每个关键帧有一个表达式。典型的带表达式的参数只是有一个关键帧,其表达式是sin($F)或cos(time()),而典型的动画曲线有多个关键帧,其表达式是bezier()。

那么,像bezier()这样的函数是如何在不同的时间评估为不同的值的呢?显然,没有传递给bezier的参数是随时间变化的,也没有传递关键帧或斜率值。答案是,关键帧存储的不仅仅是一个表达式。一个关键帧存储了这些值、斜率和加速度,而某些函数,比如bezier,可以访问当前关键帧和下一个关键帧的这些值。对于像sin($F)这样的表达式的关键帧,这些额外的值不会被设置,也不会被使用。

每个关键帧都有一个相关的时间。使用该时间和每秒的帧数,你可以推导出关键帧的帧数。你可以把表达式看成是在关键帧之间的活动。胡迪尼在其关键帧和下一个关键帧之间评估该表达式。如果没有下一个关键帧,大多数动画函数(例如贝塞尔、立方体等)只需评估其关键帧的值。对于第一个关键帧之前的时间,参数评估为第一个关键帧的时间的值。

hou.Parm.keyframes()的值、斜率和加速度

  • 如果你设置了in值,而没有设置(out)值,那么认为out = in值。如果都没有设置,认为是并列的。
  • 例如,要用当前值和斜率设置一个关键帧,不要在关键帧中设置值或斜率
  • 或者,为了自动确定斜率,在不设置斜率的情况下设置一个关键帧
  • 时间和表达式
  • 入和出/值
  • 捆绑值
  • asCode()
  • Hscript表达式和Python之间的语法相同

使用对象和转换

  • worldTransform(), setWorldTransform()

  • matrices, exploding

  • column vectors for transforms (p T1 T2), not (T2 T1 p)

  • 参见 object_xform cookbook 示例

哪里可以找到错误信息

对于 shelf/tab 菜单:在弹出窗口的细节部分。

对于 HDA 的回调:控制台中。

对于 123.py/456.py:控制台中。

对于参数:节点的MMB(中键)。

对于基于Python的节点:节点的MMB。

解释 Python 错误消息

当 Python 代码产生一个未处理的异常时,它将显示一个引发异常的调用栈的回溯。通过查看回溯中的最后一条,你可以找到引发异常的那一行代码。

例如,如果在 实现fixFilePrefixes 时,出现了拼写错误,可能会看到以下回溯(看最后一行就完事了)。

>>> hou.session.fixFilePrefix(hou.node('/'), '/home/luke/project', '$HIP')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "hou.session", line 12, in fixFilePrefix
NameError: global name 'to_prefix' is not defined  ← ← ← ← ←

[sc name="note" ]Python源码编辑器、多行表达式编辑器、Shelf脚本编辑器和HDA脚本编辑器在右下角显示行号,有助于定位引发异常的那一行。[/sc]

提示

从网络编辑器中可以拖动节点到Python shell中,编程hou.node表达式。

使用变量来存储 hou.Node, hou.Parm, 和 hou.ParmTuple 对象,而不是频繁调用 hou.node 和 hou.Parm。

使用hou.Node.asCode()的输出来帮助学习HOM API中创建节点和设置参数及关键帧的部分。

 

 

给TA充电
共{{data.count}}人
人已充电
HoudiniHoudini文章与视频

【Houdini】VEX | 自定义细分函数

2022-3-1 23:21:45

HoudiniHoudini文章与视频

【houdini】zplus | SOP中文基础教程

2022-3-3 1:54:01

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
搜索