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

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/mocap
diff options
context:
space:
mode:
authorBenjy Cook <benjycook@hotmail.com>2011-09-24 00:39:48 +0400
committerBenjy Cook <benjycook@hotmail.com>2011-09-24 00:39:48 +0400
commit77d520861cf175efb3b76a72f2c70fa2e941ecbb (patch)
tree6d83dcc07547df8f27613248f8e2103ce741653f /mocap
parent3c0c519981fe64c320f5f7d721acf0c44bcfa383 (diff)
Updated Mocap addon with fixes for latest api changes and some reported bugs
Diffstat (limited to 'mocap')
-rw-r--r--mocap/__init__.py8
-rw-r--r--mocap/retarget.py23
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)