From d3a70b7facea2919b5ee0451d3c639dedb00ea30 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Tue, 9 Sep 2008 15:25:03 +0000 Subject: [PATCH] fix a numerical instability in Quaternion::slerp --- Eigen/src/Geometry/Quaternion.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Eigen/src/Geometry/Quaternion.h b/Eigen/src/Geometry/Quaternion.h index 876524cc0..97add91d9 100644 --- a/Eigen/src/Geometry/Quaternion.h +++ b/Eigen/src/Geometry/Quaternion.h @@ -369,13 +369,14 @@ Quaternion Quaternion::slerp(Scalar t, const Quaternion& other) // 2 - Quaternion slerp(Scalar t, const Quaternion& other) const // which returns the s-lerp between this and other // ?? - if (m_coeffs == other.m_coeffs) + static const Scalar one = Scalar(1) - precision(); + Scalar d = m_coeffs.dot(other.m_coeffs); + Scalar absD = ei_abs(d); + if (d>=one) return *this; - Scalar d = m_coeffs.dot(other.m_coeffs); - // theta is the angle between the 2 quaternions - Scalar theta = std::acos(ei_abs(d)); + Scalar theta = std::acos(absD); Scalar sinTheta = ei_sin(theta); Scalar scale0 = ei_sin( ( Scalar(1) - t ) * theta) / sinTheta;