Houdni Python Note ( 一 )

// 获得子节点

1 mygeo = hou.node("obj").createNode("geo")
2 for child in mygeo.children():
3     print child

Output:

file1

上面代码创建了一个geo1节点,里面包含一个初始化的节点file1

// 删除节点

1  for child in mygeo.children():
2      child.destroy()

file1节点就被删除了。

//设置位移

1 >>>mygeo = hou.node("/obj/geo1")
2 >>>mygeo.parm("tx").set(4)
3 >>>mygeo.parm("ty").set(6)
4 >>>mygeo.parm("tz").set(8)

或者

>>>mygeo = hou.node("/obj/geo1")
>>>mygeo.parmTuple("t").set((4,6,8))

 //拷贝节点

1 >>> null1 = hou.node("/obj/geo1/null1")
2 >>> geo2 = hou.node("/obj/geo2")
3 >>> hou.copyNodesTo([null1],geo2)

注意第一个参数要求是一个list,可以把多个节点拷贝到某一节点下。

 // 获取当前节点路径

1 >>> obj = hou.node("obj/geo1/subnet1/box1")
2 >>> obj.path()

 //批量Bypass

从上游接过来的模型经常会有改动,有的模型不需要,被删掉,造成Houdini节点读取错误,要想在Houdini中正确渲染模型,必须手动修改,下面提供了一个简便的脚本

1 mynode = hou.node("/obj/palace")
2 for child in mynode.children():
3     for sub_child in child.children():
4         if len(sub_child.errors()) > 0:
5             sub_child.bypass(True)

  //学习groupby

将key函数作用于原循环器的各个元素。根据key函数结果,将拥有相同函数结果的元素分到一个新的循环器。每个新的循环器以函数返回结果为标签。

 1 #!/usr/bin/env python
 2 from itertools import *
 3 
 4 def height_class(h):
 5     if h > 180:
 6         return "tall"
 7     elif h <160:
 8         return "short"
 9     else:
10         return "middle"
11 
12 friends = [191,158,159,165,170,177,181,182,190]
13 
14 for m,n in groupby(friends,key = height_class):
15     print m
16     print list(n) 

最终打印结果:

tall
[191]
short
[158, 159]
middle
[165, 170, 177]
tall
[181, 182, 190]

   //自动为曲线添加点(shelf tool)

在Houdini中新建一个shelf , Script Language 选Python

 1 currentNode = hou.selectedNodes()[0]
 2 path = currentNode.node("..")
 3 new_node = path.createNode("attribwrangle","curve_twist")
 4 new_node.setFirstInput(currentNode)
 5 snippet = '''int pt = addpoint(geoself(),vector( point(geoself(),"P",npoints(geoself())-1) ) + set(0,0,0.1)   );
 6 int vt = addvertex(geoself(),0,pt);'''
 7 new_node.setParms({"snippet":snippet})
 8 new_node.setParms({"class":"detail"})
 9 new_node.setDisplayFlag(True)
10 new_node.setRenderFlag(True)
11 pos = currentNode.position()
12 new_node.setPosition(pos + hou.Vector2(0,-1.5))

之后,点一下shelf就会自动添加节点,为曲线添加点

    

    //获取物体中心(Pivot)

在研究一个RBD的文件时,看到老外(绝逼是B神)写了一段Python代码,在参数栏里,研究了一下,觉得挺酸爽

源文件:http://pan.baidu.com/s/1kVazAmV (IntrinsicXformsInSim.hip 文件)

代码如下:

 1 obj = hou.node(hou.parm("soppath").eval())    //得到的是 SOP Path(/obj/Dyn/OUT_Dyn) 的节点
 2 dopnet = hou.pwd().creator()                  //得到本节点的上游节点,本案例中,
                              由于RBD_Packed Object是在AutoDopNetwork这个节点中,所以得到的就是AutoDopNetwork
3 if dopnet and dopnet.type().category() != hou.objNodeTypeCategory():    //判断是否是Obj级别的节点 4 dopnet = None 5 if obj is None: 6 return 0 7 if obj.type().category() != hou.objNodeTypeCategory():  8 obj = obj.creator()                       // 如果不是Obj级别的节点,就找它的上一级别节点 9 p = hou.Vector3(obj.parm("px").eval(),         10 obj.parm("py").eval(), 11 obj.parm("pz").eval())         // 获取 pivot 12 tp = p * obj.worldTransform()                  // 得到transform 后的pivot 13 if dopnet is not None: 14 tp = tp * dopnet.worldTransform().inverted()   15 return tp[0]      //Pivot 的三个参数分别对应tp[0] tp[1] tp[2]

     //

def getInput(node):
    inputnode = node.inputs()
    if inputnode :
        inputnode = inputnode[0]
        inputnode = getInput(inputnode)
    else:
        return node
    return inputnode

node = hou.pwd()
node = getInput(node)
print node

 

转载于:https://www.cnblogs.com/peng-vfx/p/5193750.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值