Revision: 28368
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28368
Author: aligorith
Date: 2010-04-23 07:14:00 +0200 (Fri, 23 Apr 2010)
Log Message:
-----------
Spline IK - Influence Control
Made the 'Influence' slider work for Spline IK too, and made that setting
visible now that it works.
Note that there is still some popping that can occur when going to/from
influence = 0.0. I'm not sure exactly what's causing this yet, but hopefully it
won't be too noticeable in practice.
Modified Paths:
--------------
trunk/blender/release/scripts/ui/properties_object_constraint.py
trunk/blender/source/blender/blenkernel/intern/armature.c
Modified: trunk/blender/release/scripts/ui/properties_object_constraint.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_object_constraint.py
2010-04-23 04:16:08 UTC (rev 28367)
+++ trunk/blender/release/scripts/ui/properties_object_constraint.py
2010-04-23 05:14:00 UTC (rev 28368)
@@ -37,7 +37,7 @@
# match enum type to our functions, avoids a lookup table.
getattr(self, con.type)(context, box, con, wide_ui)
- if con.type not in ('RIGID_BODY_JOINT', 'SPLINE_IK', 'NULL'):
+ if con.type not in ('RIGID_BODY_JOINT', 'NULL'):
box.prop(con, "influence")
def space_template(self, layout, con, wide_ui, target=True, owner=True):
Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c 2010-04-23
04:16:08 UTC (rev 28367)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c 2010-04-23
05:14:00 UTC (rev 28368)
@@ -2006,6 +2006,11 @@
rangle= dot_v3v3(rmat[1], splineVec);
rangle= acos( MAX2(-1.0f, MIN2(1.0f, rangle)) );
+ /* multiply the magnitude of the angle by the influence of the
constraint to
+ * control the influence of the SplineIK effect
+ */
+ rangle *= tree->con->enforce;
+
/* construct rotation matrix from the axis-angle rotation found
above
* - this call takes care to make sure that the axis
provided is a unit vector first
*/
@@ -2073,13 +2078,26 @@
}
}
- /* step 5: set the location of the bone in the matrix
- * - when the 'no-root' option is affected, the chain can retain
- * the shape but be moved elsewhere
- */
+ /* step 5: set the location of the bone in the matrix */
if (ikData->flag & CONSTRAINT_SPLINEIK_NO_ROOT) {
+ /* when the 'no-root' option is affected, the chain can retain
+ * the shape but be moved elsewhere
+ */
VECCOPY(poseHead, pchan->pose_head);
}
+ else if (tree->con->enforce < 1.0f) {
+ /* when the influence is too low
+ * - blend the positions for the 'root' bone
+ * - stick to the parent for any other
+ */
+ if (pchan->parent) {
+ VECCOPY(poseHead, pchan->pose_head);
+ }
+ else {
+ // FIXME: this introduces popping artifacts when we
reach 0.0
+ interp_v3_v3v3(poseHead, pchan->pose_head, poseHead,
tree->con->enforce);
+ }
+ }
VECCOPY(poseMat[3], poseHead);
/* finally, store the new transform */
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs