diff options
-rw-r--r-- | tracker-steamvr/dialog.cpp | 5 | ||||
-rw-r--r-- | tracker-steamvr/dialog.ui | 14 | ||||
-rw-r--r-- | tracker-steamvr/steamvr.cpp | 36 | ||||
-rw-r--r-- | tracker-steamvr/steamvr.hpp | 12 |
4 files changed, 25 insertions, 42 deletions
diff --git a/tracker-steamvr/dialog.cpp b/tracker-steamvr/dialog.cpp index bbb8866d..1bfa5bcb 100644 --- a/tracker-steamvr/dialog.cpp +++ b/tracker-steamvr/dialog.cpp @@ -7,6 +7,11 @@ 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 c3fa36c0..7a5b2f48 100644 --- a/tracker-steamvr/dialog.ui +++ b/tracker-steamvr/dialog.ui @@ -9,8 +9,8 @@ <rect> <x>0</x> <y>0</y> - <width>184</width> - <height>58</height> + <width>243</width> + <height>67</height> </rect> </property> <property name="sizePolicy"> @@ -33,6 +33,9 @@ <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"> @@ -46,13 +49,6 @@ </property> </widget> </item> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>No options so far</string> - </property> - </widget> - </item> </layout> </widget> <resources/> diff --git a/tracker-steamvr/steamvr.cpp b/tracker-steamvr/steamvr.cpp index 9ceb5db2..360ba3d2 100644 --- a/tracker-steamvr/steamvr.cpp +++ b/tracker-steamvr/steamvr.cpp @@ -79,35 +79,13 @@ 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) { vr::TrackedDevicePose_t devices[vr::k_unMaxTrackedDeviceCount] = {}; - vr->GetDeviceToAbsoluteTrackingPose(vr::ETrackingUniverseOrigin::TrackingUniverseStanding, 0, + vr->GetDeviceToAbsoluteTrackingPose(vr::ETrackingUniverseOrigin::TrackingUniverseSeated, 0, devices, vr::k_unMaxTrackedDeviceCount); bool done = false; @@ -129,15 +107,15 @@ void steamvr::data(double* data) for (unsigned i = 0; i < 3; i++) data[i] = double(result.m[i][3]) * c[i] * 100; - const quat q = get_quaternion(result); - static constexpr double r2d = 180/M_PI; - using std::atan2; using std::asin; - 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))); + //const euler_t rot = get_ypr(s.order); + + static constexpr double r2d = 180/M_PI; + + //for (unsigned i = 3; i < 6; i++) + // data[i] = r2d * rot[i]; done = true; break; diff --git a/tracker-steamvr/steamvr.hpp b/tracker-steamvr/steamvr.hpp index 1adb40b1..4a2bd117 100644 --- a/tracker-steamvr/steamvr.hpp +++ b/tracker-steamvr/steamvr.hpp @@ -18,11 +18,13 @@ using namespace options; -using quat = Mat<float, 4, 1>; - struct settings : opts { - settings() : opts("valve-steamvr") {} + value<int> order; + settings() : + opts("valve-steamvr"), + order(b, "rotation-order", 0) + {} }; class steamvr : public ITracker @@ -41,7 +43,9 @@ private: settings s; - static quat get_quaternion(const vr::HmdMatrix34_t& r); + using rmat = euler::rmat; + using euler_t = euler::euler_t; + static void vr_deleter(); static vr_t vr_init(error_t& error); static QString strerror(error_t error); |