需求来源
我们有时候会拿到一些houdini hiplc文件(非商业版)作为参考,如果我们想使用里面的节点,直接复制到自己工程里面的话会把商业版文件也变成非商业版。如果自己创建相同节点并且设置一样的参数会消耗大量的时间,就拿下面的演示案例来说,场景中有22个box节点,我尝试自己一个一个的创建并且收到输入一样的参数。这个过程非常耗时并且容易出错,显得特别的愚蠢。
解决思路
这种批量化的节点操作可以使用python来实现,其实思路比较简单,先在hiplc文件里获取到geo下面所有的box节点里面的size和t(center)信息,放入一个列表里面,然后再自己的工程里面根据这些列表重新生成box,如果不知道怎样写,可以借助ChatGPT。
实现方法
1.在hiplc文件工具架新建一个tool,里面输入获取box信息的代码,语言是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的节点名、尺寸、和位置信息了。我们直接复制这些信息。
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节点,得到了和非商业版一样的效果,节省了很多时间,也没有改变原始的工程版本,大功告成!
总结
该方法虽然能够实现自己想要的效果,但还有很大的局限性,需要手动修改代码和填入数据。完美的解决方案应该是创建一个hda工具,可以指定要导出的节点名,节点信息等数据存储成一个json文件,然后在新工程里通过工具打开这个json文件就可以自动实现一样的节点了,因为时间原因没有做过多的开发,希望以后能有机会完成这个工具,如果你对这个有兴趣也希望能够帮助我们实现下。
暂无评论内容