繁体   English   中英

使用 python 脚本在搅拌机的关键帧处将对象链接到父对象

[英]Link object to parent at keyframe in blender using python script

我想在第 40 帧将一个对象链接到它的父对象,并在第 80 帧取消链接。我觉得它应该是这样的:

o.parent = p
o.keyframe_insert(data_path="???", index=-1, frame=40)
o.parent = None
o.keyframe_insert(data_path="???", index=-1, frame=80)

谢谢!

在谷歌搜索和试验之后,我想出了一个关于如何设置和取消设置(也就是影响)子约束的小例子。

import bpy

def add_frame(oArgObject, sArgType, dArgFrame, sArgName):
    if sArgType == 'location':
        oArgObject.keyframe_insert(data_path='location', index=-1, frame=dArgFrame)
    elif sArgType == 'influence':
        oArgObject.keyframe_insert(data_path='constraints["'+sArgName+'"].influence', frame=dArgFrame)
    else:
        print('Unrecognized frame option: ' + sArgType)


def add_parent(oArgChild, oArgParent, bArgScale):
    sName = 'Child' + oArgChild.name + 'Parent' + oArgParent.name
    if sName in oArgChild.constraints:
        print('Constraint ' + sName + ' exists')
    else:
        oConst = oArgChild.constraints.new(type = 'CHILD_OF')
        oConst.name = sName
        oConst.target = oArgParent
        oConst.use_scale_x = bArgScale[0]
        oConst.use_scale_y = bArgScale[1]
        oConst.use_scale_z = bArgScale[2]
        print('Constraint ' + sName + ' added')


def set_influence(oArgChild, oArgParent, dArgFrame, dArgInfluence): 
    sName = 'Child' + oArgChild.name + 'Parent' + oArgParent.name
    if sName in oArgChild.constraints:
        index = 0
        while oArgChild.constraints[index].name != sName:
            index += 1
        o = oArgChild.constraints[index]
        o.influence = 1 - dArgInfluence
        add_frame(oArgChild, 'influence', dArgFrame-1, sName)
        o.influence = dArgInfluence
        add_frame(oArgChild, 'influence', dArgFrame, sName)
    else:
        print('No constraints exists for object ' + oArgChild.name)


bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()

bpy.ops.mesh.primitive_cube_add(size = 1, location = (1,0,0))
oParent1 = bpy.context.object
oParent1.scale = (0.5, 1.0, 0.5)
oParent1.name = 'Parent1'
add_frame(oParent1, 'location', 10, 'n/a')
oParent1.location.x += 4
add_frame(oParent1, 'location', 50, 'n/a')

bpy.ops.mesh.primitive_cube_add(size = 1, location = (0,1,0))
oParent2 = bpy.context.object
oParent2.scale = (1.0, 0.5, 0.5)
oParent2.name = 'Parent2'
add_frame(oParent2, 'location', 60, 'n/a')
oParent2.location.y += 4
add_frame(oParent2, 'location', 100, 'n/a')

bpy.ops.mesh.primitive_cube_add(size = 1, location = (0,0,1))
oChild = bpy.context.object
oChild.scale = (0.5, 0.5, 1.0)
oChild.name = 'Child'
add_frame(oChild, 'location', 5, 'n/a')

add_parent(oChild, oParent1, (True,True,True))
add_parent(oChild, oParent2, (False,False,False))

set_influence(oChild, oParent1, 20, 1)
set_influence(oChild, oParent1, 40, 0)
set_influence(oChild, oParent2, 70, 1)
set_influence(oChild, oParent2, 90, 0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM