Add quat_slerp;

This commit is contained in:
bjorn 2017-11-05 13:57:52 -08:00
parent c3749eb9bd
commit f5275934b6
2 changed files with 29 additions and 0 deletions

View File

@ -58,6 +58,34 @@ float quat_length(quat q) {
return sqrt(q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
}
quat quat_slerp(quat q, quat r, float t) {
float dot = q[0] * r[0] + q[1] * r[1] + q[2] * r[2] + q[3] * r[3];
if (fabs(dot) >= 1.f) {
return q;
}
float halfTheta = acos(dot);
float sinHalfTheta = sqrt(1.f - dot * dot);
if (fabs(sinHalfTheta) < .001) {
q[0] = q[0] * .5 + r[0] * .5;
q[1] = q[1] * .5 + r[1] * .5;
q[2] = q[2] * .5 + r[2] * .5;
q[3] = q[3] * .5 + r[3] * .5;
return q;
}
float a = sin((1 - t) * halfTheta) / sinHalfTheta;
float b = sin(t * halfTheta) / sinHalfTheta;
q[0] = q[0] * a + r[0] * b;
q[1] = q[1] * a + r[1] * b;
q[2] = q[2] * a + r[2] * b;
q[3] = q[3] * a + r[3] * b;
return q;
}
void quat_rotate(quat q, vec3 v) {
float s = q[3];
float u[3];

View File

@ -8,5 +8,6 @@ quat quat_fromAngleAxis(quat q, float angle, vec3 axis);
quat quat_fromMat4(quat q, mat4 m);
quat quat_normalize(quat q);
float quat_length(quat q);
quat quat_slerp(quat q, quat r, float t);
void quat_rotate(quat q, vec3 v);
void quat_getAngleAxis(quat q, float* angle, float* x, float* y, float* z);