From 551426f46e1d645049e344dbb1c5309fc0800771 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Thu, 1 Jun 2017 13:56:06 -0700 Subject: [PATCH] Made computeSplineJointInfosForIKTarget more general It should now work for non-vertical oriented splines. --- libraries/animation/src/AnimInverseKinematics.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index 524d08de5b..12d480a578 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -1466,16 +1466,16 @@ void AnimInverseKinematics::computeSplineJointInfosForIKTarget(const AnimContext // measure the total arc length along the spline float totalArcLength = spline.arcLength(1.0f); - // FIXME: TODO: this won't work for horizontal splines... - float baseToTipHeight = tipPose.trans().y - basePose.trans().y; + glm::vec3 baseToTip = tipPose.trans() - basePose.trans(); + float baseToTipLength = glm::length(baseToTip); + glm::vec3 baseToTipNormal = baseToTip / baseToTipLength; int index = target.getIndex(); int endIndex = _skeleton->getParentIndex(_hipsIndex); while (index != endIndex) { AnimPose defaultPose = _skeleton->getAbsoluteDefaultPose(index); - // FIXME: TODO: this wont work for horizontal splines... - float ratio = (defaultPose.trans().y - basePose.trans().y) / baseToTipHeight; + float ratio = glm::dot(defaultPose.trans() - basePose.trans(), baseToTipNormal) / baseToTipLength; // compute offset from spline to the default pose. float t = spline.arcLengthInverse(ratio * totalArcLength);