diff options
author | Benjy Cook <benjycook@hotmail.com> | 2011-09-24 00:39:48 +0400 |
---|---|---|
committer | Benjy Cook <benjycook@hotmail.com> | 2011-09-24 00:39:48 +0400 |
commit | 77d520861cf175efb3b76a72f2c70fa2e941ecbb (patch) | |
tree | 6d83dcc07547df8f27613248f8e2103ce741653f /mocap | |
parent | 3c0c519981fe64c320f5f7d721acf0c44bcfa383 (diff) |
Updated Mocap addon with fixes for latest api changes and some reported bugs
Diffstat (limited to 'mocap')
-rw-r--r-- | mocap/__init__.py | 8 | ||||
-rw-r--r-- | mocap/retarget.py | 23 |
2 files changed, 20 insertions, 11 deletions
diff --git a/mocap/__init__.py b/mocap/__init__.py index 55d8bdb7..d26937be 100644 --- a/mocap/__init__.py +++ b/mocap/__init__.py @@ -53,11 +53,19 @@ else: from . import mocap_constraints from . import retarget from . import mocap_tools + # MocapConstraint class # Defines MocapConstraint datatype, used to add and configute mocap constraints # Attached to Armature data +def hasIKConstraint(pose_bone): + #utility function / predicate, returns True if given bone has IK constraint + ik = [constraint for constraint in pose_bone.constraints if constraint.type == "IK"] + if ik: + return ik[0] + else: + return False class MocapConstraint(bpy.types.PropertyGroup): name = StringProperty(name="Name", diff --git a/mocap/retarget.py b/mocap/retarget.py index f5991200..e7f4bc11 100644 --- a/mocap/retarget.py +++ b/mocap/retarget.py @@ -21,7 +21,7 @@ import bpy from mathutils import Vector, Matrix from math import radians -from bl_operators import nla +from bpy_extras.anim_utils import bake_action def hasIKConstraint(pose_bone): @@ -292,15 +292,15 @@ def copyTranslation(performer_obj, enduser_obj, perfFeet, root, s_frame, e_frame if linearAvg: #determine the average change in scale needed avg = sum(linearAvg) / len(linearAvg) - scene.frame_set(s_frame) - initialPos = (tailLoc(perf_bones[perfRoot]) / avg) - for t in range(s_frame, e_frame): - scene.frame_set(t) - #calculate the new position, by dividing by the found ratio between performer and enduser - newTranslation = (tailLoc(perf_bones[perfRoot]) / avg) - stride_bone.location = enduser_obj_mat * (newTranslation - initialPos) - stride_bone.keyframe_insert("location") else: + avg = 1 + scene.frame_set(s_frame) + initialPos = (tailLoc(perf_bones[perfRoot]) / avg) + for t in range(s_frame, e_frame): + scene.frame_set(t) + #calculate the new position, by dividing by the found ratio between performer and enduser + newTranslation = (tailLoc(perf_bones[perfRoot]) / avg) + stride_bone.location = enduser_obj_mat * (newTranslation - initialPos) stride_bone.keyframe_insert("location") stride_bone.animation_data.action.name = ("Stride Bone " + action_name) @@ -520,8 +520,9 @@ def totalRetarget(performer_obj, enduser_obj, scene, s_frame, e_frame): else: prepareForBake(enduser_obj) print("Retargeting pose (Advanced Retarget)") - nla.bake(s_frame, e_frame, action=enduser_obj.animation_data.action, only_selected=True, do_pose=True, do_object=False, step=step) - name = performer_obj.animation_data.action.name + bake_action(s_frame, e_frame, action=enduser_obj.animation_data.action, only_selected=True, do_pose=True, do_object=False, step=step) + name = performer_obj.animation_data.action.name[:10] + #We trim the name down to 10 chars because of Action Name length maximum enduser_obj.animation_data.action.name = "Base " + name print("Second pass: retargeting root translation and clean up") stride_bone = copyTranslation(performer_obj, enduser_obj, feetBones, root, s_frame, e_frame, scene, enduser_obj_mat) |