cocos2dx 底层数学库kmQuaternionSlerp BUG

kmQuaternion* kmQuaternionSlerp(kmQuaternion* pOut,
const kmQuaternion* q1,
const kmQuaternion* q2,
kmScalar t)
{

/float CosTheta = Q0.DotProd(Q1);
float Theta = acosf(CosTheta);
float SinTheta = sqrtf(1.0f-CosTheta
CosTheta);

float Sin_T_Theta = sinf(T*Theta)/SinTheta;
float Sin_OneMinusT_Theta = sinf((1.0f-T)*Theta)/SinTheta;

Quaternion Result = Q0Sin_OneMinusT_Theta;
Result += (Q1
Sin_T_Theta);

return Result;*/

if (q1->x == q2->x &&
    q1->y == q2->y &&
    q1->z == q2->z &&
    q1->w == q2->w) {

    pOut->x = q1->x;
    pOut->y = q1->y;
    pOut->z = q1->z;
    pOut->w = q1->w;

    return pOut;
}
{
    kmScalar ct = kmQuaternionDot(q1, q2);
    kmScalar theta = acosf(ct);
    kmScalar st = sqrtf(1.0 - kmSQR(ct));

    kmScalar stt = sinf(t * theta) / st;
    kmScalar somt = sinf((1.0 - t) * theta) / st;

    kmQuaternion temp, temp2;
    kmQuaternionScale(&temp, q1, somt);
    kmQuaternionScale(&temp2, q2, stt);
    kmQuaternionAdd(pOut, &temp, &temp2);
}
return pOut;

}

这里的浮点数对比会有问题,当q1和q2差距很小kmQuaternionDot(q1, q2); 约等于1时,因为float精度问题会造成零除现象。