diff options
| -rw-r--r-- | opentrack-logic/tracker.cpp | 57 | ||||
| -rw-r--r-- | opentrack-logic/tracker.h | 5 | 
2 files changed, 33 insertions, 29 deletions
| diff --git a/opentrack-logic/tracker.cpp b/opentrack-logic/tracker.cpp index f67c26b0..a1f206a1 100644 --- a/opentrack-logic/tracker.cpp +++ b/opentrack-logic/tracker.cpp @@ -61,14 +61,14 @@ double Tracker::map(double pos, Mapping& axis)      return fc.getValue(pos);  } -void Tracker::t_compensate(const rmat& rmat, const euler_t& xyz, euler_t& output, bool rz) +void Tracker::t_compensate(const rmat& rmat, const euler_t& xyz_, euler_t& output, bool rz)  {      // TY is really yaw axis. need swapping accordingly. -    const dmat<3, 1> ret = rmat * xyz; +    const euler_t ret = rmat * euler_t(xyz_(TZ), -xyz_(TX), -xyz_(TY));      if (!rz)          output(2) = ret(0);      else -        output(2) = xyz(2); +        output(2) = xyz_(2);      output(1) = -ret(2);      output(0) = -ret(1);  } @@ -148,7 +148,7 @@ void Tracker::logic()      euler_t t(value(0), value(1), value(2));      bool do_center_now = false; -    const bool nan = is_nan(r, t); +    bool nan = is_nan(r, t);      if (centerp && !nan)      { @@ -176,23 +176,22 @@ void Tracker::logic()      }      { -        rmat m_;          switch (s.center_method)          {          // inertial          case 0:          default: -            m_ = r * r_b; +            r = r * r_b;              break;          // camera          case 1:              euler_t degs = rmat_to_euler(r_b * r);              degs(2) = rmat_to_euler(r * r_b)(2); -            m_ = euler_to_rmat(degs); +            r = euler_to_rmat(degs);              break;          } -        const euler_t euler = r2d * rmat_to_euler(m_); +        const euler_t euler = r2d * rmat_to_euler(r);          euler_t tmp(t(0) - t_b[0], t(1) - t_b[1], t(2) - t_b[2]); @@ -208,11 +207,10 @@ void Tracker::logic()          }      } -    bool nan_ = false;      // whenever something can corrupt its internal state due to nan/inf, elide the call      if (is_nan(value))      { -        nan_ = true; +        nan = true;      }      else      { @@ -223,37 +221,42 @@ void Tracker::logic()                  libs.pFilter->filter(tmp, value);          } -        for (int i = 0; i < 6; i++) +        // CAVEAT rotation only, due to tcomp +        for (int i = 3; i < 6; i++)              value(i) = map(value(i), m(i)); -        if (s.tcomp_p) -        { -            euler_t value_(value(Yaw) * d2r, -                           value(Pitch) * d2r, -                           value(Roll) * d2r); -            t_compensate(euler_to_rmat(&value_[0]), -                         value_, -                         value_, -                         s.tcomp_tz); -            for (int i = 0; i < 3; i++) -                value(i) = value_(i); -        } -          for (int i = 0; i < 6; i++)              value(i) += m(i).opts.zero;          for (int i = 0; i < 6; i++) -            value(i) *= inverts[i] ? -1. : 1.; +            value(i) *= int(inverts[i]) * -2 + 1;          if (zero_)              for (int i = 0; i < 6; i++)                  value(i) = 0;          if (is_nan(value)) -            nan_ = true; +            nan = true; +    } + +    if (s.tcomp_p) +    { +        euler_t value_(value(TX), value(TY), value(TZ)); +        t_compensate(euler_to_rmat(euler_t(value(Yaw) * d2r, value(Pitch) * d2r, value(Roll) * d2r)), +                     value_, +                     value_, +                     s.tcomp_tz); +        if (is_nan(r, value_)) +            nan = true; +        for (int i = 0; i < 3; i++) +            value(i) = value_(i);      } -    if (nan_) +    // CAVEAT translation only, due to tcomp +    for (int i = 0; i < 3; i++) +        value(i) = map(value(i), m(i)); + +    if (nan)      {          value = last_mapped; diff --git a/opentrack-logic/tracker.h b/opentrack-logic/tracker.h index 96fac439..a6752d14 100644 --- a/opentrack-logic/tracker.h +++ b/opentrack-logic/tracker.h @@ -36,6 +36,7 @@ private:      double axes[6];  public:      Pose() : axes {0,0,0, 0,0,0} {} +    Pose(double x, double y, double z, double yaw, double pitch, double roll) : axes { x, y, z, yaw, pitch, roll } {}      inline operator double*() { return axes; }      inline operator const double*() const { return axes; } @@ -74,8 +75,8 @@ private:      void run() override;      static constexpr double pi = OPENTRACK_PI; -    static constexpr double r2d = 180. / pi; -    static constexpr double d2r = pi / 180.; +    static constexpr double r2d = 180. / OPENTRACK_PI; +    static constexpr double d2r = OPENTRACK_PI / 180.;  public:      Tracker(Mappings& m, SelectedLibraries& libs);      ~Tracker(); | 
