Early commit of mocap constraint work. Still very much a WIP, but Point constraints should work - but buggy.

This commit is contained in:
2011-07-02 18:24:05 +00:00
parent 87030e6a32
commit 8c3f2923fd
3 changed files with 227 additions and 68 deletions

View File

@@ -71,13 +71,13 @@ def createIntermediate(performer_obj, enduser_obj, bonemap, bonemapr, root, s_fr
#useful for storing the important data in the original motion
#i.e. using this empty to IK the chain to that pos / DEBUG
def locOfOriginal(inter_bone, perf_bone):
if not perf_bone.name + "Org" in bpy.data.objects:
if not inter_bone.name + "Org" in bpy.data.objects:
bpy.ops.object.add()
empty = bpy.context.active_object
empty.name = perf_bone.name + "Org"
empty.name = inter_bone.name + "Org"
empty.empty_draw_size = 0.1
#empty.parent = enduser_obj
empty = bpy.data.objects[perf_bone.name + "Org"]
empty = bpy.data.objects[inter_bone.name + "Org"]
offset = perf_bone.vector
if inter_bone.length == 0 or perf_bone.length == 0:
scaling = 1
@@ -263,17 +263,17 @@ 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)
for t in range(s_frame, e_frame):
scene.frame_set(t)
newTranslation = (tailLoc(perf_bones[perfRoot]) / avg)
stride_bone.location = newTranslation
stride_bone.location = newTranslation * enduser_obj.matrix_world
stride_bone.keyframe_insert("location")
return stride_bone
@@ -287,7 +287,7 @@ def IKRetarget(bonemap, bonemapr, performer_obj, enduser_obj, s_frame, e_frame,
perf_bone = bonemapr[pose_bone.name]
if isinstance(perf_bone, list):
perf_bone = bonemapr[pose_bone.name][-1]
end_empty = bpy.data.objects[perf_bone + "Org"]
end_empty = bpy.data.objects[pose_bone.name + "Org"]
ik_constraint = [constraint for constraint in pose_bone.constraints if constraint.type == "IK"][0]
if not ik_constraint.target:
ik_constraint.target = end_empty
@@ -326,23 +326,26 @@ 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):
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)))
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"]
def restoreObjMat(performer_obj, enduser_obj, perf_obj_mat, enduser_obj_mat, stride_bone):
pose_bones = enduser_obj.pose.bones
for pose_bone in pose_bones:
if pose_bone.name + "Org" in bpy.data.objects:
empty = bpy.data.objects[pose_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
@@ -357,16 +360,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)
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)
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)
restoreObjMat(performer_obj, enduser_obj, perf_obj_mat, enduser_obj_mat, stride_bone)
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()