Revision: 37858
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37858
Author:   benjycook
Date:     2011-06-27 12:48:30 +0000 (Mon, 27 Jun 2011)
Log Message:
-----------
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

Modified Paths:
--------------
    branches/soc-2011-pepper/release/scripts/modules/retarget.py

Modified: branches/soc-2011-pepper/release/scripts/modules/retarget.py
===================================================================
--- branches/soc-2011-pepper/release/scripts/modules/retarget.py        
2011-06-27 12:46:53 UTC (rev 37857)
+++ branches/soc-2011-pepper/release/scripts/modules/retarget.py        
2011-06-27 12:48:30 UTC (rev 37858)
@@ -75,7 +75,8 @@
             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 @@
                 #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,7 +326,23 @@
             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...")
     enduser_obj = bpy.context.active_object
@@ -339,14 +357,16 @@
     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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to