Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjy Cook <benjycook@hotmail.com>2011-06-27 16:48:30 +0400
committerBenjy Cook <benjycook@hotmail.com>2011-06-27 16:48:30 +0400
commitff5dbbe1b875d8354cd9d45f6873efcebd78b008 (patch)
tree56b9ef2dc4073e855dffb647464e06047972e1cc
parent46a4f47a5de438a5a76223cf1659e09aaf21a3d3 (diff)
Some bugfixing and tweaking for retargeting. Script works now regardless of world transform on performer and end user rigs. This breaks stride bone functionality, will be addressed in next commit
-rw-r--r--release/scripts/modules/retarget.py36
1 files changed, 28 insertions, 8 deletions
diff --git a/release/scripts/modules/retarget.py b/release/scripts/modules/retarget.py
index 8cbd7129dd3..7688f9657a2 100644
--- a/release/scripts/modules/retarget.py
+++ b/release/scripts/modules/retarget.py
@@ -75,7 +75,8 @@ def createIntermediate(performer_obj, enduser_obj, bonemap, bonemapr, root, s_fr
bpy.ops.object.add()
empty = bpy.context.active_object
empty.name = perf_bone.name + "Org"
- empty.empty_draw_size = 0.01
+ empty.empty_draw_size = 0.1
+ #empty.parent = enduser_obj
empty = bpy.data.objects[perf_bone.name + "Org"]
offset = perf_bone.vector
if inter_bone.length == 0 or perf_bone.length == 0:
@@ -262,18 +263,19 @@ def copyTranslation(performer_obj, enduser_obj, perfFeet, bonemap, bonemapr, roo
#end bone's delta
if endV.length != 0:
linearAvg.append(hipV.length / endV.length)
+
+ bpy.ops.object.add()
+ stride_bone = bpy.context.active_object
+ stride_bone.name = "stride_bone"
+
if linearAvg:
avg = sum(linearAvg) / len(linearAvg)
- print("retargeted root motion should be " + str(1 / avg) + " of original")
-
- bpy.ops.object.add()
- stride_bone = bpy.context.active_object
- stride_bone.name = "stride_bone"
for t in range(s_frame, e_frame):
scene.frame_set(t)
newTranslation = (tailLoc(perf_bones[perfRoot]) / avg)
stride_bone.location = newTranslation
stride_bone.keyframe_insert("location")
+ return stride_bone
def IKRetarget(bonemap, bonemapr, performer_obj, enduser_obj, s_frame, e_frame, scene):
@@ -324,6 +326,22 @@ def turnOffIK(enduser_obj):
ik_constraint = [constraint for constraint in pose_bone.constraints if constraint.type == "IK"][0]
ik_constraint.mute = True
+def cleanAndStoreObjMat(performer_obj,enduser_obj):
+ perf_obj_mat = performer_obj.matrix_world.copy()
+ enduser_obj_mat = enduser_obj.matrix_world.copy()
+ zero_mat = Matrix()#Matrix(((0,0,0,0),(0,0,0,0),(0,0,0,0),(0,0,0,0)))
+ performer_obj.matrix_world = zero_mat
+ enduser_obj.matrix_world = zero_mat
+ return perf_obj_mat, enduser_obj_mat
+
+def restoreObjMat(performer_obj,enduser_obj,perf_obj_mat,enduser_obj_mat):
+ perf_bones = performer_obj.pose.bones
+ for perf_bone in perf_bones:
+ if perf_bone.name + "Org" in bpy.data.objects:
+ empty = bpy.data.objects[perf_bone.name + "Org"]
+ empty.parent = enduser_obj
+ performer_obj.matrix_world = perf_obj_mat
+ enduser_obj.matrix_world = enduser_obj_mat
def totalRetarget():
print("retargeting...")
@@ -339,14 +357,16 @@ def totalRetarget():
s_frame = scene.frame_start
e_frame = scene.frame_end
bonemap, bonemapr, root = createDictionary(perf_arm)
+ perf_obj_mat, enduser_obj_mat = cleanAndStoreObjMat(performer_obj,enduser_obj)
turnOffIK(enduser_obj)
inter_obj, inter_arm = createIntermediate(performer_obj, enduser_obj, bonemap, bonemapr, root, s_frame, e_frame, scene)
retargetEnduser(inter_obj, enduser_obj, root, s_frame, e_frame, scene)
- copyTranslation(performer_obj, enduser_obj, ["RightFoot", "LeftFoot"], bonemap, bonemapr, root, s_frame, e_frame, scene)
+ stride_bone = copyTranslation(performer_obj, enduser_obj, ["RightFoot", "LeftFoot"], bonemap, bonemapr, root, s_frame, e_frame, scene)
IKRetarget(bonemap, bonemapr, performer_obj, enduser_obj, s_frame, e_frame, scene)
+ restoreObjMat(performer_obj,enduser_obj,perf_obj_mat,enduser_obj_mat)
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.select_name(name=inter_obj.name, extend=False)
bpy.ops.object.delete()
if __name__ == "__main__":
- totalRetarget()
+ totalRetarget() \ No newline at end of file