Ejemplo n.º 1
0
	//-----------------------------------------------------------------------
	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;
}