otl工具說明,場景測試文件請參考附件,節點的連接,命名以及參數的設置都需要更程序相一致,否則工具無法運行。
詳情見附件:http://download.csdn.net/detail/baichuanxiaoove/9300277
所得效果是將粒子替代物bake成關鍵幀動畫的物體,一個Instance物體對應一個Geometry物體
instance節點連接參數設置:
VOP SOP節點創建orient屬性:
Python Module代碼:
from time import *
def bakeInstance():
tstart = time()
hou_node = hou.pwd()
hou_geo = hou_node.geometry()
hou.setFrame(int(hou_node.evalParm('f2')))
points = hou_geo.points()
point_loc = hou.node('/obj')
group_node = point_loc.createNode('subnet','group')
rbd_node = hou_node.node('..')
group_node.setPosition(rbd_node.position())
group_node.move([0,-1])
group_node.setSelected(True)
rbd_node.setSelected(False)
for point in points:
frags_node = group_node.createNode('geo','due'+str(point.number()))
a_node = hou.node('/obj/group/due'+str(point.number()))
b_node = a_node.children()
b_node[0].destroy()
c_node = a_node.createNode('object_merge','obj'+str(point.number()))
obj_num = point.attribValue('instancepath')[-1]
obj_path = c_node.parm('objpath1')
obj_path.set('/obj/'+rbd_node.name()+'/Obj'+obj_num)
for x in range(int(hou_node.evalParm('f1')), int(hou_node.evalParm('f2'))+1, 1):
hou.setFrame(x)
print str(x) + ' frame' + ',please wait...'
points = hou_geo.points()
for point in points:
pos = point.position()
orient_num = point.attribValue('orient')
frags_selet_node = hou.node('/obj/group/due'+str(point.number()))
orient_qua = hou.Quaternion(orient_num).normalized()
matrix3 = orient_qua.extractRotationMatrix3()
rot = matrix3.extractRotates()
point_tx = frags_selet_node.parm('tx')
point_keyframe = hou.Keyframe()
point_keyframe.setValue(pos[0])
point_tx.setKeyframe(point_keyframe)
point_ty = frags_selet_node.parm('ty')
point_keyframe = hou.Keyframe()
point_keyframe.setValue(pos[1])
point_ty.setKeyframe(point_keyframe)
point_tz = frags_selet_node.parm('tz')
point_keyframe = hou.Keyframe()
point_keyframe.setValue(pos[2])
point_tz.setKeyframe(point_keyframe)
point_rx = frags_selet_node.parm('rx')
point_keyframe = hou.Keyframe()
point_keyframe.setValue(rot[0])
point_rx.setKeyframe(point_keyframe)
point_ry = frags_selet_node.parm('ry')
point_keyframe = hou.Keyframe()
point_keyframe.setValue(rot[1])
point_ry.setKeyframe(point_keyframe)
point_rz = frags_selet_node.parm('rz')
point_keyframe = hou.Keyframe()
point_keyframe.setValue(rot[2])
point_rz.setKeyframe(point_keyframe)
print 'Done'
tend = time()
t = tend - tstart
print 'time use ' + str(int(t)) +" s"