Fix nans in math::slerp.

This commit is contained in:
Philip Rideout
2019-02-14 17:51:37 -08:00
parent 6fbecef857
commit 3b373e5d05

View File

@@ -250,7 +250,13 @@ public:
const T a = std::acos(std::abs(d) / npq);
const T a0 = a * (1 - t);
const T a1 = a * t;
const T isina = 1 / sin(a);
const T sina = sin(a);
// Prevent blowing up when slerping between two quaternions that are very near each other.
static constexpr T value_eps = T(10) * std::numeric_limits<T>::epsilon();
if (std::abs(sina) < value_eps) {
return lerp(p, q, t);
}
const T isina = 1 / sina;
const T s0 = std::sin(a0) * isina;
const T s1 = std::sin(a1) * isina;
// ensure we're taking the "short" side