diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2016-12-28 06:31:05 +0100 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-12-28 06:31:05 +0100 | 
| commit | 4f390f6c8f5c58babd8bc9db13b12cc0b1949cae (patch) | |
| tree | d64c8376209f254acedd5f09a807af3592af9b4a /tracker-steamvr | |
| parent | 9f163b82da3ddb08d312d5e935d9792225ac2c69 (diff) | |
tracker/steamvr: add untested geometry code
Diffstat (limited to 'tracker-steamvr')
| -rw-r--r-- | tracker-steamvr/CMakeLists.txt | 7 | ||||
| -rw-r--r-- | tracker-steamvr/steamvr.cpp | 58 | ||||
| -rw-r--r-- | tracker-steamvr/steamvr.hpp | 7 | 
3 files changed, 47 insertions, 25 deletions
diff --git a/tracker-steamvr/CMakeLists.txt b/tracker-steamvr/CMakeLists.txt index db058e31..48848fa6 100644 --- a/tracker-steamvr/CMakeLists.txt +++ b/tracker-steamvr/CMakeLists.txt @@ -27,11 +27,8 @@ endif()  if(steamvr-dll)      SET(SDK_VALVE_STEAMVR "" CACHE PATH "Valve's SteamVR")      if(SDK_VALVE_STEAMVR) -        set(porked NO-INSTALL) -        opentrack_boilerplate(opentrack-tracker-steamvr ${porked}) -        if(NOT porked) -            install(FILES "${SDK_VALVE_STEAMVR}/bin/${steamvr-dir}/${steamvr-dll}" DESTINATION "${opentrack-hier-pfx}") -        endif() +        opentrack_boilerplate(opentrack-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/steamvr.cpp b/tracker-steamvr/steamvr.cpp index bab98f0d..9ceb5db2 100644 --- a/tracker-steamvr/steamvr.cpp +++ b/tracker-steamvr/steamvr.cpp @@ -2,10 +2,10 @@  #include "steamvr.hpp"  #include "api/plugin-api.hpp"  #include "compat/util.hpp" -#include "compat/euler.hpp"  #include <cstdlib>  #include <cmath> +#include <algorithm>  #include <QMessageBox>  #include <QDebug> @@ -79,16 +79,39 @@ void steamvr::start_tracker(QFrame*)      }  } +quat steamvr::get_quaternion(const vr::HmdMatrix34_t& r) +{ +    using std::max; +    using std::sqrt; +    using std::acos; + +    const auto& m = r.m; + +    float qw = sqrt(max(0.f, 1 + m[0][0] + m[1][1] + m[2][2])) / 2; +    float qx = sqrt(max(0.f, 1 + m[0][0] - m[1][1] - m[2][2])) / 2; +    float qy = sqrt(max(0.f, 1 - m[0][0] + m[1][1] - m[2][2])) / 2; +    float qz = sqrt(max(0.f, 1 - m[0][0] - m[1][1] + m[2][2])) / 2; +    qx = (m[1][2] - m[2][1]) < 0 ? -qx : qx; +    qy = (m[2][0] - m[0][2]) < 0 ? -qy : qy; +    qz = (m[0][1] - m[1][0]) < 0 ? -qz : qz; + +    float s = sqrt(1 - qw * qw); +    s = s < .001 ? 1 : s; + +    return quat(2 * acos(qw), qx/s, qy/s, qz/s); +} +  void steamvr::data(double* data)  {      if (vr)      { -        using m = float[3][4];          vr::TrackedDevicePose_t devices[vr::k_unMaxTrackedDeviceCount] = {};          vr->GetDeviceToAbsoluteTrackingPose(vr::ETrackingUniverseOrigin::TrackingUniverseStanding, 0,                                              devices, vr::k_unMaxTrackedDeviceCount); +        bool done = false; +          for (unsigned k = 0; k < vr::k_unMaxTrackedDeviceCount; k++)          {              using namespace euler; @@ -99,34 +122,29 @@ void steamvr::data(double* data)              if (vr->GetTrackedDeviceClass(k) != vr::ETrackedDeviceClass::TrackedDeviceClass_HMD)                  continue; -            const m& M = devices[k].mDeviceToAbsoluteTracking.m; +            const auto& result = devices[k].mDeviceToAbsoluteTracking;              static constexpr double c[3] { -1, 1, -1 };              for (unsigned i = 0; i < 3; i++) -                data[i] = double(M[i][3]) * c[i] * 100; - -            static constexpr unsigned indices[3] = {Roll, Yaw, Pitch}; +                data[i] = double(result.m[i][3]) * c[i] * 100; -            rmat r(M[0][0], M[1][0], M[2][0], -                   M[0][1], M[1][1], M[2][1], -                   M[0][2], M[1][2], M[2][2]); +            const quat q = get_quaternion(result); +            static constexpr double r2d = 180/M_PI; -            euler_t ypr(rmat_to_euler(r)); +            using std::atan2; +            using std::asin; -            for (unsigned i = 0; i < 3; i++) -                data[indices[i]] = 180/M_PI * ypr(i); +            data[Roll]  = r2d * atan2(2*(q(0)*q(1) + q(2)*q(3)), 1 - 2*(q(1)*q(1) + q(2)*q(2))); +            data[Pitch] = r2d * asin(2*(q(0)*q(2) - q(3)*q(1))); +            data[Yaw]   = r2d * atan2(2*(q(0)*q(3) + q(1)*q(2)), 1 - 2*(q(2)*q(2) + q(3)*q(3))); -            for (unsigned i = 0; i < 3; i++) -                data[i+3] *= c[i]; - -            goto done; +            done = true; +            break;          } -        qDebug() << "steamvr: no device with pose found"; - -done: -        (void)0; // expects statement after label +        if (!done) +            qDebug() << "steamvr: no device with pose found";      }  } diff --git a/tracker-steamvr/steamvr.hpp b/tracker-steamvr/steamvr.hpp index 9b53979e..1adb40b1 100644 --- a/tracker-steamvr/steamvr.hpp +++ b/tracker-steamvr/steamvr.hpp @@ -4,6 +4,8 @@  #include "compat/util.hpp"  #include "options/options.hpp" +#include "compat/euler.hpp" +  #include <openvr.h>  #include <atomic> @@ -16,6 +18,8 @@  using namespace options; +using quat = Mat<float, 4, 1>; +  struct settings : opts  {      settings() : opts("valve-steamvr") {} @@ -29,12 +33,15 @@ public:      void start_tracker(QFrame *) override;      void data(double *data) override;  private: +      using error_t = vr::EVRInitError;      using vr_t = vr::IVRSystem*;      vr_t vr;      settings s; + +    static quat get_quaternion(const vr::HmdMatrix34_t& r);      static void vr_deleter();      static vr_t vr_init(error_t& error);      static QString strerror(error_t error);  | 
