Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
Interpolation.hpp
Go to the documentation of this file.
1// Vulcan Rotation Interpolation
2// Slerp re-export and Squad interpolation for smooth quaternion curves
3#pragma once
4
7
8#include <janus/math/Quaternion.hpp>
9
10namespace vulcan {
11
12// =============================================================================
13// Basic Interpolation (Slerp)
14// =============================================================================
15
26template <typename Scalar>
27janus::Quaternion<Scalar> slerp(const janus::Quaternion<Scalar> &q0,
28 const janus::Quaternion<Scalar> &q1, Scalar t) {
29 return janus::slerp(q0, q1, t);
30}
31
32// =============================================================================
33// Quaternion Logarithm and Exponential
34// =============================================================================
35
43template <typename Scalar>
44janus::Quaternion<Scalar> quat_exp(const Vec3<Scalar> &v) {
45 Scalar angle = janus::norm(v);
46 Scalar eps = Scalar(1e-12);
47 Scalar safe_angle = angle + eps;
48
49 Scalar s = janus::sin(angle) / safe_angle;
50 Scalar c = janus::cos(angle);
51
52 // For small angles, use Taylor expansion: sin(x)/x ≈ 1
53 Scalar is_small = angle < eps;
54 s = janus::where(is_small, Scalar(1), s);
55 c = janus::where(is_small, Scalar(1), c);
56
57 return janus::Quaternion<Scalar>(c, s * v(0), s * v(1), s * v(2));
58}
59
68template <typename Scalar>
69Vec3<Scalar> quat_log(const janus::Quaternion<Scalar> &q) {
70 Scalar w = q.w;
71 Vec3<Scalar> v;
72 v(0) = q.x;
73 v(1) = q.y;
74 v(2) = q.z;
75
76 Scalar v_norm = janus::norm(v);
77 Scalar eps = Scalar(1e-12);
78 Scalar safe_norm = v_norm + eps;
79
80 Scalar angle = janus::acos(w);
81 Scalar scale = angle / safe_norm;
82
83 // For small angles, scale ≈ 1
84 Scalar is_small = v_norm < eps;
85 scale = janus::where(is_small, Scalar(1), scale);
86
87 v(0) = scale * v(0);
88 v(1) = scale * v(1);
89 v(2) = scale * v(2);
90
91 // For identity quaternion, return zero
92 v(0) = janus::where(is_small, Scalar(0), v(0));
93 v(1) = janus::where(is_small, Scalar(0), v(1));
94 v(2) = janus::where(is_small, Scalar(0), v(2));
95
96 return v;
97}
98
99// =============================================================================
100// Squad (Spherical Quadrangle Interpolation)
101// =============================================================================
102
115template <typename Scalar>
116janus::Quaternion<Scalar>
117squad_control_point(const janus::Quaternion<Scalar> &q_prev,
118 const janus::Quaternion<Scalar> &q_curr,
119 const janus::Quaternion<Scalar> &q_next) {
120 auto q_curr_inv = q_curr.conjugate();
121
122 // Compute log(q_i^(-1) * q_{i+1}) and log(q_i^(-1) * q_{i-1})
123 auto log_next = quat_log(q_curr_inv * q_next);
124 auto log_prev = quat_log(q_curr_inv * q_prev);
125
126 // Average and negate
127 Vec3<Scalar> avg;
128 avg(0) = -Scalar(0.25) * (log_next(0) + log_prev(0));
129 avg(1) = -Scalar(0.25) * (log_next(1) + log_prev(1));
130 avg(2) = -Scalar(0.25) * (log_next(2) + log_prev(2));
131
132 return q_curr * quat_exp(avg);
133}
134
150template <typename Scalar>
151janus::Quaternion<Scalar> squad(const janus::Quaternion<Scalar> &q0,
152 const janus::Quaternion<Scalar> &q1,
153 const janus::Quaternion<Scalar> &s0,
154 const janus::Quaternion<Scalar> &s1, Scalar t) {
155 auto q_slerp = slerp(q0, q1, t);
156 auto s_slerp = slerp(s0, s1, t);
157
158 // Blend parameter: 2t(1-t) peaks at t=0.5
159 Scalar h = Scalar(2) * t * (Scalar(1) - t);
160
161 return slerp(q_slerp, s_slerp, h);
162}
163
164} // namespace vulcan
Definition Aerodynamics.hpp:11
janus::Quaternion< Scalar > squad_control_point(const janus::Quaternion< Scalar > &q_prev, const janus::Quaternion< Scalar > &q_curr, const janus::Quaternion< Scalar > &q_next)
Definition Interpolation.hpp:117
janus::Quaternion< Scalar > squad(const janus::Quaternion< Scalar > &q0, const janus::Quaternion< Scalar > &q1, const janus::Quaternion< Scalar > &s0, const janus::Quaternion< Scalar > &s1, Scalar t)
Definition Interpolation.hpp:151
janus::Quaternion< Scalar > quat_exp(const Vec3< Scalar > &v)
Definition Interpolation.hpp:44
janus::Quaternion< Scalar > slerp(const janus::Quaternion< Scalar > &q0, const janus::Quaternion< Scalar > &q1, Scalar t)
Definition Interpolation.hpp:27
Vec3< Scalar > quat_log(const janus::Quaternion< Scalar > &q)
Definition Interpolation.hpp:69