Add functions to use absolute tracking
authorMikko Rasa <tdb@tdb.fi>
Mon, 3 Oct 2016 13:05:34 +0000 (16:05 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 3 Oct 2016 13:05:34 +0000 (16:05 +0300)
A.k.a. room scale

source/headtrackingcamera.cpp
source/headtrackingcamera.h
source/libovr/libovrsystem.cpp
source/libovr/libovrsystem.h
source/openvr/openvrsystem.cpp
source/openvr/openvrsystem.h
source/system.h

index 95868e2f12f107a512dda7d39e1dca0dc8fdce14..42eedd5d90caa21543776a47d95049069b99e587 100644 (file)
@@ -4,14 +4,20 @@ namespace Msp {
 namespace VR {
 
 HeadTrackingCamera::HeadTrackingCamera(const GL::Camera &c):
-       base_camera(c)
+       base_camera(c),
+       elevation_offset(0)
 { }
 
+void HeadTrackingCamera::set_elevation_offset(float o)
+{
+       elevation_offset = o;
+}
+
 void HeadTrackingCamera::update_from_matrix(const GL::Matrix &hmd_matrix)
 {
        GL::Matrix matrix = base_camera.get_object_matrix()*hmd_matrix;
 
-       set_position(matrix*GL::Vector3());
+       set_position(matrix*GL::Vector3()+base_camera.get_up_direction()*elevation_offset);
        set_look_direction((matrix*GL::Vector4(0, 0, -1, 0)).slice<3>(0));
        set_up_direction((matrix*GL::Vector4(0, 1, 0, 0)).slice<3>(0));
 
index 5bb911e72deeccd61d2bfd2d8e77221f789876a4..c2001365f4eaa249d6bb46b77643a8e231647274 100644 (file)
@@ -10,11 +10,13 @@ class HeadTrackingCamera: public Msp::GL::Camera
 {
 protected:
        const GL::Camera &base_camera;
+       float elevation_offset;
 
        HeadTrackingCamera(const GL::Camera &);
 public:
        virtual ~HeadTrackingCamera() { }
 
+       void set_elevation_offset(float);
        virtual void reset_tracking() { }
        virtual void update() = 0;
 protected:
index c8183b08eb64d939d10e4c1e060da0ac46008fed..0136d49dd7616c8c75fb6b7a647032c6fb209908 100644 (file)
@@ -65,6 +65,12 @@ void LibOVRSystem::configure_view(StereoView &view) const
        view.set_eye_matrices(GL::Matrix::translation(GL::Vector3(l.x, l.y, l.z)), GL::Matrix::translation(GL::Vector3(r.x, r.y, r.z)));
 }
 
+void LibOVRSystem::set_absolute_tracking(bool a)
+{
+       if(a)
+               throw invalid_argument("absolute tracking not supported");
+}
+
 LibOVRCamera *LibOVRSystem::create_camera(const GL::Camera &bc)
 {
        return new LibOVRCamera(*this, bc);
index d5623a02d848657b618743dec2aa983b0456311f..a7978e47ff7128f1d9cc0bed8a39f7f29638fa98 100644 (file)
@@ -28,6 +28,7 @@ public:
 
        virtual void configure_window(Graphics::Window &) const;
        virtual void configure_view(StereoView &) const;
+       virtual void set_absolute_tracking(bool);
        virtual LibOVRCamera *create_camera(const GL::Camera &);
        virtual LibOVRCombiner *create_combiner(GL::View &);
 
index ec6b418d0a455a9e5f4fb5d7273a6a6e54cc5f8b..e71ba33b45346935d22eb48fc54b22724f4f4888 100644 (file)
@@ -69,6 +69,11 @@ void OpenVRSystem::configure_view(StereoView &view) const
        view.set_eye_matrices(convert_matrix(left), convert_matrix(right));
 }
 
+void OpenVRSystem::set_absolute_tracking(bool a)
+{
+       vr::VRCompositor()->SetTrackingSpace(a ? vr::TrackingUniverseStanding : vr::TrackingUniverseSeated);
+}
+
 OpenVRCamera *OpenVRSystem::create_camera(const GL::Camera &bc)
 {
        return new OpenVRCamera(*this, bc);
index 98ad55673ab78a8ad041aab66b818673158c1e69..3e401edb18f3f1e0c8b6ba9b1f4d99c732635440 100644 (file)
@@ -22,6 +22,7 @@ public:
 
        virtual void configure_window(Graphics::Window &) const { }
        virtual void configure_view(StereoView &) const;
+       virtual void set_absolute_tracking(bool);
        virtual OpenVRCamera *create_camera(const GL::Camera &);
        virtual OpenVRCombiner *create_combiner(GL::View &);
 
index 0610e29e80db7714d8b7fe31c33290546e1141ab..46c65d9b912ac53d1fb0960a29d9381fa856c194 100644 (file)
@@ -23,6 +23,7 @@ public:
 
        virtual void configure_window(Graphics::Window &) const = 0;
        virtual void configure_view(StereoView &) const = 0;
+       virtual void set_absolute_tracking(bool) = 0;
        virtual HeadTrackingCamera *create_camera(const GL::Camera &) = 0;
        virtual StereoCombiner *create_combiner(GL::View &) = 0;
 };