diff options
| -rw-r--r-- | gui/lang/nl_NL.ts | 16 | ||||
| -rw-r--r-- | gui/lang/ru_RU.ts | 16 | ||||
| -rw-r--r-- | gui/lang/stub.ts | 16 | ||||
| -rw-r--r-- | gui/lang/zh_CN.ts | 16 | ||||
| -rw-r--r-- | gui/settings-dialog.ui | 85 | ||||
| -rw-r--r-- | gui/settings.cpp | 10 | ||||
| -rw-r--r-- | logic/main-settings.hpp | 10 | ||||
| -rw-r--r-- | logic/pipeline.cpp | 72 | ||||
| -rw-r--r-- | logic/pipeline.hpp | 10 | 
9 files changed, 220 insertions, 31 deletions
diff --git a/gui/lang/nl_NL.ts b/gui/lang/nl_NL.ts index 60b84189..59d46b82 100644 --- a/gui/lang/nl_NL.ts +++ b/gui/lang/nl_NL.ts @@ -360,6 +360,22 @@ Press "clear calibration" to remove any calibration data pertaining to          <source>None</source>          <translation type="unfinished">Geen</translation>      </message> +    <message> +        <source>Centering method</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Point</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Wireless VR 360</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Roll compensated VR 360</source> +        <translation type="unfinished"></translation> +    </message>  </context>  <context>      <name>process_detector</name> diff --git a/gui/lang/ru_RU.ts b/gui/lang/ru_RU.ts index d40b4775..8f3c360a 100644 --- a/gui/lang/ru_RU.ts +++ b/gui/lang/ru_RU.ts @@ -363,6 +363,22 @@ Press "clear calibration" to remove any calibration data pertaining to          <source>None</source>          <translation>Не назначена</translation>      </message> +    <message> +        <source>Centering method</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Point</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Wireless VR 360</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Roll compensated VR 360</source> +        <translation type="unfinished"></translation> +    </message>  </context>  <context>      <name>process_detector</name> diff --git a/gui/lang/stub.ts b/gui/lang/stub.ts index b383a0d8..9dd07851 100644 --- a/gui/lang/stub.ts +++ b/gui/lang/stub.ts @@ -360,6 +360,22 @@ Press "clear calibration" to remove any calibration data pertaining to          <source>None</source>          <translation type="unfinished"></translation>      </message> +    <message> +        <source>Centering method</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Point</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Wireless VR 360</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Roll compensated VR 360</source> +        <translation type="unfinished"></translation> +    </message>  </context>  <context>      <name>process_detector</name> diff --git a/gui/lang/zh_CN.ts b/gui/lang/zh_CN.ts index fa2d512c..a88251ce 100644 --- a/gui/lang/zh_CN.ts +++ b/gui/lang/zh_CN.ts @@ -361,6 +361,22 @@ Press "clear calibration" to remove any calibration data pertaining to          <source>None</source>          <translation>空</translation>      </message> +    <message> +        <source>Centering method</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Point</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Wireless VR 360</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Roll compensated VR 360</source> +        <translation type="unfinished"></translation> +    </message>  </context>  <context>      <name>process_detector</name> diff --git a/gui/settings-dialog.ui b/gui/settings-dialog.ui index 6333692a..93374b06 100644 --- a/gui/settings-dialog.ui +++ b/gui/settings-dialog.ui @@ -7,7 +7,7 @@      <x>0</x>      <y>0</y>      <width>548</width> -    <height>599</height> +    <height>600</height>     </rect>    </property>    <property name="windowTitle"> @@ -812,29 +812,39 @@            <enum>QFrame::Sunken</enum>           </property>           <layout class="QGridLayout" name="gridLayout_2"> -          <item row="0" column="0"> -           <widget class="QCheckBox" name="center_at_startup"> +          <item row="1" column="0"> +           <widget class="QCheckBox" name="disable_translation">              <property name="sizePolicy"> -             <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> +             <sizepolicy hsizetype="Maximum" vsizetype="Maximum">                <horstretch>0</horstretch>                <verstretch>0</verstretch>               </sizepolicy>              </property>              <property name="text"> -             <string>Center at startup</string> +             <string>Never translate the application interface</string>              </property>             </widget>            </item> -          <item row="1" column="0"> -           <widget class="QCheckBox" name="disable_translation"> +          <item row="0" column="1"> +           <widget class="QLabel" name="label_18"> +            <property name="text"> +             <string>Centering method</string> +            </property> +            <property name="alignment"> +             <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> +            </property> +           </widget> +          </item> +          <item row="0" column="0"> +           <widget class="QCheckBox" name="center_at_startup">              <property name="sizePolicy"> -             <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> +             <sizepolicy hsizetype="Minimum" vsizetype="Maximum">                <horstretch>0</horstretch>                <verstretch>0</verstretch>               </sizepolicy>              </property>              <property name="text"> -             <string>Never translate the application interface</string> +             <string>Center at startup</string>              </property>             </widget>            </item> @@ -848,6 +858,39 @@              </property>             </widget>            </item> +          <item row="0" column="2"> +           <widget class="QComboBox" name="cbox_centering"> +            <property name="sizePolicy"> +             <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> +              <horstretch>4</horstretch> +              <verstretch>0</verstretch> +             </sizepolicy> +            </property> +            <property name="currentIndex"> +             <number>3</number> +            </property> +            <item> +             <property name="text"> +              <string>Disabled</string> +             </property> +            </item> +            <item> +             <property name="text"> +              <string>Point</string> +             </property> +            </item> +            <item> +             <property name="text"> +              <string>Wireless VR 360</string> +             </property> +            </item> +            <item> +             <property name="text"> +              <string>Roll compensated VR 360</string> +             </property> +            </item> +           </widget> +          </item>           </layout>          </widget>         </item> @@ -1569,9 +1612,15 @@               </item>               <item row="0" column="2">                <widget class="QLabel" name="label_4"> +               <property name="layoutDirection"> +                <enum>Qt::LeftToRight</enum> +               </property>                 <property name="text">                  <string>X</string>                 </property> +               <property name="alignment"> +                <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> +               </property>                </widget>               </item>               <item row="0" column="3"> @@ -1601,6 +1650,9 @@                 <property name="text">                  <string>Pitch</string>                 </property> +               <property name="alignment"> +                <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> +               </property>                </widget>               </item>               <item row="1" column="2"> @@ -1608,6 +1660,9 @@                 <property name="text">                  <string>Y</string>                 </property> +               <property name="alignment"> +                <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> +               </property>                </widget>               </item>               <item row="1" column="1"> @@ -1637,6 +1692,9 @@                 <property name="text">                  <string>Z</string>                 </property> +               <property name="alignment"> +                <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> +               </property>                </widget>               </item>               <item row="2" column="0"> @@ -1644,6 +1702,9 @@                 <property name="text">                  <string>Roll</string>                 </property> +               <property name="alignment"> +                <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> +               </property>                </widget>               </item>               <item row="1" column="3"> @@ -1673,6 +1734,9 @@                 <property name="text">                  <string>Yaw</string>                 </property> +               <property name="alignment"> +                <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> +               </property>                </widget>               </item>               <item row="0" column="1"> @@ -1808,6 +1872,9 @@                   <verstretch>0</verstretch>                  </sizepolicy>                 </property> +               <property name="currentIndex"> +                <number>0</number> +               </property>                 <item>                  <property name="text">                   <string>Disabled</string> diff --git a/gui/settings.cpp b/gui/settings.cpp index 3851f0c2..cef93d19 100644 --- a/gui/settings.cpp +++ b/gui/settings.cpp @@ -59,6 +59,16 @@ options_dialog::options_dialog(std::function<void(bool)> pause_keybindings) :      tie_setting(main.center_at_startup, ui.center_at_startup); +    const centering_state centering_modes[] = { +        center_disabled, +        center_point, +        center_vr360, +        center_roll_compensated, +    }; +    for (unsigned k = 0; k < 4; k++) +        ui.cbox_centering->setItemData(k, int(centering_modes[k])); +    tie_setting(main.centering_mode, ui.cbox_centering); +      const reltrans_state reltrans_modes[] = {          reltrans_disabled,          reltrans_enabled, 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);  | 
