diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2017-03-28 23:51:27 +0200 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2017-03-28 23:51:27 +0200 | 
| commit | 68b8813965cdead743a70e8ee47458d8f1e21dd4 (patch) | |
| tree | 8f6348420f092889b1f6567b827e001952e8cf46 /tracker-steamvr | |
| parent | f7e66633b3906c90342ff1bd857ab9b3d63dab8e (diff) | |
tracker/steamvr: fix vive rotation order
Submitted-by: @subnet-
Issue: #353
cf.
https://github.com/opentrack/opentrack/issues/352#issuecomment-289306146
The submitter's working on the roll code. sin^1 codomain is +-90
deg. so we better use the equivalent atan2(3) formula.
Diffstat (limited to 'tracker-steamvr')
| -rw-r--r-- | tracker-steamvr/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | tracker-steamvr/dialog.cpp | 5 | ||||
| -rw-r--r-- | tracker-steamvr/dialog.ui | 14 | ||||
| -rw-r--r-- | tracker-steamvr/steamvr.cpp | 49 | ||||
| -rw-r--r-- | tracker-steamvr/steamvr.hpp | 7 | 
5 files changed, 41 insertions, 38 deletions
diff --git a/tracker-steamvr/CMakeLists.txt b/tracker-steamvr/CMakeLists.txt index 36be2f13..512a49ff 100644 --- a/tracker-steamvr/CMakeLists.txt +++ b/tracker-steamvr/CMakeLists.txt @@ -27,8 +27,8 @@ endif()  if(steamvr-dll)      SET(SDK_VALVE_STEAMVR "" CACHE PATH "Valve's SteamVR")      if(SDK_VALVE_STEAMVR) -        otr_module(tracker-steamvr NO-INSTALL) -        #install(FILES "${SDK_VALVE_STEAMVR}/bin/${steamvr-dir}/${steamvr-dll}" DESTINATION "${opentrack-hier-pfx}") +        otr_module(tracker-steamvr) +        install(FILES "${SDK_VALVE_STEAMVR}/bin/${steamvr-dir}/${steamvr-dll}" DESTINATION "${opentrack-hier-pfx}")          target_include_directories(opentrack-tracker-steamvr SYSTEM PUBLIC "${SDK_VALVE_STEAMVR}/headers")          target_link_libraries(opentrack-tracker-steamvr "${SDK_VALVE_STEAMVR}/lib/${steamvr-dir}/${steamvr-lib}") diff --git a/tracker-steamvr/dialog.cpp b/tracker-steamvr/dialog.cpp index 1bfa5bcb..bbb8866d 100644 --- a/tracker-steamvr/dialog.cpp +++ b/tracker-steamvr/dialog.cpp @@ -7,11 +7,6 @@ steamvr_dialog::steamvr_dialog()      connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK()));      connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel())); - -    for (unsigned i = 0; i < 6; i++) -        ui.rotation_order->addItem(QStringLiteral("order #%1").arg(i)); - -    tie_setting(s.order, ui.rotation_order);  }  void steamvr_dialog::doOK() diff --git a/tracker-steamvr/dialog.ui b/tracker-steamvr/dialog.ui index 7a5b2f48..9d3b1e85 100644 --- a/tracker-steamvr/dialog.ui +++ b/tracker-steamvr/dialog.ui @@ -9,8 +9,8 @@     <rect>      <x>0</x>      <y>0</y> -    <width>243</width> -    <height>67</height> +    <width>281</width> +    <height>66</height>     </rect>    </property>    <property name="sizePolicy"> @@ -33,9 +33,6 @@     <bool>false</bool>    </property>    <layout class="QGridLayout" name="gridLayout_2"> -   <item row="0" column="0"> -    <widget class="QComboBox" name="rotation_order"/> -   </item>     <item row="1" column="0">      <widget class="QDialogButtonBox" name="buttonBox">       <property name="sizePolicy"> @@ -49,6 +46,13 @@       </property>      </widget>     </item> +   <item row="0" column="0"> +    <widget class="QLabel" name="label"> +     <property name="text"> +      <string>No settings necessary</string> +     </property> +    </widget> +   </item>    </layout>   </widget>   <resources/> diff --git a/tracker-steamvr/steamvr.cpp b/tracker-steamvr/steamvr.cpp index e6e9952b..93f81f00 100644 --- a/tracker-steamvr/steamvr.cpp +++ b/tracker-steamvr/steamvr.cpp @@ -4,7 +4,6 @@  #include <cstdlib>  #include <cmath> -#include <algorithm>  #include <QMessageBox>  #include <QDebug> @@ -54,7 +53,7 @@ void steamvr::start_tracker(QFrame*)      if (!vr)      {          QMessageBox::warning(nullptr, -                             QCoreApplication::translate("steamvr", "Valve SteamVR init error"), strerror(e), +                             tr("Valve SteamVR init error"), strerror(e),                               QMessageBox::Close, QMessageBox::NoButton);          return;      } @@ -71,8 +70,8 @@ void steamvr::start_tracker(QFrame*)      if (!ok)      {          QMessageBox::warning(nullptr, -                             QCoreApplication::translate("steamvr", "Valve SteamVR init warning"), -                             QCoreApplication::translate("steamvr", "No HMD connected"), +                             tr("Valve SteamVR init warning"), +                             tr("No HMD connected"),                               QMessageBox::Close, QMessageBox::NoButton);          return;      } @@ -87,41 +86,47 @@ void steamvr::data(double* data)          vr->GetDeviceToAbsoluteTrackingPose(vr::ETrackingUniverseOrigin::TrackingUniverseSeated, 0,                                              devices, vr::k_unMaxTrackedDeviceCount); -        bool done = false; -          for (unsigned k = 0; k < vr::k_unMaxTrackedDeviceCount; k++)          { -            using namespace euler; -              if (!devices[k].bPoseIsValid)                  continue;              if (vr->GetTrackedDeviceClass(k) != vr::ETrackedDeviceClass::TrackedDeviceClass_HMD)                  continue; -            const auto& result = devices[k].mDeviceToAbsoluteTracking; +            const vr::HmdMatrix34_t& result = devices[k].mDeviceToAbsoluteTracking; -            static constexpr double c[3] { -1, 1, -1 }; +            int c = 10; -            for (unsigned i = 0; i < 3; i++) -                data[i] = double(result.m[i][3]) * c[i] * 100; +            data[TX] = -result.m[0][3] * c; +            data[TY] = result.m[1][3] * c; +            data[TZ] = result.m[2][3] * c;              using std::atan2;              using std::asin; -            //const euler_t rot = get_ypr(s.order); - -            static constexpr double r2d = 180/M_PI; +            // transformation matrix to euler angles +            if (result.m[0][0] == 1.0f || result.m[0][0] == -1.0f) +            { +                data[Yaw] = -atan2(result.m[0][2], result.m[2][3]); +                data[Pitch] = 0; +                data[Roll] = 0; +            } +            else +            { +                data[Yaw] = -atan2(-result.m[2][0], result.m[0][0]); +                data[Pitch] = atan2(-result.m[1][2], result.m[1][1]); +                data[Roll] = asin(result.m[1][0]); +            } + +            static constexpr double r2d = 180 / M_PI; + +            data[Yaw] *= r2d; +            data[Pitch] *= r2d; +            data[Roll] *= r2d; -            //for (unsigned i = 3; i < 6; i++) -            //    data[i] = r2d * rot[i]; - -            done = true;              break;          } - -        if (!done) -            qDebug() << "steamvr: no device with pose found";      }  } diff --git a/tracker-steamvr/steamvr.hpp b/tracker-steamvr/steamvr.hpp index 4a2bd117..5546d619 100644 --- a/tracker-steamvr/steamvr.hpp +++ b/tracker-steamvr/steamvr.hpp @@ -20,15 +20,14 @@ using namespace options;  struct settings : opts  { -    value<int> order;      settings() : -        opts("valve-steamvr"), -        order(b, "rotation-order", 0) +        opts("valve-steamvr")      {}  }; -class steamvr : public ITracker +class steamvr : public QObject, public ITracker  { +    Q_OBJECT  public:      steamvr();      ~steamvr() override;  | 
