From 2068eaf1b7f7729198ad865f69fa3bd11d7a9edc Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sun, 1 Nov 2009 11:29:40 +0000 Subject: Rigging Goodies: Spline IK Constraint At last, this commit introduces the Spline IK Constraint to Blender. Spline IK is a constraint that makes n bones follow the shape of a specified curve. Simply add a chain of bones, add a curve, add a Spline IK Constraint to the tip bone and set the number of bones in the chain to make it work. Or, try the following test file: http://download.blender.org/ftp/incoming/250_splineik_spine01.blend Screenshots of this in action (as proof): http://download.blender.org/ftp/incoming/b250_splineik_001_before.png http://download.blender.org/ftp/incoming/b250_splineik_001_after.png I've implemented this in a similar way to how standard IK solvers are done. However, this code is currently not an IK plugin, since I imagine that it would be useful to be able to combine the 2 types of IK. This can be easily changed though :) Finally, a few notes on what to expect still: * Constraint blending currently doesn't affect this. Getting that to work correctly will take a bit more work still. * Options for not affecting the root joint (to make it easier to attach the chain to a stump or whatever), and non-uniform scaling options have yet to be added. I've marked the places where they can be added though * Control over the twisting of the chain still needs investigation. Have fun! --- source/blender/ikplugin/intern/iksolver_plugin.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'source/blender/ikplugin/intern') diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c index b160e7346bd..6eb1ef56094 100644 --- a/source/blender/ikplugin/intern/iksolver_plugin.c +++ b/source/blender/ikplugin/intern/iksolver_plugin.c @@ -109,7 +109,9 @@ static void initialize_posetree(struct Object *ob, bPoseChannel *pchan_tip) if(tree==NULL) { /* make new tree */ tree= MEM_callocN(sizeof(PoseTree), "posetree"); - + + tree->type= CONSTRAINT_TYPE_KINEMATIC; + tree->iterations= data->iterations; tree->totchannel= segcount; tree->stretch = (data->flag & CONSTRAINT_IK_STRETCH); @@ -503,6 +505,10 @@ void iksolver_execute_tree(struct Scene *scene, struct Object *ob, struct bPose PoseTree *tree= pchan->iktree.first; int a; + /* stop on the first tree that isn't a standard IK chain */ + if (tree->type != CONSTRAINT_TYPE_KINEMATIC) + return; + /* 4. walk over the tree for regular solving */ for(a=0; atotchannel; a++) { if(!(tree->pchan[a]->flag & POSE_DONE)) // successive trees can set the flag -- cgit v1.2.3