From b3b053ce18a8ed0ef31079045a36ab2a9d21ff51 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 10 Feb 2016 09:52:29 -0800 Subject: [PATCH 1/3] if delta-time is more than 1/30th of a second, clamp it to avoid crazy ik induced orbits when main thread is blocked --- libraries/animation/src/AnimInverseKinematics.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index 92d8240510..354b637fa2 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -18,6 +18,8 @@ #include "SwingTwistConstraint.h" #include "AnimationLogging.h" +float MAX_OVERLAY_DT = 1.0f / 30.0f; // what to clamp delta-time to in AnimInverseKinematics::overlay + AnimInverseKinematics::AnimInverseKinematics(const QString& id) : AnimNode(AnimNode::Type::InverseKinematics, id) { } @@ -367,6 +369,10 @@ const AnimPoseVec& AnimInverseKinematics::evaluate(const AnimVariantMap& animVar //virtual const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) { + if (dt > MAX_OVERLAY_DT) { + dt = MAX_OVERLAY_DT; + } + if (_relativePoses.size() != underPoses.size()) { loadPoses(underPoses); } else { From 6fea0b9396762256dca07b69de02b6f22ea74a2b Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 10 Feb 2016 11:20:56 -0800 Subject: [PATCH 2/3] also make sure tau is >= 1.0 --- libraries/animation/src/AnimInverseKinematics.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index 354b637fa2..79bf5d9a19 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -18,8 +18,6 @@ #include "SwingTwistConstraint.h" #include "AnimationLogging.h" -float MAX_OVERLAY_DT = 1.0f / 30.0f; // what to clamp delta-time to in AnimInverseKinematics::overlay - AnimInverseKinematics::AnimInverseKinematics(const QString& id) : AnimNode(AnimNode::Type::InverseKinematics, id) { } @@ -369,6 +367,7 @@ const AnimPoseVec& AnimInverseKinematics::evaluate(const AnimVariantMap& animVar //virtual const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) { + const float MAX_OVERLAY_DT = 1.0f / 30.0f; // what to clamp delta-time to in AnimInverseKinematics::overlay if (dt > MAX_OVERLAY_DT) { dt = MAX_OVERLAY_DT; } @@ -469,7 +468,8 @@ const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars // smooth transitions by relaxing _hipsOffset toward the new value const float HIPS_OFFSET_SLAVE_TIMESCALE = 0.15f; - _hipsOffset += (newHipsOffset - _hipsOffset) * (dt / HIPS_OFFSET_SLAVE_TIMESCALE); + float tau = dt > HIPS_OFFSET_SLAVE_TIMESCALE ? 1.0 : dt / HIPS_OFFSET_SLAVE_TIMESCALE; + _hipsOffset += (newHipsOffset - _hipsOffset) * tau; } } return _relativePoses; From af6bb50f74e4667a0e7e35209544a02097ebf4a1 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 10 Feb 2016 12:09:28 -0800 Subject: [PATCH 3/3] fix warning --- libraries/animation/src/AnimInverseKinematics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index 79bf5d9a19..e3271037e0 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -468,7 +468,7 @@ const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars // smooth transitions by relaxing _hipsOffset toward the new value const float HIPS_OFFSET_SLAVE_TIMESCALE = 0.15f; - float tau = dt > HIPS_OFFSET_SLAVE_TIMESCALE ? 1.0 : dt / HIPS_OFFSET_SLAVE_TIMESCALE; + float tau = dt > HIPS_OFFSET_SLAVE_TIMESCALE ? 1.0f : dt / HIPS_OFFSET_SLAVE_TIMESCALE; _hipsOffset += (newHipsOffset - _hipsOffset) * tau; } }