From f99b579c14ed38ac0a4dff551c42b2bd2925e3b3 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Thu, 1 Jun 2017 13:38:18 -0700 Subject: [PATCH] added some docs --- libraries/animation/src/AnimInverseKinematics.cpp | 11 +++++++---- libraries/animation/src/AnimInverseKinematics.h | 7 ++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index 5c0127334b..524d08de5b 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -1445,10 +1445,11 @@ void AnimInverseKinematics::initRelativePosesFromSolutionSource(SolutionSource s } } +// pre-compute information about each joint influeced by this spline IK target. void AnimInverseKinematics::computeSplineJointInfosForIKTarget(const AnimContext& context, const IKTarget& target) { std::vector splineJointInfoVec; - // build default spline + // build spline between the default poses. AnimPose tipPose = _skeleton->getAbsoluteDefaultPose(target.getIndex()); AnimPose basePose = _skeleton->getAbsoluteDefaultPose(_hipsIndex); @@ -1461,9 +1462,11 @@ void AnimInverseKinematics::computeSplineJointInfosForIKTarget(const AnimContext } else { spline = computeSplineFromTipAndBase(tipPose, basePose); } + + // measure the total arc length along the spline float totalArcLength = spline.arcLength(1.0f); - // AJT: FIXME: TODO: this won't work for horizontal splines... + // FIXME: TODO: this won't work for horizontal splines... float baseToTipHeight = tipPose.trans().y - basePose.trans().y; int index = target.getIndex(); @@ -1471,10 +1474,10 @@ void AnimInverseKinematics::computeSplineJointInfosForIKTarget(const AnimContext while (index != endIndex) { AnimPose defaultPose = _skeleton->getAbsoluteDefaultPose(index); - // AJT: FIXME: TODO: this wont work for horizontal splines... + // FIXME: TODO: this wont work for horizontal splines... float ratio = (defaultPose.trans().y - basePose.trans().y) / baseToTipHeight; - // compute offset from default spline pose to default pose. + // compute offset from spline to the default pose. float t = spline.arcLengthInverse(ratio * totalArcLength); AnimPose pose(glm::vec3(1.0f), glm::normalize(glm::lerp(basePose.rot(), tipPose.rot(), t)), spline(t)); AnimPose offsetPose = pose.inverse() * defaultPose; diff --git a/libraries/animation/src/AnimInverseKinematics.h b/libraries/animation/src/AnimInverseKinematics.h index 459b37d0b6..ff1ab9115f 100644 --- a/libraries/animation/src/AnimInverseKinematics.h +++ b/libraries/animation/src/AnimInverseKinematics.h @@ -117,10 +117,11 @@ protected: AnimPoseVec _relativePoses; // current relative poses AnimPoseVec _limitCenterPoses; // relative + // used to pre-compute information about each joint influeced by a spline IK target. struct SplineJointInfo { - int jointIndex; - float ratio; - AnimPose offsetPose; + int jointIndex; // joint in the skeleton that this information pertains to. + float ratio; // percentage (0..1) along the spline for this joint. + AnimPose offsetPose; // local offset from the spline to the joint. }; std::map> _splineJointInfoMap;