在Houdini中用python获取非商业版节点数据并在商业版创建

需求来源

我们有时候会拿到一些houdini hiplc文件(非商业版)作为参考,如果我们想使用里面的节点,直接复制到自己工程里面的话会把商业版文件也变成非商业版。如果自己创建相同节点并且设置一样的参数会消耗大量的时间,就拿下面的演示案例来说,场景中有22个box节点,我尝试自己一个一个的创建并且收到输入一样的参数。这个过程非常耗时并且容易出错,显得特别的愚蠢。

图片[1]-在Houdini中用python获取非商业版节点数据并在商业版创建-数字折叠
图片[2]-在Houdini中用python获取非商业版节点数据并在商业版创建-数字折叠

解决思路

这种批量化的节点操作可以使用python来实现,其实思路比较简单,先在hiplc文件里获取到geo下面所有的box节点里面的size和t(center)信息,放入一个列表里面,然后再自己的工程里面根据这些列表重新生成box,如果不知道怎样写,可以借助ChatGPT。

实现方法

1.在hiplc文件工具架新建一个tool,里面输入获取box信息的代码,语言是python,如果你的节点路径有变请注意修改代码里的路径信息。

图片[3]-在Houdini中用python获取非商业版节点数据并在商业版创建-数字折叠
import hou

# 获取"/obj/geo2"节点
geo2_node = hou.node("/obj/geo2")

# 获取"/obj/geo2"节点下所有的子节点
all_children = geo2_node.children()

# 过滤出所有名字以 "box" 开头的子节点
box_nodes = [child for child in all_children if child.type().name() == "box"]

# 遍历所有的box节点
for box_node in box_nodes:
    # 获取box的尺寸和位置属性
    size = box_node.parmTuple("size").eval()
    t = box_node.parmTuple("t").eval()
    
    # 打印尺寸和位置信息
    print("Node:", box_node.path())
    print("Size:", size)
    print("t:", t)

2.打开Python Shell窗口,点击工具架上我们刚刚创建的工具,就可以看到窗口里面获取到了所有的box的节点名、尺寸、和位置信息了。我们直接复制这些信息。

图片[4]-在Houdini中用python获取非商业版节点数据并在商业版创建-数字折叠

3.在新工程里面,工具架上再次创建一个python工具,输入下面的代码

import hou

# 获取当前的geo节点
geo = hou.node('/obj/geo2')

# 提供的尺寸和中心点信息
node_data = [
    ("/obj/geo2/box1", [4, 3.5, 4], [0, 0, 0]),
    ("/obj/geo2/box2", [4, 3.5, 4], [0, 0, -4]),
    ("/obj/geo2/box3", [4, 3.5, 4], [0, 0, -8]),
    ("/obj/geo2/box4", [4, 3.5, 4], [0, 0, -12]),
    ("/obj/geo2/box5", [4, 3.5, 4], [0, 3.5, 0]),
    ("/obj/geo2/box6", [4, 3.5, 4], [0, 3.5, -4]),
    ("/obj/geo2/box8", [4, 3.5, 4], [0, 3.5, -12]),
    ("/obj/geo2/box9", [4, 3.5, 4], [0, 7, 0]),
    ("/obj/geo2/box10", [4, 3.5, 4], [0, 7, -4]),
    ("/obj/geo2/box12", [4, 3.5, 4], [0, 7, -12]),
    ("/obj/geo2/box13", [4, 3.5, 4], [4, 7, 0]),
    ("/obj/geo2/box14", [4, 3.5, 4], [4, 7, -4]),
    ("/obj/geo2/box16", [4, 3.5, 4], [4, 7, -12]),
    ("/obj/geo2/box17", [4, 3.5, 4], [8, 7, 0]),
    ("/obj/geo2/box18", [4, 3.5, 4], [8, 7, -4]),
    ("/obj/geo2/box20", [4, 3.5, 4], [8, 7, -12]),
    ("/obj/geo2/box21", [4, 3.5, 4], [8, 3.5, 0]),
    ("/obj/geo2/box22", [4, 3.5, 4], [8, 3.5, -4]),
    ("/obj/geo2/box24", [4, 3.5, 4], [8, 3.5, -12]),
    ("/obj/geo2/box25", [4, 3.5, 4], [8, 0, 0]),
    ("/obj/geo2/box30", [4, 3.5, 4], [8, 0, -4]),
    ("/obj/geo2/box31", [4, 3.5, 4], [8, 0, -12])
]

# 创建一系列的 Box 节点,并设置尺寸和位置
for node_path, size, center in node_data:
    # 创建 Box 节点
    new_box = geo.createNode('box')

    # 设置 Box 节点的尺寸
    new_box.parmTuple("size").set(size)

    # 设置 Box 节点的中心位置
    new_box.parmTuple("t").set(center)

    # 设置 Box 节点的名称
    new_box.setName(node_path.split('/')[-1])

print("所有 Box 节点创建完成。")

4.在对应路径下点击刚刚创建的python工具,就可以得到相同的节点了,按L键重新排列下位置,并且添加一个merge节点,得到了和非商业版一样的效果,节省了很多时间,也没有改变原始的工程版本,大功告成!

图片[5]-在Houdini中用python获取非商业版节点数据并在商业版创建-数字折叠

总结

该方法虽然能够实现自己想要的效果,但还有很大的局限性,需要手动修改代码和填入数据。完美的解决方案应该是创建一个hda工具,可以指定要导出的节点名,节点信息等数据存储成一个json文件,然后在新工程里通过工具打开这个json文件就可以自动实现一样的节点了,因为时间原因没有做过多的开发,希望以后能有机会完成这个工具,如果你对这个有兴趣也希望能够帮助我们实现下。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容