From 7c4aed7fa608ea38eb9e885e25cf80f72ca07703 Mon Sep 17 00:00:00 2001 From: Benjy Cook Date: Mon, 18 Jul 2011 19:33:11 +0000 Subject: [PATCH] Even more bugfixes for retarget, for various types of special cases. --- release/scripts/modules/retarget.py | 38 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/release/scripts/modules/retarget.py b/release/scripts/modules/retarget.py index e8c9f3e25aa..0602de5e596 100644 --- a/release/scripts/modules/retarget.py +++ b/release/scripts/modules/retarget.py @@ -105,15 +105,7 @@ def createIntermediate(performer_obj, enduser_obj, root, s_frame, e_frame, scene else: perf_bone = performer_bones[perf_bone_name[0].name] inter_bone.matrix_basis = singleBoneRetarget(inter_bone, perf_bone) - elif inter_bone.parent: - if "Temp" in inter_bone.parent.name: - inter_bone.parent.bone.use_inherit_rotation = True - inter_bone.bone.use_inherit_rotation = True - else: - inter_bone.bone.use_inherit_rotation = True inter_bone.keyframe_insert("rotation_quaternion") - for child in inter_bone.children: - retargetPerfToInter(child) #creates the intermediate armature object inter_obj = enduser_obj.copy() @@ -123,16 +115,19 @@ def createIntermediate(performer_obj, enduser_obj, root, s_frame, e_frame, scene bpy.context.scene.objects.active = inter_obj bpy.ops.object.mode_set(mode='EDIT') #add some temporary connecting bones in case end user bones are not connected to their parents + print("creating temp bones") for bone in inter_obj.data.edit_bones: - if not bone.use_connect and bone.parent and inter_obj.data.bones[bone.name].reverseMap: - newBone = inter_obj.data.edit_bones.new("Temp") - newBone.head = bone.parent.tail - newBone.tail = bone.head - newBone.parent = bone.parent - bone.parent = newBone - bone.use_connect = True - newBone.use_connect = True + if not bone.use_connect and bone.parent: + if inter_obj.data.bones[bone.parent.name].reverseMap or inter_obj.data.bones[bone.name].reverseMap: + newBone = inter_obj.data.edit_bones.new("Temp") + newBone.head = bone.parent.tail + newBone.tail = bone.head + newBone.parent = bone.parent + bone.parent = newBone + bone.use_connect = True + newBone.use_connect = True #resets roll + print("retargeting to intermediate") bpy.ops.armature.calculate_roll(type='Z') bpy.ops.object.mode_set(mode="OBJECT") inter_obj.data.name = "inter_arm" @@ -141,12 +136,15 @@ def createIntermediate(performer_obj, enduser_obj, root, s_frame, e_frame, scene inter_bones = inter_obj.pose.bones #clears inheritance for inter_bone in inter_bones: - inter_bone.bone.use_inherit_rotation = False + if inter_bone.bone.reverseMap: + inter_bone.bone.use_inherit_rotation = False + else: + inter_bone.bone.use_inherit_rotation = True for t in range(s_frame, e_frame): scene.frame_set(t) - inter_bone = inter_bones[root] - retargetPerfToInter(inter_bone) + for bone in inter_bones: + retargetPerfToInter(bone) return inter_obj @@ -217,7 +215,7 @@ def copyTranslation(performer_obj, enduser_obj, perfFeet, root, s_frame, e_frame perf_bones = performer_obj.pose.bones end_bones = enduser_obj.pose.bones - perfRoot = end_bones[root].bone.reverseMap[0].name + perfRoot = perf_bones[0].name endFeet = [perf_bones[perfBone].bone.map for perfBone in perfFeet] locDictKeys = perfFeet + endFeet + [perfRoot]