mirror of https://github.com/bjornbytes/lovr.git
Add quat_slerp;
This commit is contained in:
parent
c3749eb9bd
commit
f5275934b6
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue