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-CosThetaCosTheta);
float Sin_T_Theta = sinf(T*Theta)/SinTheta;
float Sin_OneMinusT_Theta = sinf((1.0f-T)*Theta)/SinTheta;
Quaternion Result = Q0Sin_OneMinusT_Theta;
Result += (Q1Sin_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精度问题会造成零除现象。