summaryrefslogtreecommitdiffhomepage
path: root/compat/euler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'compat/euler.cpp')
-rw-r--r--compat/euler.cpp59
1 files changed, 37 insertions, 22 deletions
diff --git a/compat/euler.cpp b/compat/euler.cpp
index e9789bee..44b34f90 100644
--- a/compat/euler.cpp
+++ b/compat/euler.cpp
@@ -2,38 +2,53 @@
#include "math-imports.hpp"
#include <cmath>
-// rotation order is XYZ
-
namespace euler {
euler_t OTR_COMPAT_EXPORT rmat_to_euler(const rmat& R)
{
- double alpha, beta, gamma;
-
- beta = atan2( -R(2,0), sqrt(R(2,1)*R(2,1) + R(2,2)*R(2,2)) );
- alpha = atan2( R(1,0), R(0,0));
- gamma = atan2( R(2,1), R(2,2));
-
- return { alpha, beta, gamma };
+ const double cy = sqrt(R(2,2)*R(2, 2) + R(2, 1)*R(2, 1));
+ const bool large_enough = cy > 1e-10;
+ if (large_enough)
+ return {
+ atan2(-R(1, 0), R(0, 0)),
+ atan2(R(2, 0), cy),
+ atan2(-R(2, 1), R(2, 2))
+ };
+ else
+ return {
+ atan2(R(0, 1), R(1, 1)),
+ atan2(R(2, 0), cy),
+ 0
+ };
}
-rmat OTR_COMPAT_EXPORT euler_to_rmat(const euler_t& e)
+// tait-bryan angles, not euler
+rmat OTR_COMPAT_EXPORT euler_to_rmat(const euler_t& input)
{
- const double X = -e(2);
- const double Y = -e(1);
- const double Z = -e(0);
+ const double H = -input(0);
+ const double P = -input(1);
+ const double B = -input(2);
- const double cx = cos(X);
- const double sx = sin(X);
- const double cy = cos(Y);
- const double sy = sin(Y);
- const double cz = cos(Z);
- const double sz = sin(Z);
+ const auto c1 = cos(H);
+ const auto s1 = sin(H);
+ const auto c2 = cos(P);
+ const auto s2 = sin(P);
+ const auto c3 = cos(B);
+ const auto s3 = sin(B);
return {
- cy*cz, -cy*sz, sy,
- cz*sx*sy + cx*sz, cx*cz - sx*sy*sz, -cy*sx,
- -cx*cz*sy + sx*sz, cz*sx + cx*sy*sz, cx*cy,
+ // z
+ c1*c2,
+ c1*s2*s3 - c3*s1,
+ s1*s3 + c1*c3*s2,
+ // y
+ c2*s1,
+ c1*c3 + s1*s2*s3,
+ c3*s1*s2 - c1*s3,
+ // x
+ -s2,
+ c2*s3,
+ c2*c3
};
}