From b557717dab576ba565a07984a6f1f6b04e1c3255 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 19 Jun 2018 14:27:27 -0700 Subject: [PATCH 1/2] to avoid NaN: don not rely on glm::angle(quat) UYKWYAD --- .../src/avatars-renderer/Avatar.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 615f11e897..50a3e62e38 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -551,10 +551,18 @@ void Avatar::measureMotionDerivatives(float deltaTime) { // angular glm::quat orientation = getWorldOrientation(); - glm::quat delta = glm::inverse(_lastOrientation) * orientation; - glm::vec3 angularVelocity = glm::axis(delta) * glm::angle(delta) * invDeltaTime; - setWorldAngularVelocity(angularVelocity); - _lastOrientation = getWorldOrientation(); + float changeDot = glm::abs(glm::dot(orientation, _lastOrientation)); + float CHANGE_DOT_THRESHOLD = 0.9999f; + if (changeDot < CHANGE_DOT_THRESHOLD) { + float angle = 2.0f * acosf(changeDot); + glm::quat delta = glm::inverse(_lastOrientation) * orientation; + glm::vec3 angularVelocity = (angle * invDeltaTime) * glm::axis(delta); + if (glm::any(glm::isnan(angularVelocity))) { crashHere(); } + setWorldAngularVelocity(angularVelocity); + _lastOrientation = orientation; + } else { + setWorldAngularVelocity(glm::vec3(0.0f)); + } } enum TextRendererType { From 17a0dd574a04e1c8382a159cfd4430c2f40b974a Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 19 Jun 2018 14:36:57 -0700 Subject: [PATCH 2/2] remove debug cruft --- libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 50a3e62e38..2b6bd50eb0 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -557,7 +557,6 @@ void Avatar::measureMotionDerivatives(float deltaTime) { float angle = 2.0f * acosf(changeDot); glm::quat delta = glm::inverse(_lastOrientation) * orientation; glm::vec3 angularVelocity = (angle * invDeltaTime) * glm::axis(delta); - if (glm::any(glm::isnan(angularVelocity))) { crashHere(); } setWorldAngularVelocity(angularVelocity); _lastOrientation = orientation; } else {