//----------------------------------------------------------------------- Quaternion Quaternion::SlerpExtraSpins(Real fT, const Quaternion& rkP, const Quaternion& rkQ, int iExtraSpins) { Real fCos = rkP.Dot(rkQ); Radian fAngle(Math::ACos(fCos)); if (Math::Abs(fAngle.valueRadians()) < msEpsilon) return rkP; Real fSin = Math::Sin(fAngle); Radian fPhase(Math::_PI*iExtraSpins*fT); Real fInvSin = 1.0f / fSin; Real fCoeff0 = Math::Sin((1.0f - fT)*fAngle.valueRadians() - fPhase.valueRadians())*fInvSin; Real fCoeff1 = Math::Sin(fT*fAngle.valueRadians() + fPhase.valueRadians())*fInvSin; return fCoeff0*rkP + fCoeff1*rkQ; }
// ----------------------------------------------------------------------------------------- CPepeEngineQuaternion CPepeEngineQuaternion::slerpExtraSpins ( float fT, const CPepeEngineQuaternion& rkP, const CPepeEngineQuaternion& rkQ, int iExtraSpins) { float fCos = rkP.dot(rkQ); Radian fAngle(CPepeEngineMath::ACos(fCos)); if (CPepeEngineMath::Abs(fAngle.valueRadians()) < ms_fEpsilon) { return rkP; } float fSin = CPepeEngineMath::Sin(fAngle); Radian fPhase(CPepeEngineMath::PI * iExtraSpins * fT); float fInvSin = 1.0f / fSin; float fCoeff0 = CPepeEngineMath::Sin((1.0f - fT) * fAngle - fPhase) * fInvSin; float fCoeff1 = CPepeEngineMath::Sin(fT * fAngle + fPhase) * fInvSin; return fCoeff0 * rkP + fCoeff1 * rkQ; }