*詳情見附件:http://download.csdn.net/detail/baichuanxiaoove/9283755
Usage:
- Install bakeRBD.otl
通過這個工具可以將每個Voronoi Fracture碎塊bake成關鍵幀動畫,形成每個單獨的帶動畫幀的Geometry物體,可以導出FBX格式文件。
注意Voronoi Fracture與Pack參數設置,破碎的碎塊必須進行Pack之後再進行動力學解算。具體動力學節點連接請參看bakeRBD.hip場景測試文件。不計算動力學時間bake碎塊10000塊,時間5min左右。
PythonModule代碼:
from time import *
#Bake RBDs simulation to "group" subnetwork
#Packed RBDs simulation and get attributes as Trans,Orient,Pivot etc
#Transfer the Orient attribute to rotation
def bakeRBD():
tstart = time()
hou_node = hou.pwd()
hou_geo = hou_node.geometry()
points = hou_geo.points()
points_num = len(points)
# print points_num
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)
# create copy piece,set the pivot
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','piece'+str(point.number()))
obj_path = c_node.parm('objpath1')
obj_path.set('/obj/'+rbd_node.name()+'/pack1')
group_piece = c_node.parm('group1')
group_piece.set('@name=piece'+str(point.number()))
pivot_origin = point.attribValue('pivot')
# print pivot_origin
a_node.setParms({'px':pivot_origin[0], 'py':pivot_origin[1], 'pz':pivot_origin[2]})
# print a_node.evalParmTuple('p')
# setKeyframe tx,ty,tz,rx,ry,rz
# for x in range(int(hou.expandString('$FSTART')), int(hou.expandString('$FEND'))+1, 1):
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...'
for point in points:
pos1 = point.position()
# print "(%d) -> x=%f, y=%f, z=%f" % (point.number(), pos1[0], pos1[1], pos1[2])
pos2 = point.attribValue('pivot')
# print "(%d) -> x=%f, y=%f, z=%f" % (point.number(), pos2[0], pos2[1], pos2[2])
pos3 = [0,0,0]
if(x != 1):
pos3[0] = pos1[0]-pos2[0]
pos3[1] = pos1[1]-pos2[1]
pos3[2] = pos1[2]-pos2[2]
# print "(%d) -> x=%f, y=%f, z=%f" % (point.number(), pos3[0], pos3[1], pos3[2])
orient_num = point.attribValue('orient')
# print "(%d) -> x=%f, y=%f, z=%f, n=%f" % (point.number(), orient_num[0], orient_num[1], orient_num[2], orient_num[3])
frags_selet_node = hou.node('/obj/group/due'+str(point.number()))
orient_qua = hou.Quaternion(orient_num).normalized()
# print type(orient_qua)
matrix3 = orient_qua.extractRotationMatrix3()
# print matrix3
rot = matrix3.extractRotates()
# print rot
point_tx = frags_selet_node.parm('tx')
point_keyframe = hou.Keyframe()
point_keyframe.setValue(pos3[0])
point_tx.setKeyframe(point_keyframe)
point_ty = frags_selet_node.parm('ty')
point_keyframe = hou.Keyframe()
point_keyframe.setValue(pos3[1])
point_ty.setKeyframe(point_keyframe)
point_tz = frags_selet_node.parm('tz')
point_keyframe = hou.Keyframe()
point_keyframe.setValue(pos3[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"