base: add quat_slerp

This commit is contained in:
luboslenco
2026-06-02 12:30:43 +02:00
parent 15348a8d10
commit 3dd6b3b104
2 changed files with 23 additions and 0 deletions
+22
View File
@@ -447,6 +447,28 @@ quat_t quat_inv(quat_t q) {
return q;
}
quat_t quat_slerp(quat_t a, quat_t b, float t) {
float dot = quat_dot(a, b);
if (dot < 0.0f) {
b.x = -b.x;
b.y = -b.y;
b.z = -b.z;
b.w = -b.w;
dot = -dot;
}
if (dot > 0.9995f) {
quat_t r = {a.x + t * (b.x - a.x), a.y + t * (b.y - a.y), a.z + t * (b.z - a.z), a.w + t * (b.w - a.w)};
return quat_norm(r);
}
float theta_0 = acosf(dot);
float theta = theta_0 * t;
float sin_t = sinf(theta);
float sin_t0 = sinf(theta_0);
float s0 = cosf(theta) - dot * sin_t / sin_t0;
float s1 = sin_t / sin_t0;
return (quat_t){s0 * a.x + s1 * b.x, s0 * a.y + s1 * b.y, s0 * a.z + s1 * b.z, s0 * a.w + s1 * b.w};
}
// ███╗ ███╗ █████╗ ████████╗██████╗
// ████╗ ████║██╔══██╗╚══██╔══╝╚════██╗
// ██╔████╔██║███████║ ██║ █████╔╝
+1
View File
@@ -120,6 +120,7 @@ quat_t quat_from_euler(float x, float y, float z);
float quat_dot(quat_t a, quat_t b);
quat_t quat_from_to(vec4_t v0, vec4_t v1);
quat_t quat_inv(quat_t q);
quat_t quat_slerp(quat_t a, quat_t b, float t);
mat3_t mat3_identity();
mat3_t mat3_translation(float x, float y);