diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 615f11e897..2b6bd50eb0 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -551,10 +551,17 @@ 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); + setWorldAngularVelocity(angularVelocity); + _lastOrientation = orientation; + } else { + setWorldAngularVelocity(glm::vec3(0.0f)); + } } enum TextRendererType {