From 7bb353742aae95fe34c8415c03c760fca4e4e43c Mon Sep 17 00:00:00 2001 From: Angus Antley <amantley@googlemail.com> Date: Tue, 12 Feb 2019 07:40:18 -0800 Subject: [PATCH] more tweaks to get the wrist action right --- .../src/AnimPoleVectorConstraint.cpp | 49 ++++++++++++++----- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/libraries/animation/src/AnimPoleVectorConstraint.cpp b/libraries/animation/src/AnimPoleVectorConstraint.cpp index 0fa2ce0ee0..b50f6dc280 100644 --- a/libraries/animation/src/AnimPoleVectorConstraint.cpp +++ b/libraries/animation/src/AnimPoleVectorConstraint.cpp @@ -310,29 +310,54 @@ const AnimPoseVec& AnimPoleVectorConstraint::evaluate(const AnimVariantMap& anim // make the dead zone PI/6.0 - const float POWER = 4.0f; + const float POWER = 2.0f; + const float FLEX_BOUNDARY = PI / 2.0f; + const float EXTEND_BOUNDARY = -PI / 4.0f; /* - if (fabsf(flexTheta) > (PI / 6.0f)) { - fred -= glm::sign(flexTheta) * pow(flexTheta / PI, POWER) * 180.0f; + if (flexTheta > FLEX_BOUNDARY) { + fred -= glm::sign(flexTheta) * pow((flexTheta - FLEX_BOUNDARY) / PI, POWER) * 180.0f; + } else if (flexTheta < EXTEND_BOUNDARY) { + fred -= glm::sign(flexTheta) * pow((flexTheta - EXTEND_BOUNDARY) / PI, POWER) * 180.0f; } - if (fabsf(ulnarDeviationTheta) > (PI / 6.0f)) { + + const float ULNAR_BOUNDARY = PI / 6.0f; + if (fabsf(ulnarDeviationTheta) > ULNAR_BOUNDARY) { if (trueTwistTheta > 0.0f) { - fred -= glm::sign(ulnarDeviationTheta) * pow(ulnarDeviationTheta / PI, POWER) * 180.0f; + fred -= glm::sign(ulnarDeviationTheta) * pow(fabsf(ulnarDeviationTheta) - ULNAR_BOUNDARY / PI, POWER) * 180.0f; } else { - fred += glm::sign(ulnarDeviationTheta) * pow(ulnarDeviationTheta / PI, POWER) * 180.0f; + fred += glm::sign(ulnarDeviationTheta) * pow(fabsf(ulnarDeviationTheta) - ULNAR_BOUNDARY/ PI, POWER) * 180.0f; } } */ // remember direction of travel. const float TWIST_DEADZONE = PI / 2.0f; - if (trueTwistTheta < -TWIST_DEADZONE) { - fred += glm::sign(trueTwistTheta) * pow((trueTwistTheta / PI), POWER) * 180.0f + pow(TWIST_DEADZONE / PI, POWER) * 180.0f; - } else { - if (trueTwistTheta > (PI / 2.0f)) { - fred += glm::sign(trueTwistTheta) * pow((trueTwistTheta / PI), POWER) * 180.0f - pow(TWIST_DEADZONE / PI, POWER) * 180.0f; + if (!isLeft) { + if (trueTwistTheta < -TWIST_DEADZONE) { + fred += glm::sign(trueTwistTheta) * pow((fabsf(trueTwistTheta) - TWIST_DEADZONE) / PI, POWER) * 90.0f; + } else { + if (trueTwistTheta > TWIST_DEADZONE) { + fred += glm::sign(trueTwistTheta) * pow((fabsf(trueTwistTheta) - TWIST_DEADZONE) / PI, POWER) * 90.0f; + } } + } else { + if (trueTwistTheta < -TWIST_DEADZONE) { + fred -= glm::sign(trueTwistTheta) * pow((fabsf(trueTwistTheta) - TWIST_DEADZONE) / PI, POWER) * 90.0f; + } else { + if (trueTwistTheta > TWIST_DEADZONE) { + fred -= glm::sign(trueTwistTheta) * pow((fabsf(trueTwistTheta) - TWIST_DEADZONE) / PI, POWER) * 90.0f; + } + } + + } - + /* + if (fred < 70.0f) { + fred = 70.0f; + } + if (fred > 175.0f) { + fred = 175.0f; + } + */ if (isLeft) { fred *= -1.0f; }