20#define likely(x) __builtin_expect((x), 1)
21#define unlikely(x) __builtin_expect((x), 0)
27namespace xrt::tracking::hand::mercury::lm {
32#define assert_quat_length_1(q) \
34 const T scale = q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]; \
35 if (abs(scale - T(1.0)) > 0.001) { \
36 std::cout << "Length bad! " << scale << std::endl; \
41#define assert_quat_length_1(q)
49CurlToQuaternion(
const T &curl, Quat<T> &result)
51 const T theta_squared = curl * curl;
54 if (likely(theta_squared > T(0.0))) {
56 const T half_theta = curl * T(0.5);
57 const T k = sin(half_theta) / theta;
58 result.w = cos(half_theta);
76SwingToQuaternion(
const Vec2<T> swing, Quat<T> &result)
79 const T &a0 = swing.x;
80 const T &a1 = swing.y;
81 const T theta_squared = a0 * a0 + a1 * a1;
84 if (likely(theta_squared > T(0.0))) {
85 const T theta = sqrt(theta_squared);
86 const T half_theta = theta * T(0.5);
87 const T k = sin(half_theta) / theta;
88 result.w = cos(half_theta);
111SwingTwistToQuaternion(
const Vec2<T> swing,
const T twist, Quat<T> &result)
117 T theta_squared_swing = swing_x * swing_x + swing_y * swing_y;
122 if (theta_squared_swing > T(0.0)) {
125 T theta = sqrt(theta_squared_swing);
127 T half_theta = theta * T(0.5);
130 T half_twist = twist * T(0.5);
132 T cos_half_theta = cos(half_theta);
133 T cos_half_twist = cos(half_twist);
135 T sin_half_twist = sin(half_twist);
137 T sin_half_theta_over_theta = sin(half_theta) / theta;
139 result.w = cos_half_theta * cos_half_twist;
141 T x_part_1 = (swing_x * cos_half_twist * sin_half_theta_over_theta);
142 T x_part_2 = (swing_y * sin_half_twist * sin_half_theta_over_theta);
144 result.x = x_part_1 + x_part_2;
146 T y_part_1 = (swing_y * cos_half_twist * sin_half_theta_over_theta);
147 T y_part_2 = (swing_x * sin_half_twist * sin_half_theta_over_theta);
149 result.y = y_part_1 - y_part_2;
151 result.z = cos_half_theta * sin_half_twist;
160 T half_twist = twist * T(0.5);
162 T cos_half_twist = cos(half_twist);
164 T sin_half_twist = sin(half_twist);
166 T sin_half_theta_over_theta = T(0.5);
169 result.w = cos_half_twist;
171 T x_part_1 = (swing_x * cos_half_twist * sin_half_theta_over_theta);
172 T x_part_2 = (swing_y * sin_half_twist * sin_half_theta_over_theta);
174 result.x = x_part_1 + x_part_2;
176 T y_part_1 = (swing_y * cos_half_twist * sin_half_theta_over_theta);
177 T y_part_2 = (swing_x * sin_half_twist * sin_half_theta_over_theta);
179 result.y = y_part_1 - y_part_2;
181 result.z = sin_half_twist;
Defines for Levenberg-Marquardt kinematic optimizer.
Autodiff-safe rotations for Levenberg-Marquardt kinematic optimizer.