8#include <janus/math/Quaternion.hpp>
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);
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;
49 Scalar s = janus::sin(angle) / safe_angle;
50 Scalar c = janus::cos(angle);
53 Scalar is_small = angle < eps;
54 s = janus::where(is_small, Scalar(1), s);
55 c = janus::where(is_small, Scalar(1), c);
57 return janus::Quaternion<Scalar>(c, s * v(0), s * v(1), s * v(2));
68template <
typename Scalar>
69Vec3<Scalar>
quat_log(
const janus::Quaternion<Scalar> &q) {
76 Scalar v_norm = janus::norm(v);
77 Scalar eps = Scalar(1e-12);
78 Scalar safe_norm = v_norm + eps;
80 Scalar angle = janus::acos(w);
81 Scalar scale = angle / safe_norm;
84 Scalar is_small = v_norm < eps;
85 scale = janus::where(is_small, Scalar(1), scale);
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));
115template <
typename Scalar>
116janus::Quaternion<Scalar>
118 const janus::Quaternion<Scalar> &q_curr,
119 const janus::Quaternion<Scalar> &q_next) {
120 auto q_curr_inv = q_curr.conjugate();
123 auto log_next =
quat_log(q_curr_inv * q_next);
124 auto log_prev =
quat_log(q_curr_inv * q_prev);
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));
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);
159 Scalar h = Scalar(2) * t * (Scalar(1) - t);
161 return slerp(q_slerp, s_slerp, h);
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