diff options
-rw-r--r-- | opentrack/tracker.cpp | 34 |
1 files changed, 14 insertions, 20 deletions
diff --git a/opentrack/tracker.cpp b/opentrack/tracker.cpp index ccb2276d..7a6f908a 100644 --- a/opentrack/tracker.cpp +++ b/opentrack/tracker.cpp @@ -48,22 +48,24 @@ double Tracker::map(double pos, bool invertp, Mapping& axis) return fc.getValue(pos) + axis.opts.zero; } +static constexpr int x = 1, y = 0, z = 2; + // http://stackoverflow.com/a/18436193 static cv::Vec3d rmat_to_euler(const cv::Matx33d& R) { const double beta = atan2( -R(2,0), sqrt(R(2,1)*R(2,1) + R(2,2)*R(2,2)) ); const double alpha = atan2( R(1,0), R(0,0)); const double gamma = atan2( R(2,1), R(2,2)); - return cv::Vec3d { alpha, beta, gamma }; + return cv::Vec3d { gamma, alpha, beta }; } // tait-bryan angles, not euler static cv::Matx33d euler_to_rmat(const double* input) { static constexpr double pi = 3.141592653; - const auto H = input[0] * pi / 180; - const auto P = input[1] * pi / 180; - const auto B = input[2] * pi / 180; + const auto H = input[x] * pi / 180; + const auto P = input[y] * pi / 180; + const auto B = input[z] * pi / 180; const auto c1 = cos(H); const auto s1 = sin(H); @@ -73,18 +75,10 @@ static cv::Matx33d euler_to_rmat(const double* input) const auto s3 = sin(B); double foo[] = { - // 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 + //Tait-Bryan ZXY + c1*c3 - s1*s2*s3, -c2*s1, c1*s3+c3*s1*s2, + c3*s1+c1*s2*s3, c1*c2, s1*s3-c1*c3*s2, + -c2*s3, s2, c2*c3 }; return cv::Matx33d(foo); @@ -92,13 +86,13 @@ static cv::Matx33d euler_to_rmat(const double* input) void Tracker::t_compensate(const cv::Matx33d& rmat, const double* xyz, double* output, bool rz) { - const double xyz_[3] = { xyz[2], -xyz[0], -xyz[1] }; + const double xyz_[3] = { xyz[x], -xyz[y], xyz[z] }; cv::Matx31d tvec(xyz_); const cv::Matx31d ret = rmat * tvec; if (!rz) - output[2] = ret(0, 0); - output[0] = -ret(1, 0); - output[1] = -ret(2, 0); + output[2] = ret(z, 0); + output[1] = -ret(y, 0); + output[0] = ret(x, 0); } void Tracker::logic() |