Houdini otl bake fracture animation Python程序



*详情见附件:http://download.csdn.net/detail/baichuanxiaoove/9283755

Usage:

- Install bakeRBD.otl

通过这个工具可以将每个Voronoi Fracture碎块bake成关键帧动画形成每个单独的带动画帧的Geometry物体,可以导出FBX格式文件。

注意Voronoi FracturePack参数设置破碎的碎块必须进行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"

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值