[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38435] branches/soc-2011-pepper/release/ scripts: Keyframing Motion capture properties now works for the Point constraint.
Benjy Cook
benjycook at hotmail.com
Sat Jul 16 15:36:47 CEST 2011
Revision: 38435
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38435
Author: benjycook
Date: 2011-07-16 13:36:47 +0000 (Sat, 16 Jul 2011)
Log Message:
-----------
Keyframing Motion capture properties now works for the Point constraint. Also, Floor constraint has been implemented, using Object's raycasting function in Python
Modified Paths:
--------------
branches/soc-2011-pepper/release/scripts/modules/mocap_constraints.py
branches/soc-2011-pepper/release/scripts/startup/ui_mocap.py
Modified: branches/soc-2011-pepper/release/scripts/modules/mocap_constraints.py
===================================================================
--- branches/soc-2011-pepper/release/scripts/modules/mocap_constraints.py 2011-07-16 10:30:51 UTC (rev 38434)
+++ branches/soc-2011-pepper/release/scripts/modules/mocap_constraints.py 2011-07-16 13:36:47 UTC (rev 38435)
@@ -56,7 +56,7 @@
if m_constraint.type == "distance":
c_type = "LIMIT_DISTANCE"
if m_constraint.type == "floor":
- c_type = "FLOOR"
+ c_type = "LIMIT_LOCATION"
#create and store the new constraint within m_constraint
real_constraint = cons_obj.constraints.new(c_type)
real_constraint.name = "Mocap constraint " + str(len(cons_obj.constraints))
@@ -69,7 +69,7 @@
def removeConstraint(m_constraint, cons_obj):
#remove the influence fcurve and Blender constraint
oldConstraint = cons_obj.constraints[m_constraint.real_constraint]
- removeInfluenceFcurve(cons_obj, bpy.context.active_object, oldConstraint)
+ removeFcurves(cons_obj, bpy.context.active_object, oldConstraint, m_constraint)
cons_obj.constraints.remove(oldConstraint)
### Update functions. There are 3: UpdateType/Bone
@@ -112,21 +112,68 @@
real_constraint.keyframe_insert(data_path="influence", frame=e + s_out)
-def removeInfluenceFcurve(cons_obj, obj, real_constraint):
+def removeFcurves(cons_obj, obj, real_constraint, m_constraint):
#Determine if the constrained object is a bone or an empty
if isinstance(cons_obj, bpy.types.PoseBone):
fcurves = obj.animation_data.action.fcurves
else:
fcurves = cons_obj.animation_data.action.fcurves
#Find the RNA data path of the constraint's influence
- influence_RNA = real_constraint.path_from_id("influence")
+ RNA_paths = []
+ RNA_paths.append(real_constraint.path_from_id("influence"))
+ if m_constraint.type == "floor" or m_constraint.type == "point":
+ RNA_paths += [real_constraint.path_from_id("max_x"), real_constraint.path_from_id("min_x")]
+ RNA_paths += [real_constraint.path_from_id("max_y"), real_constraint.path_from_id("min_y")]
+ RNA_paths += [real_constraint.path_from_id("max_z"), real_constraint.path_from_id("min_z")]
#Retrieve the correct fcurve via the RNA data path and remove it
- fcurve = [fcurve for fcurve in fcurves if fcurve.data_path == influence_RNA]
+ fcurves_del = [fcurve for fcurve in fcurves if fcurve.data_path in RNA_paths]
#clear the fcurve and set the frames.
- if fcurve:
- fcurves.remove(fcurve[0])
+ if fcurves_del:
+ for fcurve in fcurves_del:
+ fcurves.remove(fcurve)
+ #remove armature fcurves (if user keyframed m_constraint properties)
+ if obj.data.animation_data and m_constraint.type == "point":
+ if obj.data.animation_data.action:
+ path = m_constraint.path_from_id("targetPoint")
+ m_fcurves = [fcurve for fcurve in obj.data.animation_data.action.fcurves if fcurve.data_path == path]
+ for curve in m_fcurves:
+ obj.data.animation_data.action.fcurves.remove(curve)
+#Utility function for copying property fcurves over
+
+def copyFCurve(newCurve, oldCurve):
+ for point in oldCurve.keyframe_points:
+ newCurve.keyframe_points.insert(frame=point.co.x, value=point.co.y)
+
+#Creates new fcurves for the constraint properties (for floor and point)
+
+
+def createConstraintFCurves(cons_obj, obj, real_constraint):
+ if isinstance(cons_obj, bpy.types.PoseBone):
+ c_fcurves = obj.animation_data.action.fcurves
+ else:
+ c_fcurves = cons_obj.animation_data.action.fcurves
+ c_x_path = [real_constraint.path_from_id("max_x"), real_constraint.path_from_id("min_x")]
+ c_y_path = [real_constraint.path_from_id("max_y"), real_constraint.path_from_id("min_y")]
+ c_z_path = [real_constraint.path_from_id("max_z"), real_constraint.path_from_id("min_z")]
+ c_constraints_path = c_x_path + c_y_path + c_z_path
+ existing_curves = [fcurve for fcurve in c_fcurves if fcurve.data_path in c_constraints_path]
+ if existing_curves:
+ for curve in existing_curves:
+ c_fcurves.remove(curve)
+ xCurves, yCurves, zCurves = [], [], []
+ for path in c_constraints_path:
+ newCurve = c_fcurves.new(path)
+ if path in c_x_path:
+ xCurves.append(newCurve)
+ elif path in c_y_path:
+ yCurves.append(newCurve)
+ else:
+ zCurves.append(newCurve)
+ return xCurves, yCurves, zCurves
+
+
# Function that copies all settings from m_constraint to the real Blender constraints
# Is only called when blender constraint already exists
@@ -145,20 +192,35 @@
#Set the blender constraint parameters
if m_constraint.type == "point":
+ constraint_settings = False
real_constraint.owner_space = m_constraint.targetSpace
- x, y, z = m_constraint.targetPoint
- real_constraint.max_x = x
- real_constraint.max_y = y
- real_constraint.max_z = z
- real_constraint.min_x = x
- real_constraint.min_y = y
- real_constraint.min_z = z
- real_constraint.use_max_x = True
- real_constraint.use_max_y = True
- real_constraint.use_max_z = True
- real_constraint.use_min_x = True
- real_constraint.use_min_y = True
- real_constraint.use_min_z = True
+ if obj.data.animation_data:
+ if obj.data.animation_data.action:
+ path = m_constraint.path_from_id("targetPoint")
+ m_fcurves = [fcurve for fcurve in obj.data.animation_data.action.fcurves if fcurve.data_path == path]
+ if m_fcurves:
+ constraint_settings = True
+ xCurves, yCurves, zCurves = createConstraintFCurves(cons_obj, obj, real_constraint)
+ for curve in xCurves:
+ copyFCurve(curve, m_fcurves[0])
+ for curve in yCurves:
+ copyFCurve(curve, m_fcurves[1])
+ for curve in zCurves:
+ copyFCurve(curve, m_fcurves[2])
+ if not constraint_settings:
+ x, y, z = m_constraint.targetPoint
+ real_constraint.max_x = x
+ real_constraint.max_y = y
+ real_constraint.max_z = z
+ real_constraint.min_x = x
+ real_constraint.min_y = y
+ real_constraint.min_z = z
+ real_constraint.use_max_x = True
+ real_constraint.use_max_y = True
+ real_constraint.use_max_z = True
+ real_constraint.use_min_x = True
+ real_constraint.use_min_y = True
+ real_constraint.use_min_z = True
if m_constraint.type == "freeze":
real_constraint.owner_space = m_constraint.targetSpace
@@ -187,6 +249,50 @@
real_constraint.limit_mode = "LIMITDIST_ONSURFACE"
real_constraint.distance = m_constraint.targetDist
+ if m_constraint.type == "floor" and m_constraint.targetMesh:
+ real_constraint.mute = True
+ real_constraint.owner_space = "WORLD"
+ #calculate the positions thoughout the range
+ s, e = m_constraint.s_frame, m_constraint.e_frame
+ s_in, s_out = m_constraint.smooth_in, m_constraint.smooth_out
+ s -= s_in
+ e += s_out
+ bakedPos = {}
+ floor = bpy.data.objects[m_constraint.targetMesh]
+ c_frame = context.scene.frame_current
+ for t in range(s, e):
+ context.scene.frame_set(t)
+ axis = Vector((0, 0, 100)) * obj.matrix_world.to_3x3()
+ offset = Vector((0, 0, m_constraint.targetDist)) * obj.matrix_world.to_3x3()
+ ray_origin = cons_obj.matrix_world.to_translation() - offset # world position of constrained bone
+ ray_target = ray_origin + axis
+ #convert ray points to floor's object space
+ ray_origin *= floor.matrix_world.inverted()
+ ray_target *= floor.matrix_world.inverted()
+ hit, nor, ind = floor.ray_cast(ray_origin, ray_target)
+ if hit != Vector((0, 0, 0)):
+ bakedPos[t] = (hit * floor.matrix_world)
+ bakedPos[t] += Vector((0, 0, m_constraint.targetDist))
+ else:
+ bakedPos[t] = cons_obj.matrix_world.to_translation()
+ context.scene.frame_set(c_frame)
+ #create keyframes for real constraint
+ xCurves, yCurves, zCurves = createConstraintFCurves(cons_obj, obj, real_constraint)
+ for frame in bakedPos.keys():
+ pos = bakedPos[frame]
+ for xCurve in xCurves:
+ xCurve.keyframe_points.insert(frame=frame, value=pos.x)
+ for yCurve in yCurves:
+ yCurve.keyframe_points.insert(frame=frame, value=pos.y)
+ for zCurve in zCurves:
+ zCurve.keyframe_points.insert(frame=frame, value=pos.z)
+ real_constraint.use_max_x = True
+ real_constraint.use_max_y = True
+ real_constraint.use_max_z = True
+ real_constraint.use_min_x = True
+ real_constraint.use_min_y = True
+ real_constraint.use_min_z = True
+
# active/baked check
real_constraint.mute = (not m_constraint.active)
Modified: branches/soc-2011-pepper/release/scripts/startup/ui_mocap.py
===================================================================
--- branches/soc-2011-pepper/release/scripts/startup/ui_mocap.py 2011-07-16 10:30:51 UTC (rev 38434)
+++ branches/soc-2011-pepper/release/scripts/startup/ui_mocap.py 2011-07-16 13:36:47 UTC (rev 38435)
@@ -81,9 +81,9 @@
subtype="XYZ", default=(0.0, 0.0, 0.0),
description="Target of Constraint - Point",
update=setConstraint)
- targetDist = bpy.props.FloatProperty(name="Dist",
- default=1,
- description="Distance Constraint - Desired distance",
+ targetDist = bpy.props.FloatProperty(name="Offset",
+ default=0.0,
+ description="Distance and Floor Constraints - Desired offset",
update=setConstraint)
targetSpace = bpy.props.EnumProperty(
items=[("WORLD", "World Space", "Evaluate target in global space"),
@@ -277,7 +277,7 @@
box.prop(m_constraint, 'targetSpace')
if m_constraint.type == "point":
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list