记录一些自己瞎写 (原谅本人的才疏学浅)以方便工作的hou 插件
01.geo 对应创建mantra
import hou
null_path=[]
for i in hou.selectedNodes():
mantra=hou.node('out').createNode('ifd','{0}'.format(i.name()))
mantra.parm('trange').set(1)
frame=hou.parmTuple('{0}/f'.format(mantra.path()))
frame.deleteAllKeyframes()
for s in i.children():
if s.type().name()=='null':
null_path=s.path()
star=hou.parm('{0}/start'.format(null_path)).eval()
end=hou.parm('{0}/end'.format(null_path)).eval()
star=int(star)
end=int(end)
mantra.parm('f1').set(star)
mantra.parm('f2').set(end)
mantra.moveToGoodPosition()
02.关于节点批量排序
Lambda表达式
》》》learn form 大佬
注意列表中的顺序
nodes=list((hou.node('/obj/topnet1/null1'), hou.node('/obj/topnet1/null2'), hou.node('/obj/topnet1/null3'), hou.node('/obj/topnet1/null4')))
nodes.sort(key=lambda x:x.name())
reduce(lambda x ,y:y.setNextInput(x)or y ,nodes)
03.创建对应物体到geo层级进行渲染
import hou
##tip:
tord=hou.ui.displayMessage('Choose nodes to Rendr (geo to obj)',buttons=('Ok','Close'))
if tord==0:
create=[]
#choose nodes to render
for n in hou.selectedNodes():
geos=hou.node('obj').createNode('geo','{0}'.format(n.name()))
objmerge=geos.createNode('object_merge','{0}'.format(n.name()))
objmerge.parm('xformtype').set(1)
objmerge.parm('objpath1').set(n.path())
#create geo col
col=(.5,0,1);
geos.setColor(hou.Color(col));
father=n.parent()
pos=father.position()
create.append(geos)
for i in range(len(create)):
geos.setPosition(hou.Vector2(pos[0]+i*3,pos[1]-1))
# hou.node("/obj").layoutChildren(items=(create),horizontal_spacing=2.0, vertical_spacing=-1.0)
04.通过path去删出每个不同path的物体(写的时候path默认设定在面上)
import hou
#currentNode
currentNodes = hou.selectedNodes()
#print(currentNode)
for i in currentNodes:
#col = (0.5,0.5,0.5)
#i.setColor(hou.Color(col))
nodepath = i.path()
root = i.parent().path()
print(root)
nodepos = i.position()
print(nodepos)
pathAttcode = i.geometry().findPrimtAttrib("path")
pathAtt = []
if pathAttcode :
for path in pathAttcode.strings() :
#print(path)
pathAtt.append(path)
# print(pathAtt)
for ib in range(len(pathAtt)):
# print(ib)
# print(pathAtt[ib])
name = pathAtt[ib].split("/")
# print(name[-1])
blast = hou.node(root).createNode("blast","ExtraPath_" + name[-1])
blast.setPosition(hou.Vector2(nodepos[0]+ib*3,nodepos[1]-1))
blast.setInput(0, i)
blast.parm("group").set("@path=" + pathAtt[ib])
# blast.parm("grouptype").set(3)
blast.parm("negate").set(1)
null = blast.createOutputNode("null","Out_ExtraPath_" + name[-1])
null.setGenericFlag(hou.nodeFlag.DisplayComment,True)
null.setComment(name[-1])
05.不用进入相机内部去设置相机的属性 (导入abc时设施分辨率麻烦)
import hou
def fix_camrea():
nodes = hou.selectedNodes()
camera_data = hou.ui.readMultiInput("输入相机分辨率参数&&相机近裁切参数",
input_labels=("Camera X Reslution", "Camera Y Reslution", "近裁切"),
buttons=("确定", "取消"),
severity=hou.severityType.ImportantMessage,
initial_contents=("2048", "872", "0.001"))
if camera_data[0] == 1:
pass
else:
reslution = hou.Vector2(int(camera_data[1][0]), int(camera_data[1][1]))
for node in nodes:
if node.type().name() == "alembicarchive":
press_parm = node.parm("buildHierarchy")
press_parm.pressButton()
for camera in node.allNodes():
if camera.type().name() == "cam":
camera.parmTuple("res").set(reslution)
camera.parm("near").deleteAllKeyframes()
camera.parm("near").set(camera_data[1][2])
hou.ui.displayMessage("相机分辨参设置完成!")
fix_camrea()
06.根据geo创建redshift 的节点
import hou
def find_cameras(node):
cameras = []
if node.type().name() == "cam":
cameras.append(node.path())
# 遍历子节点
for child in node.children():
cameras.extend(find_cameras(child))
return cameras
# 获取 /obj 层级下的所有相机,包括子层级
obj_node = hou.node("/obj")
all_cameras = find_cameras(obj_node)
# 输出所有相机路径
# print(all_cameras)
# print(len(all_cameras)!=0)
create=[]
#choose nodes to render
for n in hou.selectedNodes():
# print(n)# 在选中节点下创建ROP网络(若不存在)
# 在ROP网络中创建Redshift渲染节点
rs_render = hou.node("out").createNode("Redshift_ROP","rndr_" + "{0}".format(n.name()))
# 设置基本渲染参数(示例)
rs_render.parm("trange").set("on")
if(len(all_cameras)!=0):
rs_render.parm("RS_renderCamera").set(all_cameras[0]) # 指定渲染相机
rs_render.parm("RS_outputFileNamePrefix").set("$HIP/render/v001/$OS/$OS.$F4.exr") # image输出路径
rs_render.parm("RS_archive_file").set("$HIP/rop/v001/$OS/$OS.$F4.rs") # proxy输出路径
#rs_render.parm("RS_archive_enable").set(True)
rs_render.parm("RS_objects_candidate").set("") # object
rs_render.parm("RS_objects_force").set("{0}".format(n.name()))
rs_render.parm("RS_lights_candidate").set("") # light
rs_render.setCurrent(True,True)
create.append(rs_render)
pos=(0,0,0)
for i in range(len(create)):
rs_render.setPosition(hou.Vector2(pos[0]+i*3,pos[1]-6))
hou.ui.setStatusMessage(" Redshift node creation is complete and has been associated to the selected nodes ")
# hou.ui.displayMessage("Redshift节点创建完成并已关联到: {}".format(n.name()))
07.如何把ai(这里调的kimi (有15元免费试用))在hou中调用(不是太实用)
import hou
from openai import OpenAI
question=hou.ui.readInput("你好有什么问题")[1]
client = OpenAI(
api_key = "这里需要填写你自己api需要的key",
base_url = "https://api.moonshot.cn/v1",
)
completion = client.chat.completions.create(
model = "moonshot-v1-8k",
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": '{0}'.format(question)}
],
temperature = 0.3,
)
hou.ui.displayMessage('{0}'.format(completion.choices[0].message.content),buttons=('Ok','Close'))
# print(completion.choices[0].message.content)
本文介绍了在Houdini中使用Python脚本进行geo处理,创建mantra节点并设置参数,以及如何利用Lambda表达式对节点进行批量排序和连接操作。

2738

被折叠的 条评论
为什么被折叠?



