diff options
| author | GO63-samara <go1@list.ru> | 2021-07-31 02:38:25 +0400 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2021-08-18 19:47:13 +0200 | 
| commit | c5a652e9ad60f1ab0ee586d578daa0be79359b28 (patch) | |
| tree | 310e2ea5460e8702cc5dec9b96e7031b94fde0a0 /logic | |
| parent | 2fc5d7b3490e41952e0e335841d7d7f72a3b76a9 (diff) | |
Adding a choice of centering method
Diffstat (limited to 'logic')
| -rw-r--r-- | logic/main-settings.hpp | 10 | ||||
| -rw-r--r-- | logic/pipeline.cpp | 72 | ||||
| -rw-r--r-- | logic/pipeline.hpp | 10 | 
3 files changed, 70 insertions, 22 deletions
| diff --git a/logic/main-settings.hpp b/logic/main-settings.hpp index 8fef7ea7..0795bca4 100644 --- a/logic/main-settings.hpp +++ b/logic/main-settings.hpp @@ -22,6 +22,14 @@ enum reltrans_state      reltrans_non_center = 2,  }; +enum centering_state +{ +    center_disabled         = 0, +    center_point            = 1, +    center_vr360            = 2, +    center_roll_compensated = 3, +}; +  namespace main_settings_impl {  using namespace options; @@ -65,7 +73,7 @@ struct OTR_LOGIC_EXPORT main_settings final      value<bool> tray_start { b, "start-in-tray", false };      value<bool> center_at_startup { b, "center-at-startup", true }; -    //value<int> center_method; +    value<centering_state> centering_mode { b, "centering-mode", center_roll_compensated };;      value<int> neck_z { b, "neck-depth", 0 };      value<bool> neck_enable { b, "neck-enable", false }; diff --git a/logic/pipeline.cpp b/logic/pipeline.cpp index 39c75e99..f8827b7e 100644 --- a/logic/pipeline.cpp +++ b/logic/pipeline.cpp @@ -272,7 +272,7 @@ bool pipeline::maybe_enable_center_on_tracking_started()      return false;  } -void pipeline::maybe_set_center_pose(const Pose& value, bool own_center_logic) +void pipeline::maybe_set_center_pose(const centering_state mode, const Pose& value, bool own_center_logic)  {      if (b.get(f_center | f_held_center))      { @@ -283,28 +283,66 @@ void pipeline::maybe_set_center_pose(const Pose& value, bool own_center_logic)          if (own_center_logic)          { -            center.inv_R = rmat::eye(); -            center.T = {}; +            center.P  = {}; +            center.QC = QQuaternion(1,0,0,0); +            center.QR = QQuaternion(1,0,0,0);          }          else          { -            center.inv_R = euler_to_rmat(Pose_(&value[Yaw]) * (M_PI / 180)).t(); -            center.T = Pose_(&value[TX]); +            if (mode) +            { +                center.P  = value; +                center.QC = QQuaternion::fromEulerAngles(value[Pitch], value[Yaw], -value[Roll]).conjugated(); +                center.QR = QQuaternion::fromEulerAngles(value[Pitch], value[Yaw], 0).conjugated(); +            } +            else +            { +                // To reset the centering coordinates +                // just select "Centering method [Disabled]" and then press [Center] button +                center.P  = {}; +                center.QC = QQuaternion(1,0,0,0); +                center.QR = QQuaternion(1,0,0,0); +            }          }      }  } -Pose pipeline::apply_center(Pose value) const +Pose pipeline::apply_center(const centering_state mode, Pose value) const  { -    { -        for (unsigned k = 0; k < 3; k++) -            value(k) -= center.T(k); - -        Pose_ rot = rmat_to_euler( -            euler_to_rmat(Pose_(&value[Yaw]) * (M_PI / 180)) * center.inv_R -        ); -        for (unsigned k = 0; k < 3; k++) -            value(k+3) = rot(k) * 180 / M_PI; +    if (mode != center_disabled) +	{ +        for (unsigned k = TX; k <= TZ; k++) +            value(k) -= center.P(k); + +        QQuaternion q; +        QVector3D v; + +        switch (mode) +        { +        case center_point: +            for (unsigned k = Yaw; k <= Roll; k++) +            { +                value(k) -= center.P(k); +                if (fabs(value[k]) > 180) value[k] -= copysign(360, value[k]); +            } +            break; +        case center_vr360: +            q = QQuaternion::fromEulerAngles(value[Pitch], value[Yaw], -value[Roll]); +            q = center.QC * q; +            v = q.toEulerAngles(); +            value[Pitch] =  v.x(); +            value[Yaw]   =  v.y(); +            value[Roll]  = -v.z(); +            break; +        case center_roll_compensated: +            q = QQuaternion::fromEulerAngles(value[Pitch], value[Yaw], center.P[Roll] - value[Roll]); +            q = center.QR * q; +            v = q.toEulerAngles(); +            value[Pitch] =  v.x(); +            value[Yaw]   =  v.y(); +            value[Roll]  = -v.z(); +            break; +        }      }      for (int i = 0; i < 6; i++) @@ -407,8 +445,8 @@ void pipeline::logic()      {          maybe_enable_center_on_tracking_started(); -        maybe_set_center_pose(value, own_center_logic); -        value = apply_center(value); +        maybe_set_center_pose(s.centering_mode, value, own_center_logic); +        value = apply_center(s.centering_mode, value);          // "corrected" - after various transformations to account for camera position          logger.write_pose(value); diff --git a/logic/pipeline.hpp b/logic/pipeline.hpp index fc1f2060..80d4d8a7 100644 --- a/logic/pipeline.hpp +++ b/logic/pipeline.hpp @@ -20,6 +20,7 @@  #include <atomic>  #include <cmath> +#include <QQuaternion>  #include "export.hpp" @@ -99,8 +100,9 @@ class OTR_LOGIC_EXPORT pipeline : private QThread      reltrans rel;      struct { -        rmat inv_R = rmat::eye(); -        Pose_ T; +		Pose P; +		QQuaternion QC = QQuaternion(1,0,0,0); +		QQuaternion QR = QQuaternion(1,0,0,0);      } center;      time_units::ms backlog_time {}; @@ -111,8 +113,8 @@ class OTR_LOGIC_EXPORT pipeline : private QThread      void logic();      void run() override;      bool maybe_enable_center_on_tracking_started(); -    void maybe_set_center_pose(const Pose& value, bool own_center_logic); -    Pose apply_center(Pose value) const; +    void maybe_set_center_pose(const centering_state mode, const Pose& value, bool own_center_logic); +    Pose apply_center(const centering_state mode, Pose value) const;      std::tuple<Pose, Pose, vec6_bool> get_selected_axis_values(const Pose& newpose) const;      Pose maybe_apply_filter(const Pose& value) const;      Pose apply_reltrans(Pose value, vec6_bool disabled, bool centerp); | 
