Houdini otl bake fracture animation Python程序

原创 2015年11月19日 19:26:04


*详情见附件: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"

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Houdini低模解算转成高模关键帧动画并拆分碎块UV

bakeFragDetailsUV.otl可以实现将刚体解算的低模运动状态转换成高模的关键帧动画,并将碎块UV进行表面和内部的分离,以便导入maya使用,基于软件版本Houdini FX 15.0.2...

Houdini bake particle instance otl工具介绍

otl工具说明,场景测试文件请参考附件,节点的连接,命名以及参数的设置都需要更程序相一致,否则工具无法运行。 详情见附件: 所得效果是将粒子替代物bake成关键帧动画的物体,一个Instance物体对...

houdini批渲染结束自动关机程序

最近需要一个能在houdini批渲染结束后自动关机的小程序 所以就写了一个,也没用多长时间 使用的openframeworks 0.84 本来是想用PsSetCreateProcessNot...

用Bake创建新应用程序

1. 设置环境变量:  添加 H:/cdnunion/cdnunion/frameworks/cake_1.2.0.5146alpha/cake/console 到PATH中. 2. bake...

Python配置Houdini项目环境变量以及集成工具架

首先电脑上应该安装了Python,以至于所写的Python Script能正确执行。 针对大的Project来说,配置Houdini独立的项目集成工具架以及otl环境变量已成为迫切的事。比如...

houdini破解程序

  • 2014-06-21 10:29
  • 1.06MB
  • 下载

在VC中使用OTL访问Oracle和程序发布

在VC中使用OTL访问Oracle和程序发布          在VC中访问Oracle,可以使用ADO或ODBC,如果你比较强大,也可以直接使用OCI API,但我个人认为OTL是最佳选择,它是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)