Monado OpenXR Runtime
m_api.h
Go to the documentation of this file.
1// Copyright 2019-2021, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief C interface to math library.
6 * @author Jakob Bornecrantz <jakob@collabora.com>
7 * @author Moshi Turner <moshiturner@protonmail.com>
8 * @author Nis Madsen <nima_zero_one@protonmail.com>
9 *
10 * @see xrt_vec3
11 * @see xrt_quat
12 * @see xrt_pose
13 * @see xrt_space_relation
14 * @ingroup aux_math
15 */
16
17#pragma once
18
19#include "xrt/xrt_defines.h"
20
21#include "math/m_mathinclude.h"
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
27
28/*!
29 * @defgroup aux_math Math
30 * @ingroup aux
31 *
32 * @brief C interface to some transform-related math functions.
33 */
34
35/*!
36 * @dir auxiliary/math
37 * @ingroup aux
38 *
39 * @brief C interface to some transform-related math functions.
40 */
41
42/*
43 *
44 * Defines.
45 *
46 */
47
48/*!
49 * Standard gravity acceleration constant.
50 *
51 * @ingroup aux_math
52 */
53#define MATH_GRAVITY_M_S2 (9.8066)
54
55/*!
56 * Minimum of A and B.
57 *
58 * @ingroup aux_math
59 */
60#ifndef MIN // Avoid clash with OpenCV def
61#define MIN(A, B) ((A) < (B) ? (A) : (B))
62#endif
63
64/*!
65 * Maximum of A and B.
66 *
67 * @ingroup aux_math
68 */
69#ifndef MAX // Avoid clash with OpenCV def
70#define MAX(A, B) ((A) > (B) ? (A) : (B))
71#endif
72
73/*!
74 * X clamped to the range [A, B].
75 *
76 * @ingroup aux_math
77 */
78#define CLAMP(X, A, B) (MIN(MAX((X), (A)), (B)))
79
80/*!
81 * Degrees to radians conversion.
82 *
83 * @ingroup aux_math
84 */
85// clang-format off
86// @todo: Remove the clang-format off/on when we move to a newer clang-format in CI.
87#define DEG_TO_RAD(DEG) ((DEG) * M_PI / 180.)
88// clang-format on
89
90/*!
91 * Radians to degrees conversion.
92 *
93 * @ingroup aux_math
94 */
95// clang-format off
96#define RAD_TO_DEG(RAD) ((RAD) * 180.0 / M_PI)
97// clang-format on
98
99
100/*
101 *
102 * Hash functions.
103 *
104 */
105
106/*!
107 * Generate a hash value from the given string, trailing zero not included.
108 *
109 * Hashing function used is not specified so no guarantee of staying the same
110 * between different versions of the software, or even when the same version
111 * is compiled on different platforms/libc++ as it might use std::hash.
112 *
113 * @ingroup aux_math
114 */
115size_t
116math_hash_string(const char *str_c, size_t length);
117
118
119/*
120 *
121 * Vector functions
122 *
123 */
124
125/*!
126 * Check if this vec3 is valid for math operations.
127 *
128 * @relates xrt_vec3
129 * @ingroup aux_math
130 */
131bool
132math_vec3_validate(const struct xrt_vec3 *vec3);
133
134/*!
135 * Accumulate a vector by adding in-place.
136 *
137 * Logically, *inAndOut += *additional
138 * OK if the two arguments are the same addresses.
139 *
140 * @relates xrt_vec3
141 * @ingroup aux_math
142 */
143void
144math_vec3_accum(const struct xrt_vec3 *additional, struct xrt_vec3 *inAndOut);
145
146/*!
147 * Subtract from a vector in-place.
148 *
149 * Logically, *inAndOut -= *subtrahend
150 * OK if the two arguments are the same addresses.
151 *
152 * @relates xrt_vec3
153 * @ingroup aux_math
154 */
155void
156math_vec3_subtract(const struct xrt_vec3 *subtrahend, struct xrt_vec3 *inAndOut);
157
158/*!
159 * Multiply a vector in-place.
160 *
161 * Logically, *inAndOut *= scalar
162 *
163 * @relates xrt_vec3
164 * @ingroup aux_math
165 */
166void
167math_vec3_scalar_mul(float scalar, struct xrt_vec3 *inAndOut);
168
169/*!
170 * Cross product of a vector.
171 *
172 * @relates xrt_vec3
173 * @ingroup aux_math
174 */
175void
176math_vec3_cross(const struct xrt_vec3 *l, const struct xrt_vec3 *r, struct xrt_vec3 *result);
177
178/*!
179 * Get translation vector from isometry matrix (col-major).
180 *
181 * @relates xrt_vec3
182 * @ingroup aux_math
183 */
184void
185math_vec3_translation_from_isometry(const struct xrt_matrix_4x4 *isometry, struct xrt_vec3 *result);
186
187/*!
188 * Normalize a vec3 in place.
189 *
190 * @relates xrt_vec3
191 * @ingroup aux_math
192 */
193void
194math_vec3_normalize(struct xrt_vec3 *in);
195
196
197/*
198 *
199 * 64 bit vector functions.
200 *
201 */
202
203/*!
204 * Cross product of a vec3_f64.
205 *
206 * @relates xrt_vec3_f64
207 * @ingroup aux_math
208 */
209void
210math_vec3_f64_cross(const struct xrt_vec3_f64 *l, const struct xrt_vec3_f64 *r, struct xrt_vec3_f64 *result);
211
212/*!
213 * Normalize a vec3_f64 in place.
214 *
215 * @relates xrt_vec3_f64
216 * @ingroup aux_math
217 */
218void
220
221
222/*
223 *
224 * Quat functions.
225 *
226 */
227
228/*!
229 * Create a rotation from an angle in radians and a unit vector.
230 *
231 * @relates xrt_quat
232 * @see xrt_vec3
233 * @ingroup aux_math
234 */
235void
236math_quat_from_angle_vector(float angle_rads, const struct xrt_vec3 *vector, struct xrt_quat *result);
237
238/*!
239 * Create a rotation from euler angles to a quaternion
240 * @relates xrt_quat
241 * @ingroup aux_math
242 */
243void
244math_quat_from_euler_angles(const struct xrt_vec3 *angles, struct xrt_quat *result);
245
246/*!
247 * Create a rotation from a quaternion to euler angles
248 * @relates xrt_quat
249 * @ingroup aux_math
250 */
251void
252math_quat_to_euler_angles(const struct xrt_quat *quat, struct xrt_vec3 *euler_angles);
253
254/*!
255 * Create a rotation from a 3x3 rotation (row major) matrix.
256 *
257 * @relates xrt_quat
258 * @see xrt_matrix_3x3
259 * @ingroup aux_math
260 */
261void
262math_quat_from_matrix_3x3(const struct xrt_matrix_3x3 *mat, struct xrt_quat *result);
263
264/*!
265 * Create a rotation from two vectors plus x and z, by creating a rotation
266 * matrix by crossing z and x to get the y axis.
267 *
268 * Input vectors should be normalized.
269 *
270 * @relates xrt_quat
271 * @see xrt_vec3
272 * @ingroup aux_math
273 */
274void
275math_quat_from_plus_x_z(const struct xrt_vec3 *plus_x, const struct xrt_vec3 *plus_z, struct xrt_quat *result);
276
277/*!
278 * Create a rotation from two vectors vec_a and vec_b that would
279 * rotate vec_a into vec_b
280 *
281 * @relates xrt_quat
282 * @see xrt_vec3
283 * @ingroup aux_math
284 */
285void
286math_quat_from_vec_a_to_vec_b(const struct xrt_vec3 *vec_a, const struct xrt_vec3 *vec_b, struct xrt_quat *result);
287
288/*!
289 * Check if this quat can be used in transformation operations.
290 *
291 * @relates xrt_quat
292 * @ingroup aux_math
293 */
294bool
295math_quat_validate(const struct xrt_quat *quat);
296
297/*!
298 * Check if this quat is within 1% of unit length.
299 *
300 * @relates xrt_quat
301 * @ingroup aux_math
302 */
303bool
305
306/*!
307 * Invert a quaternion.
308 *
309 * @relates xrt_quat
310 * @ingroup aux_math
311 */
312void
313math_quat_invert(const struct xrt_quat *quat, struct xrt_quat *out_quat);
314
315/*!
316 * The euclidean norm or length of a quaternion. Same as if it were a vec4.
317 *
318 * @relates xrt_quat
319 * @ingroup aux_math
320 */
321float
322math_quat_len(const struct xrt_quat *quat);
323
324/*!
325 * The dot product of 2 quaternions. It has a analogous interpretation
326 * as for vec3. For unit quaternions, it provides cos(theta) of the
327 * angle between the 2 quaternion rotations.
328 *
329 * @relates xrt_quat
330 * @ingroup aux_math
331 */
332static inline float
333math_quat_dot(const struct xrt_quat *l, const struct xrt_quat *r)
334{
335 return l->x * r->x + l->y * r->y + l->z * r->z + l->w * r->w;
336}
337
338/*!
339 * Normalize a quaternion.
340 *
341 * @relates xrt_quat
342 * @ingroup aux_math
343 */
344void
345math_quat_normalize(struct xrt_quat *inout);
346
347/*!
348 * Normalizes a quaternion if it has accumulated float precision errors.
349 * Returns true if the quaternion was already normalized or was normalized after
350 * being found within a small float precision tolerance.
351 * Returns false if the quaternion was not at all normalized.
352 *
353 * @relates xrt_quat
354 * @ingroup aux_math
355 */
356bool
358
359/*!
360 * Rotate a vector.
361 *
362 * @relates xrt_quat
363 * @see xrt_vec3
364 * @ingroup aux_math
365 */
366void
367math_quat_rotate_vec3(const struct xrt_quat *left, const struct xrt_vec3 *right, struct xrt_vec3 *result);
368
369/*!
370 * Rotate a quaternion (compose rotations).
371 *
372 * @relates xrt_quat
373 * @ingroup aux_math
374 */
375void
376math_quat_rotate(const struct xrt_quat *left, const struct xrt_quat *right, struct xrt_quat *result);
377
378/*!
379 * Inverse of @ref math_quat_rotate. Removes @p left rotation from @p right.
380 *
381 * @relates xrt_quat
382 * @ingroup aux_math
383 */
384void
385math_quat_unrotate(const struct xrt_quat *left, const struct xrt_quat *right, struct xrt_quat *result);
386
387/*!
388 * Integrate a local angular velocity vector (exponential map) and apply to a
389 * quaternion.
390 *
391 * ang_vel and dt should share the same units of time, and the ang_vel
392 * vector should be in radians per unit of time.
393 *
394 * @relates xrt_quat
395 * @see xrt_vec3
396 * @ingroup aux_math
397 */
398void
399math_quat_integrate_velocity(const struct xrt_quat *quat,
400 const struct xrt_vec3 *ang_vel,
401 float dt,
402 struct xrt_quat *result);
403
404/*!
405 * Compute a global angular velocity vector (exponential map format) by taking
406 * the finite difference of two quaternions.
407 *
408 * quat1 is the orientation dt time after the orientation was quat0
409 *
410 * out_ang_vel and dt share the same units of time, and out_ang_vel is be in
411 * radians per unit of time.
412 *
413 * @relates xrt_quat
414 * @see xrt_vec3
415 * @ingroup aux_math
416 */
417void
418math_quat_finite_difference(const struct xrt_quat *quat0,
419 const struct xrt_quat *quat1,
420 float dt,
421 struct xrt_vec3 *out_ang_vel);
422
423/*!
424 * Takes a rotation vector equal to half of a Rodrigues rotation vector and returns its corresponding unit quaternion.
425 * Useful for head tracking and pose-prediction.
426 *
427 * @relates xrt_quat
428 * @see xrt_vec3
429 * @ingroup aux_math
430 */
431void
432math_quat_exp(const struct xrt_vec3 *axis_angle, struct xrt_quat *out_quat);
433
434
435/*!
436 * Takes a unit quaternion and returns a rotation vector equal to half of its corresponding Rodrigues rotation vector.
437 * Useful for head tracking and pose-prediction.
438 *
439 * @relates xrt_quat
440 * @see xrt_vec3
441 * @ingroup aux_math
442 */
443void
444math_quat_ln(const struct xrt_quat *quat, struct xrt_vec3 *out_axis_angle);
445
446/*!
447 * Used to rotate a derivative like a angular velocity.
448 *
449 * @relates xrt_quat
450 * @see xrt_vec3
451 * @ingroup aux_math
452 */
453void
454math_quat_rotate_derivative(const struct xrt_quat *quat, const struct xrt_vec3 *deriv, struct xrt_vec3 *result);
455
456
457/*!
458 * Slerp (spherical linear interpolation) between two quaternions
459 *
460 * @relates xrt_quat
461 * @ingroup aux_math
462 */
463void
464math_quat_slerp(const struct xrt_quat *left, const struct xrt_quat *right, float t, struct xrt_quat *result);
465
466
467/*!
468 * Converts a 2D vector to a quaternion
469 *
470 * @relates xrt_quat
471 * @ingroup aux_math
472 */
473void
474math_quat_from_swing(const struct xrt_vec2 *swing, struct xrt_quat *result);
475
476
477/*!
478 * Converts a 2D vector and a float to a quaternion
479 *
480 * @relates xrt_quat
481 * @ingroup aux_math
482 */
483void
484math_quat_from_swing_twist(const struct xrt_vec2 *swing, const float twist, struct xrt_quat *result);
485
486/*!
487 * Converts a quaternion to XY-swing and Z-twist
488 *
489 * @relates xrt_quat
490 * @ingroup aux_math
491 */
492void
493math_quat_to_swing_twist(const struct xrt_quat *in, struct xrt_vec2 *out_swing, float *out_twist);
494
495/*!
496 * Decompose a quaternion to swing and twist component rotations around a target
497 * axis. The swing is always orthogonal to the target axis, and twist rotation is always
498 * around the axis.
499 *
500 * swing * twist gives back the original quat
501 * (e.g. math_quat_rotate(&swing, &twist, &orig_q))
502 *
503 * See https://arxiv.org/pdf/1506.05481.pdf
504 *
505 * @relates xrt_quat
506 * @ingroup aux_math
507 */
508void
510 const struct xrt_vec3 *twist_axis,
511 struct xrt_quat *swing,
512 struct xrt_quat *twist);
513
514/*
515 *
516 * Matrix functions
517 *
518 */
519
520/*!
521 * Initialize a 3x3 matrix to the identity matrix
522 *
523 * @see xrt_matrix_3x3
524 * @ingroup aux_math
525 */
526void
528
529/*!
530 * Initialize a 3x3 matrix from a quaternion
531 *
532 * @see xrt_matrix_3x3
533 * @ingroup aux_math
534 */
535void
536math_matrix_3x3_from_quat(const struct xrt_quat *q, struct xrt_matrix_3x3 *result_out);
537
538/*!
539 * Initialize a double 3x3 matrix to the identity matrix
540 *
541 * @see xrt_matrix_3x3
542 * @ingroup aux_math
543 */
544void
546
547/*!
548 * Transform a vec3 by a 3x3 matrix
549 *
550 * @see xrt_matrix_3x3
551 * @ingroup aux_math
552 */
553void
555 const struct xrt_vec3 *right,
556 struct xrt_vec3 *result_out);
557
558/*!
559 * Transform a vec3 by a 4x4 matrix, extending the vector with w = 1.0
560 *
561 * @see xrt_matrix_4x4
562 * @ingroup aux_math
563 */
564void
566 const struct xrt_vec3 *right,
567 struct xrt_vec3 *result_out);
568
569/*!
570 * Transform a double vec3 by a 3x3 double matrix
571 *
572 * @see xrt_matrix_3x3
573 * @ingroup aux_math
574 */
575void
577 const struct xrt_vec3_f64 *right,
578 struct xrt_vec3_f64 *result_out);
579
580/*!
581 * Multiply Matrix3x3.
582 *
583 * @relates xrt_matrix_3x3
584 * @ingroup aux_math
585 */
586void
588 const struct xrt_matrix_3x3 *right,
589 struct xrt_matrix_3x3 *result_out);
590
591/*!
592 * Invert Matrix3x3
593 *
594 * @relates xrt_matrix_3x3
595 * @ingroup aux_math
596 */
597void
598math_matrix_3x3_inverse(const struct xrt_matrix_3x3 *in, struct xrt_matrix_3x3 *result);
599
600/*!
601 * Transpose Matrix3x3
602 *
603 * @relates xrt_matrix_3x3
604 * @ingroup aux_math
605 */
606void
607math_matrix_3x3_transpose(const struct xrt_matrix_3x3 *in, struct xrt_matrix_3x3 *result);
608
609/*!
610 * Create a rotation from two vectors plus x and z, by
611 * creating a rotation matrix by crossing z and x to
612 * get the y axis.
613 *
614 * Input vectors should be normalized.
615 *
616 * @relates xrt_matrix_3x3
617 * @ingroup aux_math
618 */
619void
621 const struct xrt_vec3_f64 *plus_z,
622 struct xrt_matrix_3x3_f64 *result);
623
624/*!
625 * Get the rotation matrix from an isomertry matrix (col-major).
626 *
627 * @relates xrt_matrix_4x4
628 * @ingroup aux_math
629 */
630void
631math_matrix_3x3_rotation_from_isometry(const struct xrt_matrix_4x4 *isometry, struct xrt_matrix_3x3 *result);
632
633/*!
634 * Initialize Matrix4x4 with identity.
635 *
636 * @relates xrt_matrix_4x4
637 * @ingroup aux_math
638 */
639void
641
642/*!
643 * Multiply Matrix4x4.
644 *
645 * @relates xrt_matrix_4x4
646 * @ingroup aux_math
647 */
648void
650 const struct xrt_matrix_4x4 *right,
651 struct xrt_matrix_4x4 *result);
652
653/*!
654 * Invert Matrix4x4.
655 *
656 * @relates xrt_matrix_4x4
657 * @ingroup aux_math
658 */
659void
660math_matrix_4x4_inverse(const struct xrt_matrix_4x4 *in, struct xrt_matrix_4x4 *result);
661
662/*!
663 * Invert a homogeneous isometry 4x4 (col-major) matrix in SE(3).
664 *
665 * @relates xrt_matrix_4x4
666 * @ingroup aux_math
667 */
668void
669math_matrix_4x4_isometry_inverse(const struct xrt_matrix_4x4 *in, struct xrt_matrix_4x4 *result);
670
671/*!
672 * Transpose Matrix4x4
673 *
674 * @relates xrt_matrix_4x4
675 * @ingroup aux_math
676 */
677void
678math_matrix_4x4_transpose(const struct xrt_matrix_4x4 *in, struct xrt_matrix_4x4 *result);
679
680/*!
681 * Compute view matrix from xrt_pose.
682 *
683 * @relates xrt_matrix_4x4
684 * @ingroup aux_math
685 */
686void
687math_matrix_4x4_view_from_pose(const struct xrt_pose *pose, struct xrt_matrix_4x4 *result);
688
689/*!
690 * Get an isometry matrix —in SE(3)— from a rotation matrix —SO(3)— and a
691 * translation vector. All col-major matrices.
692 *
693 * @relates xrt_matrix_4x4
694 * @ingroup aux_math
695 */
696void
698 const struct xrt_vec3 *translation,
699 struct xrt_matrix_4x4 *result);
700
701/*!
702 * Get a col-major isometry matrix —in SE(3)— from a pose.
703 *
704 * @relates xrt_matrix_4x4
705 * @ingroup aux_math
706 */
707void
708math_matrix_4x4_isometry_from_pose(const struct xrt_pose *pose, struct xrt_matrix_4x4 *result);
709
710/*!
711 * Compute quad layer model matrix from xrt_pose and xrt_vec2 size.
712 *
713 * @relates xrt_matrix_4x4
714 * @ingroup aux_math
715 */
716void
717math_matrix_4x4_model(const struct xrt_pose *pose, const struct xrt_vec3 *size, struct xrt_matrix_4x4 *result);
718
719/*!
720 * Compute inverse view projection matrix,
721 * using only the starting 3x3 block of the view.
722 *
723 * @relates xrt_matrix_4x4
724 * @ingroup aux_math
725 */
726void
728 const struct xrt_matrix_4x4 *projection,
729 struct xrt_matrix_4x4 *result);
730
731/*!
732 * Compute a projection matrix with settings for Vulkan, it will also have it's
733 * far plane at infinite and the NDC depth will be reversed.
734 *
735 * @relates xrt_matrix_4x4
736 * @ingroup aux_math
737 */
738void
740 float near_plane,
741 struct xrt_matrix_4x4 *result);
742
743
744/*
745 *
746 * Pose functions.
747 *
748 */
749
750
751/*!
752 * Somewhat laboriously make an xrt_pose identity.
753 *
754 * @relates xrt_pose
755 * @ingroup aux_math
756 */
757void
758math_pose_identity(struct xrt_pose *pose);
759
760/*!
761 * Check if this pose can be used in transformation operations.
762 *
763 * @relates xrt_pose
764 * @ingroup aux_math
765 */
766bool
767math_pose_validate(const struct xrt_pose *pose);
768
769/*!
770 * Invert pose.
771 *
772 * OK if input and output are the same addresses.
773 *
774 * @relates xrt_pose
775 * @ingroup aux_math
776 */
777void
778math_pose_invert(const struct xrt_pose *pose, struct xrt_pose *outPose);
779
780/*!
781 * Converts a (col-major) isometry into a pose.
782 *
783 * @relates xrt_pose
784 * @ingroup aux_math
785 */
786void
787math_pose_from_isometry(const struct xrt_matrix_4x4 *transform, struct xrt_pose *result);
788
789/*!
790 * Interpolated pose between poses `a` and `b` by lerping position and slerping
791 * orientation by t.
792 *
793 * @relates xrt_pose
794 * @ingroup aux_math
795 */
796void
797math_pose_interpolate(const struct xrt_pose *a, const struct xrt_pose *b, float t, struct xrt_pose *outPose);
798
799/*!
800 * Apply a rigid-body transformation to a pose.
801 *
802 * OK if input and output are the same addresses.
803 *
804 * @relates xrt_pose
805 * @ingroup aux_math
806 */
807void
808math_pose_transform(const struct xrt_pose *transform, const struct xrt_pose *pose, struct xrt_pose *outPose);
809
810/*!
811 * Apply a rigid-body transformation to a point.
812 *
813 * The input point and output may be the same pointer.
814 *
815 * @relates xrt_pose
816 * @see xrt_vec3
817 * @ingroup aux_math
818 */
819void
820math_pose_transform_point(const struct xrt_pose *transform, const struct xrt_vec3 *point, struct xrt_vec3 *out_point);
821
822
823/*
824 *
825 * Inline functions.
826 *
827 */
828
829/*!
830 * Map a number from one range to another range.
831 * Exactly the same as Arduino's map().
832 */
833static inline double
834math_map_ranges(double value, double from_low, double from_high, double to_low, double to_high)
835{
836 return (value - from_low) * (to_high - to_low) / (from_high - from_low) + to_low;
837}
838
839static inline double
840math_lerp(double from, double to, double amount)
841{
842 return (from * (1.0 - amount)) + (to * (amount));
843}
844
845/*
846 *
847 * Optics functions.
848 *
849 */
850
851/*!
852 * Perform the computations from
853 * "Computing Half-Fields-Of-View from Simpler Display Models",
854 * to get half-FOVs from things we can retrieve from other APIs.
855 * The origin is in the lower-left corner of the display, so w_1 is the width to
856 * the left of CoP, and h_1 is the height below CoP.
857 *
858 * If vertfov_total is set to 0, it will be computed from h_total.
859 *
860 * Distances are in arbitrary but consistent units. Angles are in radians.
861 *
862 *
863 * In the diagram below, treating it like a FOV for horizontal,
864 * the top angle is horizfov_total, the length of the bottom
865 * is w_total, and the distance between the vertical line and the left corner is
866 * w_1. Vertical is similar - h_1 is above the center line.
867 * The triangle need not be symmetrical, despite how the diagram looks.
868 *
869 * ```
870 * horizfov_total
871 * *
872 * angle_left (neg) -> / | \ <- angle_right
873 * / | \
874 * / | \
875 * / | \
876 * -------------
877 * [ w_1 ]
878 * [ --- w --- ]
879 *
880 * ------- --- |\
881 * | \
882 * h_1 | \ angle_up
883 * h_total ___ |-------* vertfov_total
884 * | / angle_down (neg)
885 * | /
886 * | /
887 * ------- |/
888 * ```
889 *
890 * @return true if successful.
891 * @ingroup aux_math
892 */
893bool
894math_compute_fovs(double w_total,
895 double w_1,
896 double horizfov_total,
897 double h_total,
898 double h_1,
899 double vertfov_total,
900 struct xrt_fov *fov);
901
902#ifdef __cplusplus
903}
904#endif
void math_quat_rotate_derivative(const struct xrt_quat *quat, const struct xrt_vec3 *deriv, struct xrt_vec3 *result)
Used to rotate a derivative like a angular velocity.
Definition: m_base.cpp:405
void math_vec3_normalize(struct xrt_vec3 *in)
Normalize a vec3 in place.
Definition: m_base.cpp:173
void math_matrix_4x4_projection_vulkan_infinite_reverse(const struct xrt_fov *fov, float near_plane, struct xrt_matrix_4x4 *result)
Compute a projection matrix with settings for Vulkan, it will also have it's far plane at infinite an...
Definition: m_matrix_projection.cpp:76
void math_matrix_4x4_isometry_from_pose(const struct xrt_pose *pose, struct xrt_matrix_4x4 *result)
Get a col-major isometry matrix —in SE(3)— from a pose.
Definition: m_base.cpp:808
void math_vec3_f64_normalize(struct xrt_vec3_f64 *in)
Normalize a vec3_f64 in place.
Definition: m_base.cpp:199
void math_quat_from_swing(const struct xrt_vec2 *swing, struct xrt_quat *result)
Converts a 2D vector to a quaternion.
Definition: m_base.cpp:435
void math_quat_from_vec_a_to_vec_b(const struct xrt_vec3 *vec_a, const struct xrt_vec3 *vec_b, struct xrt_quat *result)
Create a rotation from two vectors vec_a and vec_b that would rotate vec_a into vec_b.
Definition: m_base.cpp:268
void math_quat_decompose_swing_twist(const struct xrt_quat *in, const struct xrt_vec3 *twist_axis, struct xrt_quat *swing, struct xrt_quat *twist)
Decompose a quaternion to swing and twist component rotations around a target axis.
Definition: m_base.cpp:565
void math_matrix_4x4_isometry_inverse(const struct xrt_matrix_4x4 *in, struct xrt_matrix_4x4 *result)
Invert a homogeneous isometry 4x4 (col-major) matrix in SE(3).
Definition: m_base.cpp:778
void math_pose_transform_point(const struct xrt_pose *transform, const struct xrt_vec3 *point, struct xrt_vec3 *out_point)
Apply a rigid-body transformation to a point.
Definition: m_base.cpp:987
void math_matrix_3x3_multiply(const struct xrt_matrix_3x3 *left, const struct xrt_matrix_3x3 *right, struct xrt_matrix_3x3 *result_out)
Multiply Matrix3x3.
Definition: m_base.cpp:713
void math_vec3_subtract(const struct xrt_vec3 *subtrahend, struct xrt_vec3 *inAndOut)
Subtract from a vector in-place.
Definition: m_base.cpp:150
void math_matrix_3x3_f64_identity(struct xrt_matrix_3x3_f64 *mat)
Initialize a double 3x3 matrix to the identity matrix.
Definition: m_base.cpp:637
void math_matrix_3x3_transpose(const struct xrt_matrix_3x3 *in, struct xrt_matrix_3x3 *result)
Transpose Matrix3x3.
Definition: m_base.cpp:743
void math_vec3_f64_cross(const struct xrt_vec3_f64 *l, const struct xrt_vec3_f64 *r, struct xrt_vec3_f64 *result)
Cross product of a vec3_f64.
Definition: m_base.cpp:193
void math_quat_from_plus_x_z(const struct xrt_vec3 *plus_x, const struct xrt_vec3 *plus_z, struct xrt_quat *result)
Create a rotation from two vectors plus x and z, by creating a rotation matrix by crossing z and x to...
Definition: m_base.cpp:247
bool math_vec3_validate(const struct xrt_vec3 *vec3)
Check if this vec3 is valid for math operations.
Definition: m_base.cpp:133
void math_pose_transform(const struct xrt_pose *transform, const struct xrt_pose *pose, struct xrt_pose *outPose)
Apply a rigid-body transformation to a pose.
Definition: m_base.cpp:976
bool math_compute_fovs(double w_total, double w_1, double horizfov_total, double h_total, double h_1, double vertfov_total, struct xrt_fov *fov)
Perform the computations from "Computing Half-Fields-Of-View from Simpler Display Models",...
Definition: m_optics.c:118
void math_matrix_4x4_identity(struct xrt_matrix_4x4 *result)
Initialize Matrix4x4 with identity.
Definition: m_base.cpp:750
void math_quat_to_swing_twist(const struct xrt_quat *in, struct xrt_vec2 *out_swing, float *out_twist)
Converts a quaternion to XY-swing and Z-twist.
Definition: m_base.cpp:543
void math_quat_to_euler_angles(const struct xrt_quat *quat, struct xrt_vec3 *euler_angles)
Create a rotation from a quaternion to euler angles.
Definition: m_base.cpp:226
void math_vec3_cross(const struct xrt_vec3 *l, const struct xrt_vec3 *r, struct xrt_vec3 *result)
Cross product of a vector.
Definition: m_base.cpp:167
void math_matrix_3x3_identity(struct xrt_matrix_3x3 *mat)
Initialize a 3x3 matrix to the identity matrix.
Definition: m_base.cpp:611
void math_matrix_4x4_inverse_view_projection(const struct xrt_matrix_4x4 *view, const struct xrt_matrix_4x4 *projection, struct xrt_matrix_4x4 *result)
Compute inverse view projection matrix, using only the starting 3x3 block of the view.
Definition: m_base.cpp:829
void math_matrix_4x4_transpose(const struct xrt_matrix_4x4 *in, struct xrt_matrix_4x4 *result)
Transpose Matrix4x4.
Definition: m_base.cpp:771
void math_quat_rotate_vec3(const struct xrt_quat *left, const struct xrt_vec3 *right, struct xrt_vec3 *result)
Rotate a vector.
Definition: m_base.cpp:390
void math_matrix_4x4_view_from_pose(const struct xrt_pose *pose, struct xrt_matrix_4x4 *result)
Compute view matrix from xrt_pose.
Definition: m_base.cpp:785
void math_vec3_scalar_mul(float scalar, struct xrt_vec3 *inAndOut)
Multiply a vector in-place.
Definition: m_base.cpp:159
void math_quat_finite_difference(const struct xrt_quat *quat0, const struct xrt_quat *quat1, float dt, struct xrt_vec3 *out_ang_vel)
Compute a global angular velocity vector (exponential map format) by taking the finite difference of ...
Definition: m_quatexpmap.cpp:158
void math_quat_exp(const struct xrt_vec3 *axis_angle, struct xrt_quat *out_quat)
Takes a rotation vector equal to half of a Rodrigues rotation vector and returns its corresponding un...
Definition: m_quatexpmap.cpp:174
size_t math_hash_string(const char *str_c, size_t length)
Generate a hash value from the given string, trailing zero not included.
Definition: m_hash.cpp:15
void math_matrix_3x3_inverse(const struct xrt_matrix_3x3 *in, struct xrt_matrix_3x3 *result)
Invert Matrix3x3.
Definition: m_base.cpp:736
bool math_quat_validate_within_1_percent(const struct xrt_quat *quat)
Check if this quat is within 1% of unit length.
Definition: m_base.cpp:313
void math_matrix_3x3_f64_transform_vec3_f64(const struct xrt_matrix_3x3_f64 *left, const struct xrt_vec3_f64 *right, struct xrt_vec3_f64 *result_out)
Transform a double vec3 by a 3x3 double matrix.
Definition: m_base.cpp:643
void math_quat_from_swing_twist(const struct xrt_vec2 *swing, const float twist, struct xrt_quat *result)
Converts a 2D vector and a float to a quaternion.
Definition: m_base.cpp:463
void math_matrix_4x4_transform_vec3(const struct xrt_matrix_4x4 *left, const struct xrt_vec3 *right, struct xrt_vec3 *result_out)
Transform a vec3 by a 4x4 matrix, extending the vector with w = 1.0.
Definition: m_base.cpp:695
void math_pose_from_isometry(const struct xrt_matrix_4x4 *transform, struct xrt_pose *result)
Converts a (col-major) isometry into a pose.
Definition: m_base.cpp:928
static float math_quat_dot(const struct xrt_quat *l, const struct xrt_quat *r)
The dot product of 2 quaternions.
Definition: m_api.h:333
void math_quat_from_euler_angles(const struct xrt_vec3 *angles, struct xrt_quat *result)
Create a rotation from euler angles to a quaternion.
Definition: m_base.cpp:218
float math_quat_len(const struct xrt_quat *quat)
The euclidean norm or length of a quaternion.
Definition: m_base.cpp:325
void math_pose_invert(const struct xrt_pose *pose, struct xrt_pose *outPose)
Invert pose.
Definition: m_base.cpp:919
void math_quat_ln(const struct xrt_quat *quat, struct xrt_vec3 *out_axis_angle)
Takes a unit quaternion and returns a rotation vector equal to half of its corresponding Rodrigues ro...
Definition: m_quatexpmap.cpp:180
void math_quat_normalize(struct xrt_quat *inout)
Normalize a quaternion.
Definition: m_base.cpp:331
void math_quat_rotate(const struct xrt_quat *left, const struct xrt_quat *right, struct xrt_quat *result)
Rotate a quaternion (compose rotations).
Definition: m_base.cpp:360
void math_quat_from_angle_vector(float angle_rads, const struct xrt_vec3 *vector, struct xrt_quat *result)
Create a rotation from an angle in radians and a unit vector.
Definition: m_base.cpp:212
bool math_pose_validate(const struct xrt_pose *pose)
Check if this pose can be used in transformation operations.
Definition: m_base.cpp:911
void math_matrix_4x4_inverse(const struct xrt_matrix_4x4 *in, struct xrt_matrix_4x4 *result)
Invert Matrix4x4.
Definition: m_base.cpp:764
void math_pose_interpolate(const struct xrt_pose *a, const struct xrt_pose *b, float t, struct xrt_pose *outPose)
Interpolated pose between poses a and b by lerping position and slerping orientation by t.
Definition: m_base.cpp:936
void math_matrix_3x3_transform_vec3(const struct xrt_matrix_3x3 *left, const struct xrt_vec3 *right, struct xrt_vec3 *result_out)
Transform a vec3 by a 3x3 matrix.
Definition: m_base.cpp:682
void math_matrix_4x4_isometry_from_rt(const struct xrt_matrix_3x3 *rotation, const struct xrt_vec3 *translation, struct xrt_matrix_4x4 *result)
Get an isometry matrix —in SE(3)— from a rotation matrix —SO(3)— and a translation vector.
Definition: m_base.cpp:797
bool math_quat_validate(const struct xrt_quat *quat)
Check if this quat can be used in transformation operations.
Definition: m_base.cpp:306
void math_quat_integrate_velocity(const struct xrt_quat *quat, const struct xrt_vec3 *ang_vel, float dt, struct xrt_quat *result)
Integrate a local angular velocity vector (exponential map) and apply to a quaternion.
Definition: m_quatexpmap.cpp:141
void math_quat_from_matrix_3x3(const struct xrt_matrix_3x3 *mat, struct xrt_quat *result)
Create a rotation from a 3x3 rotation (row major) matrix.
Definition: m_base.cpp:237
void math_matrix_3x3_rotation_from_isometry(const struct xrt_matrix_4x4 *isometry, struct xrt_matrix_3x3 *result)
Get the rotation matrix from an isomertry matrix (col-major).
Definition: m_base.cpp:675
void math_matrix_4x4_multiply(const struct xrt_matrix_4x4 *left, const struct xrt_matrix_4x4 *right, struct xrt_matrix_4x4 *result)
Multiply Matrix4x4.
Definition: m_base.cpp:756
void math_quat_invert(const struct xrt_quat *quat, struct xrt_quat *out_quat)
Invert a quaternion.
Definition: m_base.cpp:319
void math_quat_unrotate(const struct xrt_quat *left, const struct xrt_quat *right, struct xrt_quat *result)
Inverse of math_quat_rotate.
Definition: m_base.cpp:375
bool math_quat_ensure_normalized(struct xrt_quat *inout)
Normalizes a quaternion if it has accumulated float precision errors.
Definition: m_base.cpp:338
void math_matrix_3x3_from_quat(const struct xrt_quat *q, struct xrt_matrix_3x3 *result_out)
Initialize a 3x3 matrix from a quaternion.
Definition: m_base.cpp:617
void math_quat_slerp(const struct xrt_quat *left, const struct xrt_quat *right, float t, struct xrt_quat *result)
Slerp (spherical linear interpolation) between two quaternions.
Definition: m_base.cpp:422
void math_matrix_3x3_f64_from_plus_x_z(const struct xrt_vec3_f64 *plus_x, const struct xrt_vec3_f64 *plus_z, struct xrt_matrix_3x3_f64 *result)
Create a rotation from two vectors plus x and z, by creating a rotation matrix by crossing z and x to...
Definition: m_base.cpp:656
void math_pose_identity(struct xrt_pose *pose)
Somewhat laboriously make an xrt_pose identity.
Definition: m_base.cpp:943
void math_vec3_translation_from_isometry(const struct xrt_matrix_4x4 *isometry, struct xrt_vec3 *result)
Get translation vector from isometry matrix (col-major).
Definition: m_base.cpp:179
void math_matrix_4x4_model(const struct xrt_pose *pose, const struct xrt_vec3 *size, struct xrt_matrix_4x4 *result)
Compute quad layer model matrix from xrt_pose and xrt_vec2 size.
Definition: m_base.cpp:815
void math_vec3_accum(const struct xrt_vec3 *additional, struct xrt_vec3 *inAndOut)
Accumulate a vector by adding in-place.
Definition: m_base.cpp:141
static double math_map_ranges(double value, double from_low, double from_high, double to_low, double to_high)
Map a number from one range to another range.
Definition: m_api.h:834
Wrapper header for <math.h> to ensure pi-related math constants are defined.
Describes a projection matrix fov.
Definition: xrt_defines.h:499
A tightly packed 3x3 matrix of doubles.
Definition: xrt_defines.h:556
A tightly packed 3x3 matrix of floats.
Definition: xrt_defines.h:546
A tightly packed 4x4 matrix of floats.
Definition: xrt_defines.h:573
A pose composed of a position and orientation.
Definition: xrt_defines.h:479
A quaternion with single floats.
Definition: xrt_defines.h:235
A 2 element vector with single floats.
Definition: xrt_defines.h:268
A 3 element vector with single doubles.
Definition: xrt_defines.h:301
A 3 element vector with single floats.
Definition: xrt_defines.h:289
Common defines and enums for XRT.