Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2010-10-22 15:38:10 +0400
committerJoshua Leung <aligorith@gmail.com>2010-10-22 15:38:10 +0400
commitd3ac70909ef88eb3a76ab9f875491bbb62ed2bf0 (patch)
treed117668138c26b6e9f41e58965a26c459af6645c /source/blender/blenkernel/intern/armature.c
parentc821fc85d3a10e4932ea6ec7229c636f271a4c0b (diff)
Bugfix #20708: segmented bones don't work well with spline IK
There was a slight discreptancy between the tail values calculated on the spline before the head was displaced for the "chain offset" option and after this operation. However, only the original version got set. This small difference resulted in B-Bones thinking that the endpoints of the bones were in places that they were not in, hence causing the curly patterns observed in the report.
Diffstat (limited to 'source/blender/blenkernel/intern/armature.c')
-rw-r--r--source/blender/blenkernel/intern/armature.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 0eaef5f250f..029b3c2e141 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -2018,7 +2018,9 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o
/* finally, store the new transform */
copy_m4_m4(pchan->pose_mat, poseMat);
VECCOPY(pchan->pose_head, poseHead);
- VECCOPY(pchan->pose_tail, poseTail);
+
+ /* recalculate tail, as it's now outdated after the head gets adjusted above! */
+ where_is_pose_bone_tail(pchan);
/* done! */
pchan->flag |= POSE_DONE;
@@ -2231,6 +2233,15 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha
}
}
+/* calculate tail of posechannel */
+void where_is_pose_bone_tail(bPoseChannel *pchan)
+{
+ float vec[3];
+
+ VECCOPY(vec, pchan->pose_mat[1]);
+ mul_v3_fl(vec, pchan->bone->length);
+ add_v3_v3v3(pchan->pose_tail, pchan->pose_head, vec);
+}
/* The main armature solver, does all constraints excluding IK */
/* pchan is validated, as having bone and parent pointer
@@ -2364,9 +2375,7 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti
/* calculate head */
VECCOPY(pchan->pose_head, pchan->pose_mat[3]);
/* calculate tail */
- VECCOPY(vec, pchan->pose_mat[1]);
- mul_v3_fl(vec, bone->length);
- add_v3_v3v3(pchan->pose_tail, pchan->pose_head, vec);
+ where_is_pose_bone_tail(pchan);
}
/* This only reads anim data from channels, and writes to channels */