cpVect cpvslerpconst(const cpVect v1, const cpVect v2, const cpFloat a) { cpFloat dot = cpvdot(cpvnormalize(v1), cpvnormalize(v2)); cpFloat omega = cpfacos(cpfclamp(dot, -1.0f, 1.0f)); return cpvslerp(v1, v2, cpfmin(a, omega)/omega); }
inline cpVect cpvslerp(const cpVect v1, const cpVect v2, const cpFloat t) { cpFloat omega = cpfacos(cpvdot(v1, v2)); if(omega){ cpFloat denom = 1.0f/cpfsin(omega); return cpvadd(cpvmult(v1, cpfsin((1.0f - t)*omega)*denom), cpvmult(v2, cpfsin(t*omega)*denom)); } else { return v1; } }
inline cpVect cpvslerp(const cpVect v1, const cpVect v2, const cpFloat t) { cpFloat dot = cpvdot(cpvnormalize(v1), cpvnormalize(v2)); cpFloat omega = cpfacos(cpfclamp(dot, -1.0f, 1.0f)); if(omega == 0.0) { return v1; } else { cpFloat denom = 1.0f/cpfsin(omega); return cpvadd(cpvmult(v1, cpfsin((1.0f - t)*omega)*denom), cpvmult(v2, cpfsin(t*omega)*denom)); } }
cpVect cpvslerpconst(const cpVect v1, const cpVect v2, const cpFloat a) { cpFloat angle = cpfacos(cpvdot(v1, v2)); return cpvslerp(v1, v2, cpfmin(a, angle)/angle); }