forked from bartvdbraak/blender
Mostly finished implementation of animation stitching, with lock bone functionality, allowing the user to choose a bone that maintains its position during the blend
This commit is contained in:
parent
1eaeaf8cd8
commit
fba1f50d0a
@ -760,12 +760,13 @@ def path_editing(context, stride_obj, path):
|
|||||||
|
|
||||||
|
|
||||||
def anim_stitch(context, enduser_obj):
|
def anim_stitch(context, enduser_obj):
|
||||||
selected_bone = enduser_obj.pose.bones["Toes.L"]
|
|
||||||
second_offset = 5
|
|
||||||
|
|
||||||
stitch_settings = enduser_obj.data.stitch_settings
|
stitch_settings = enduser_obj.data.stitch_settings
|
||||||
action_1 = stitch_settings.first_action
|
action_1 = stitch_settings.first_action
|
||||||
action_2 = stitch_settings.second_action
|
action_2 = stitch_settings.second_action
|
||||||
|
if stitch_settings.stick_bone!="":
|
||||||
|
selected_bone = enduser_obj.pose.bones[stitch_settings.stick_bone]
|
||||||
|
else:
|
||||||
|
selected_bone = enduser_obj.pose.bones[0]
|
||||||
scene = context.scene
|
scene = context.scene
|
||||||
TrackNamesA = enduser_obj.data.mocapNLATracks[action_1]
|
TrackNamesA = enduser_obj.data.mocapNLATracks[action_1]
|
||||||
TrackNamesB = enduser_obj.data.mocapNLATracks[action_2]
|
TrackNamesB = enduser_obj.data.mocapNLATracks[action_2]
|
||||||
@ -777,18 +778,21 @@ def anim_stitch(context, enduser_obj):
|
|||||||
mocapTrack.name = TrackNamesB.base_track
|
mocapTrack.name = TrackNamesB.base_track
|
||||||
mocapStrip = mocapTrack.strips.new(TrackNamesB.base_track, stitch_settings.blend_frame, mocapAction)
|
mocapStrip = mocapTrack.strips.new(TrackNamesB.base_track, stitch_settings.blend_frame, mocapAction)
|
||||||
mocapStrip.extrapolation = "HOLD_FORWARD"
|
mocapStrip.extrapolation = "HOLD_FORWARD"
|
||||||
mocapStrip.action_frame_start+=second_offset
|
mocapStrip.blend_in = stitch_settings.blend_amount
|
||||||
mocapStrip.action_frame_end+=second_offset
|
mocapStrip.action_frame_start+=stitch_settings.second_offset
|
||||||
|
mocapStrip.action_frame_end+=stitch_settings.second_offset
|
||||||
constraintTrack = anim_data.nla_tracks.new()
|
constraintTrack = anim_data.nla_tracks.new()
|
||||||
constraintTrack.name = TrackNamesB.auto_fix_track
|
constraintTrack.name = TrackNamesB.auto_fix_track
|
||||||
constraintAction = bpy.data.actions[TrackNamesB.auto_fix_track]
|
constraintAction = bpy.data.actions[TrackNamesB.auto_fix_track]
|
||||||
constraintStrip = constraintTrack.strips.new(TrackNamesB.auto_fix_track, stitch_settings.blend_frame, constraintAction)
|
constraintStrip = constraintTrack.strips.new(TrackNamesB.auto_fix_track, stitch_settings.blend_frame, constraintAction)
|
||||||
constraintStrip.extrapolation = "HOLD_FORWARD"
|
constraintStrip.extrapolation = "HOLD_FORWARD"
|
||||||
|
constraintStrip.blend_in = stitch_settings.blend_amount
|
||||||
userTrack = anim_data.nla_tracks.new()
|
userTrack = anim_data.nla_tracks.new()
|
||||||
userTrack.name = TrackNamesB.manual_fix_track
|
userTrack.name = TrackNamesB.manual_fix_track
|
||||||
userAction = bpy.data.actions[TrackNamesB.manual_fix_track]
|
userAction = bpy.data.actions[TrackNamesB.manual_fix_track]
|
||||||
userStrip = userTrack.strips.new(TrackNamesB.manual_fix_track, stitch_settings.blend_frame, userAction)
|
userStrip = userTrack.strips.new(TrackNamesB.manual_fix_track, stitch_settings.blend_frame, userAction)
|
||||||
userStrip.extrapolation = "HOLD_FORWARD"
|
userStrip.extrapolation = "HOLD_FORWARD"
|
||||||
|
userStrip.blend_in = stitch_settings.blend_amount
|
||||||
#stride bone
|
#stride bone
|
||||||
if enduser_obj.parent:
|
if enduser_obj.parent:
|
||||||
if enduser_obj.parent.name == "stride_bone":
|
if enduser_obj.parent.name == "stride_bone":
|
||||||
@ -805,14 +809,16 @@ def anim_stitch(context, enduser_obj):
|
|||||||
actionBTrack = stride_anim_data.nla_tracks.new()
|
actionBTrack = stride_anim_data.nla_tracks.new()
|
||||||
actionBTrack.name = TrackNamesB.stride_action
|
actionBTrack.name = TrackNamesB.stride_action
|
||||||
actionBStrip = actionBTrack.strips.new(TrackNamesB.stride_action, stitch_settings.blend_frame, bpy.data.actions[TrackNamesB.stride_action])
|
actionBStrip = actionBTrack.strips.new(TrackNamesB.stride_action, stitch_settings.blend_frame, bpy.data.actions[TrackNamesB.stride_action])
|
||||||
|
actionBStrip.action_frame_start+=stitch_settings.second_offset
|
||||||
|
actionBStrip.action_frame_end+=stitch_settings.second_offset
|
||||||
|
actionBStrip.blend_in = stitch_settings.blend_amount
|
||||||
actionBStrip.extrapolation = "NOTHING"
|
actionBStrip.extrapolation = "NOTHING"
|
||||||
#we need to change the stride_bone's action to add the offset
|
#we need to change the stride_bone's action to add the offset
|
||||||
scene.frame_set(stitch_settings.blend_frame - 1)
|
scene.frame_set(stitch_settings.blend_frame - 1)
|
||||||
desired_pos = selected_bone.tail * enduser_obj.matrix_world
|
desired_pos = (selected_bone.matrix.to_translation() * enduser_obj.matrix_world)
|
||||||
scene.frame_set(stitch_settings.blend_frame)
|
scene.frame_set(stitch_settings.blend_frame)
|
||||||
actual_pos = selected_bone.tail * enduser_obj.matrix_world
|
actual_pos = (selected_bone.matrix.to_translation() * enduser_obj.matrix_world)
|
||||||
offset = actual_pos - desired_pos
|
offset = actual_pos - desired_pos
|
||||||
print(offset)
|
|
||||||
|
|
||||||
for i,fcurve in enumerate([fcurve for fcurve in bpy.data.actions[TrackNamesB.stride_action].fcurves if fcurve.data_path=="location"]):
|
for i,fcurve in enumerate([fcurve for fcurve in bpy.data.actions[TrackNamesB.stride_action].fcurves if fcurve.data_path=="location"]):
|
||||||
print(offset[i],i,fcurve.array_index)
|
print(offset[i],i,fcurve.array_index)
|
||||||
|
@ -121,6 +121,12 @@ class AnimationStitchSettings(bpy.types.PropertyGroup):
|
|||||||
blend_amount = bpy.props.IntProperty(name="Blend amount",
|
blend_amount = bpy.props.IntProperty(name="Blend amount",
|
||||||
description="Size of blending transitiion, on both sides of the stitch",
|
description="Size of blending transitiion, on both sides of the stitch",
|
||||||
default=10)
|
default=10)
|
||||||
|
second_offset = bpy.props.IntProperty(name="Second offset",
|
||||||
|
description="Frame offset for 2nd animation, where it should start",
|
||||||
|
default=10)
|
||||||
|
stick_bone = bpy.props.StringProperty(name="Stick Bone",
|
||||||
|
description="Bone to freeze during transition",
|
||||||
|
default="")
|
||||||
|
|
||||||
bpy.utils.register_class(AnimationStitchSettings)
|
bpy.utils.register_class(AnimationStitchSettings)
|
||||||
|
|
||||||
@ -355,6 +361,8 @@ class ExtraToolsPanel(bpy.types.Panel):
|
|||||||
layout.prop_search(settings, "second_action", enduser_arm, "mocapNLATracks")
|
layout.prop_search(settings, "second_action", enduser_arm, "mocapNLATracks")
|
||||||
layout.prop(settings, "blend_frame")
|
layout.prop(settings, "blend_frame")
|
||||||
layout.prop(settings, "blend_amount")
|
layout.prop(settings, "blend_amount")
|
||||||
|
layout.prop(settings, "second_offset")
|
||||||
|
layout.prop_search(settings, "stick_bone", context.active_object.pose, "bones")
|
||||||
layout.operator('mocap.animstitch', text="Stitch Animations")
|
layout.operator('mocap.animstitch', text="Stitch Animations")
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user