bakeFragDetailsUV.otl可以實現將剛體解算的低模運動狀態轉換成高模的關鍵幀動畫,並將碎塊UV進行表面和內部的分離,以便導入maya使用,基於軟件版本HoudiniFX15.0.244.16。
節點連接,註意節點的參數設置,相同節點設置可能有所不同:
低模進行剛體解算,高模匹配動畫關鍵幀,包括位移和旋轉。
對碎塊進行UV拆分,將outside與inside的UV進行分開。
按圖壹連接節點並設置好參數之後,選擇bakeFragDetailsUV1節點,設置好需要bake的起始幀和結束幀之後,點擊BakeFragDetailsUV按鈕,在/obj路徑生成group,即為帶動畫帶UV的高模。
PythonModule代碼:
fromtimeimport*
#BakeRBDssimulationtogroupsubnetwork
#PackedRBDssimulationandgetattributesasTrans,Orient,Pivotetc
#TransfertheOrientattributetorotation
defbakeFragDetailsUV():
tstart=time()
hou_node=hou.pwd()
hou_geo=hou_node.geometry()
points=hou_geo.points()
points_num=len(points)
#printpoints_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)
#createcopypiece,setthepivot
forpointinpoints:
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()+'/pack2')
group_piece=c_node.parm('group1')
group_piece.set('@name=piece'+str(point.number()))
unpack_node=a_node.createNode('unpack','unpack'+str(point.number()))
unpack_node.setPosition(c_node.position())
unpack_node.move([0,-1])
unpack_node.setNextInput(c_node)
unpack_node.setDisplayFlag(True)
unpack_node.setRenderFlag(True)
pivot_origin=point.attribValue('pivot')
#printpivot_origin
a_node.setParms({'px':pivot_origin[0],'py':pivot_origin[1],'pz':pivot_origin[2]})
#printa_node.evalParmTuple('p')
#setKeyframetx,ty,tz,rx,ry,rz
#forxinrange(int(hou.expandString('$FSTART')),int(hou.expandString('$FEND'))+1,1):
forxinrange(int(hou_node.evalParm('f1')),int(hou_node.evalParm('f2'))+1,1):
hou.setFrame(x)
printstr(x)+'frame'+',pleasewait...'
forpointinpoints:
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()
#printtype(orient_qua)
matrix3=orient_qua.extractRotationMatrix3()
#printmatrix3
rot=matrix3.extractRotates()
#printrot
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'timeuse'+str(int(t))+s