[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28368] trunk/blender: Spline IK - Influence Control

Joshua Leung aligorith at gmail.com
Fri Apr 23 07:14:04 CEST 2010


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 */





More information about the Bf-blender-cvs mailing list