From: Mikko Rasa Date: Mon, 22 Dec 2014 23:56:13 +0000 (+0200) Subject: Add positional tracking support on the Oculus Rift DK2 X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=a6b7e23d5d47c37284480651a9686be01f28a82a;p=libs%2Fvr.git Add positional tracking support on the Oculus Rift DK2 --- diff --git a/source/headtrackingcamera.h b/source/headtrackingcamera.h index b12a929..36f0170 100644 --- a/source/headtrackingcamera.h +++ b/source/headtrackingcamera.h @@ -14,6 +14,7 @@ protected: public: virtual ~HeadTrackingCamera() { } + virtual void reset_tracking() { } virtual void update() = 0; }; diff --git a/source/oculusriftcamera.cpp b/source/oculusriftcamera.cpp index db07bce..33ed07f 100644 --- a/source/oculusriftcamera.cpp +++ b/source/oculusriftcamera.cpp @@ -10,22 +10,28 @@ OculusRiftCamera::OculusRiftCamera(const OculusRiftDevice &d, const GL::Camera & base_camera(c) { const OculusRiftDevice::Private &dev_priv = device.get_private(); - unsigned supported = ovrTrackingCap_Orientation|ovrTrackingCap_MagYawCorrection; + unsigned supported = ovrTrackingCap_Orientation|ovrTrackingCap_MagYawCorrection|ovrTrackingCap_Position; ovrHmd_ConfigureTracking(dev_priv.ovr_hmd, supported, 0); } +void OculusRiftCamera::reset_tracking() +{ + ovrHmd_RecenterPose(device.get_private().ovr_hmd); +} + void OculusRiftCamera::update() { ovrTrackingState state = ovrHmd_GetTrackingState(device.get_private().ovr_hmd, ovr_GetTimeInSeconds()); OVR::Posef head_pose = state.HeadPose.ThePose; OVR::Matrix4f tracking_matrix(head_pose.Rotation); + OVR::Vector3f trans = head_pose.Translation; const float *m = &tracking_matrix.M[0][0]; const GL::Vector3 &base_look = base_camera.get_look_direction(); GL::Vector3 base_right = normalize(cross(base_look, base_camera.get_up_direction())); GL::Vector3 base_up = normalize(cross(base_right, base_look)); - set_position(base_camera.get_position()); + set_position(base_camera.get_position()+trans.x*base_right+trans.y*base_up-trans.z*base_look); set_up_direction(base_right*m[1]+base_up*m[5]-base_look*m[9]); set_look_direction(-base_right*m[2]-base_up*m[6]+base_look*m[10]); set_depth_clip(base_camera.get_near_clip(), base_camera.get_far_clip()); diff --git a/source/oculusriftcamera.h b/source/oculusriftcamera.h index 29856fb..7abaa81 100644 --- a/source/oculusriftcamera.h +++ b/source/oculusriftcamera.h @@ -17,6 +17,7 @@ private: public: OculusRiftCamera(const OculusRiftDevice &, const GL::Camera &); + virtual void reset_tracking(); virtual void update(); };