diff options
author | mm0zct <the_cartographer@hotmail.com> | 2013-06-26 00:46:19 +0100 |
---|---|---|
committer | mm0zct <the_cartographer@hotmail.com> | 2013-06-26 00:46:19 +0100 |
commit | d4e2f529a3e0c0c496eab4b7745fc320de8805c9 (patch) | |
tree | b5b377afe562c3a1043e4c3a3e06cff380d7551e | |
parent | cdb407f7b789908e2fbe10e46462d45eced2625f (diff) |
Various changes and refactoring. Rotation correct for the Hydra, mostly
correct for the Rift, Rift looks better in OpenTrack, Hydra looks better
in Dirt3. Also rewrote the Rotation code for Quaternions, although it
seems broken with and without the changes. Will investigate.
-Chris
-rw-r--r-- | ftnoir_tracker_rift/ftnoir_tracker_rift.cpp | 97 |
1 files changed, 80 insertions, 17 deletions
diff --git a/ftnoir_tracker_rift/ftnoir_tracker_rift.cpp b/ftnoir_tracker_rift/ftnoir_tracker_rift.cpp index 9e985444..13336313 100644 --- a/ftnoir_tracker_rift/ftnoir_tracker_rift.cpp +++ b/ftnoir_tracker_rift/ftnoir_tracker_rift.cpp @@ -3,9 +3,20 @@ #include "facetracknoir/global-settings.h" #include "OVR.h" #include <cstdio> +#define SIXENSE_STATIC_LIB +#define SIXENSE_UTILS_STATIC_LIB +#include <sixense.h> +#include <sixense_math.hpp> +#ifdef WIN32 +#include <sixense_utils/mouse_pointer.hpp> +#endif +#include <sixense_utils/derivatives.hpp> +#include <sixense_utils/button_states.hpp> +#include <sixense_utils/event_triggers.hpp> +#include <sixense_utils/controller_manager/controller_manager.hpp> + using namespace OVR; -bool Rift_Tracker::isInitialised = false; Rift_Tracker::Rift_Tracker() { @@ -27,11 +38,26 @@ Rift_Tracker::Rift_Tracker() Rift_Tracker::~Rift_Tracker() { + + sixenseExit(); pSensor.Clear(); pHMD.Clear(); pManager.Clear(); + System::Destroy(); } +/* +void controller_manager_setup_callback( sixenseUtils::ControllerManager::setup_step step ) { + + QMessageBox::warning(0,"OpenTrack Info", "controller manager callback",QMessageBox::Ok,QMessageBox::NoButton); + if( sixenseUtils::getTheControllerManager()->isMenuVisible() ) { + // Ask the controller manager what the next instruction string should be. + std::string controller_manager_text_string = sixenseUtils::getTheControllerManager()->getStepString(); + QMessageBox::warning(0,"OpenTrack Info", controller_manager_text_string.c_str(),QMessageBox::Ok,QMessageBox::NoButton); + // We could also load the supplied controllermanager textures using the filename: sixenseUtils::getTheControllerManager()->getTextureFileName(); + + } +}*/ void Rift_Tracker::StartTracker(QFrame* videoFrame) { @@ -40,11 +66,7 @@ void Rift_Tracker::StartTracker(QFrame* videoFrame) // // Startup the Oculus SDK device handling, use the first Rift sensor we find. // - if(!isInitialised){ - System::Init(Log::ConfigureDefaultLog(LogMask_All)); - isInitialised = true; - } - + System::Init(Log::ConfigureDefaultLog(LogMask_All)); pManager = *DeviceManager::Create(); DeviceEnumerator<HMDDevice>& enumerator = pManager->EnumerateDevices<HMDDevice>(); if (enumerator.IsAvailable()) @@ -58,34 +80,75 @@ void Rift_Tracker::StartTracker(QFrame* videoFrame) }else{ QMessageBox::warning(0,"FaceTrackNoIR Error", "Unable to find Rift tracker",QMessageBox::Ok,QMessageBox::NoButton); } - SFusion.SetYawCorrectionEnabled(true); - SFusion.SetMagReference(); - } + isCalibrated = false; + MagCal.BeginAutoCalibration(SFusion); + SFusion.SetMagReference(SFusion.GetOrientation()); + } + // Init sixense + //QMessageBox::warning(0,"OpenTrack Info", "sixense init",QMessageBox::Ok,QMessageBox::NoButton); + sixenseInit(); + //QMessageBox::warning(0,"OpenTrack Info", "sixense init complete, setting controller manager",QMessageBox::Ok,QMessageBox::NoButton); + // Init the controller manager. This makes sure the controllers are present, assigned to left and right hands, and that + // the hemisphere calibration is complete. + //sixenseUtils::getTheControllerManager()->setGameType( sixenseUtils::ControllerManager::ONE_PLAYER_TWO_CONTROLLER ); + //sixenseUtils::getTheControllerManager()->registerSetupCallback( controller_manager_setup_callback ); + //QMessageBox::warning(0,"OpenTrack Info", "controller manager callback registered",QMessageBox::Ok,QMessageBox::NoButton); return; } + bool Rift_Tracker::GiveHeadPoseData(double *data) { if (pHMD.GetPtr() != NULL) { + + if (SFusion.IsMagReady() && !isCalibrated ){ + SFusion.SetYawCorrectionEnabled(true); + QMessageBox::warning(0,"OpenTrack Info", "Calibrated magnetic sensor",QMessageBox::Ok,QMessageBox::NoButton); + }else{ + if(isCalibrated){ + isCalibrated = false; + QMessageBox::warning(0,"OpenTrack Info", "Lost magnetic calibration",QMessageBox::Ok,QMessageBox::NoButton); + } + } + + // Magnetometer calibration procedure + MagCal.UpdateAutoCalibration(SFusion); Quatf hmdOrient = SFusion.GetOrientation(); float yaw = 0.0f; float pitch = 0.0f; float roll = 0.0f; - hmdOrient.GetEulerAngles<Axis_Y, Axis_X, Axis_Z>(&yaw, &pitch , &roll); + //hmdOrient.GetEulerAngles< Axis_X, Axis_Y, Axis_Z>(&pitch, &yaw, &roll); + //hmdOrient.GetEulerAngles< Axis_X, Axis_Z, Axis_Y>(&pitch, &roll, &yaw); + hmdOrient.GetEulerAngles< Axis_Y, Axis_X, Axis_Z>(&yaw, &pitch, &roll); + //hmdOrient.GetEulerAngles< Axis_Y, Axis_Z, Axis_X>(&yaw, &roll, &pitch); + //hmdOrient.GetEulerAngles< Axis_Z, Axis_X, Axis_Y>(&roll, &pitch, &yaw); + //hmdOrient.GetEulerAngles< Axis_Z, Axis_Y, Axis_X>(&roll, &yaw, &pitch); newHeadPose[RY] =pitch; newHeadPose[RZ] = roll; newHeadPose[RX] = yaw; -#if 0 - if (bEnableX) { + + + sixenseSetActiveBase(0); + sixenseAllControllerData acd; + sixenseGetAllNewestData( &acd ); + //sixenseUtils::getTheControllerManager()->update( &acd ); +#if 1 + sixenseControllerData cd; + + newHeadPose[TX] = acd.controllers[0].pos[0]/50.0f; + newHeadPose[TY] = acd.controllers[0].pos[1]/50.0f; + newHeadPose[TZ] = acd.controllers[0].pos[2]/50.0f; + + //if (bEnableX) { data[TX] = newHeadPose[TX]; - } - if (bEnableY) { + //} + //if (bEnableY) { data[TY] = newHeadPose[TY]; - } - if (bEnableY) { + //} + //if (bEnableY) { data[TZ] = newHeadPose[TZ]; - } + //} #endif if (bEnableYaw) { data[RX] = newHeadPose[RX] * 57.295781f; |