From b557717dab576ba565a07984a6f1f6b04e1c3255 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 19 Jun 2018 14:27:27 -0700 Subject: [PATCH] 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 {