/** * @file * * @author Max Lammers * @author Mamadou Babaei * * @section LICENSE * * Copyright (c) 2020 - 2025 SenseGlove * * @section DESCRIPTION * * */ #pragma once #include #include #include #include "Fingers.hpp" #include "Platform.hpp" namespace SGCore { namespace Kinematics { class Quat; class Vect3D; }// namespace Kinematics /// Tracking Hardware used for positional tracking. enum class SGCORE_API EPositionalTrackingHardware : uint8_t { /// Custom tracking hardware, we don't apply any offsets. Custom = 0, /// HTC Vive Tracker (v1.0 or v2.0). ViveTracker, /// Oculus Touch controller (left or right) for Rift S and Quest 1. OculusTouch, /// Touch controller for Oculus Quest 2. Quest2Controller, /// Pico Neo 2 Controller(s). PicoNeo2, /// Pico Neo 3 Controller(s). PicoNeo3, /// Wrist tracker for the Vive Focus 3. ViveFocus3WristTracker, /// Oculus Touch Controller that comes with the Meta Quest Pro. QuestProController, /// Oculus Quest 3 Controller. Quest3Controller, /// Vive Ultimate Tracker; "standalone" self-tracking boxes that use a camera-based approach. ViveUltimateTracker, }; class SGCORE_API Tracking; }// namespace SGCore class SGCORE_API SGCore::Tracking { public: //--------------------------------------------------------------------------- // Generic Methods /// Knowing a position & rotation in 3D space, calculate a relative location based on offsets. /// /// /// /// /// /// static void CalculateLocation( const Kinematics::Vect3D& trackedPosition, const Kinematics::Quat& trackedRotation, const Kinematics::Vect3D& positionOffset, const Kinematics::Quat& rotationOffset, Kinematics::Vect3D& out_newPosition, Kinematics::Quat& out_newRotation); //--------------------------------------------------------------------------- // SenseGlove DK1 Related //TrackingMount -> SG Glove /// Positional offset from each finger to the glove origin. static const std::vector& GetSenseGloveFingerToGlovePositionOrigin(); /// static const std::vector& GetSenseGloveFingerToGloveRotationOrigin(); //SG Glove -> Hand /// Default position offset from glove origin to wrist location, in mm. static const Kinematics::Vect3D& GetSenseGloveWristPositionOffset(); /// Default rotation offset from glove origin to wrist location. static const Kinematics::Quat& GetSenseGloveWristRotationOffset(); /// Get the position and rotation offsets to go from the glove origin to the mounted position. /// Based on CAD. needs to be inverted when going from tracker to glove origin. /// /// /// /// static void GetSenseGloveMountOffset(bool bRightHanded, EFinger toFinger, Kinematics::Vect3D& out_iPosition, Kinematics::Quat& out_iRotation); /// Get the offset to get from the TrackedHardware to a SenseGlove mounting location. Combined with /// Glove-Mount offset to get the glove location. /// /// /// /// static void GetSenseGloveTrackerMountOffset(EPositionalTrackingHardware hardware, bool bRightHanded, Kinematics::Vect3D& out_positionOffset, Kinematics::Quat& out_rotationOffset); // Vive Tracker /// Vive Tracker origin to Finger rotational offset. static const Kinematics::Vect3D& GetSenseGloveViveToAttachPosition(); /// Vive Tracker origin to Finger rotational offset. static const Kinematics::Quat& GetSenseGloveViveToAttachRotation(); //Quest 1 / Rift S /// Oculus Touch origin to Finger rotational offset. static const Kinematics::Vect3D& GetSenseGloveOculusTouchToAttachPosition(); /// Oculus Touch origin to Finger rotational offset. static const Kinematics::Quat& GetSenseGloveOculusTouchToAttachRotation(); //--------------------------------------------------------------------------- // Nova 1.0 Related // Hub -> Wrist /// Positional offset between Nova Glove Origin and Wrist. static const Kinematics::Vect3D& GetNovaToWristPositionOffset(); /// Rotational offset between Nova Glove Origin and Wrist. static const Kinematics::Quat& GetNovaToWristRotationOffset(); // Vive Trackers (Vive Pro, Valve Index) static const Kinematics::Vect3D& GetRightNovaViveToAttachPosition(); static const Kinematics::Quat& GetRightNovaViveToAttachRotation(); static const Kinematics::Vect3D& GetLeftNovaViveToAttachPosition(); static const Kinematics::Quat& GetLeftNovaViveToAttachRotation(); // Quest 2 Controllers a.k.a. Oculus Touch v3 static const Kinematics::Vect3D& GetRightNovaQuest2ToAttachPosition(); static const Kinematics::Quat& GetRightNovaQuest2ToAttachRotation(); static const Kinematics::Vect3D& GetLeftNovaQuest2ToAttachPosition(); static const Kinematics::Quat& GetLeftNovaQuest2ToAttachRotation(); // Pico Neo 2 - Obsolete / Deprecated. static const Kinematics::Vect3D& GetRightNovaPico2ToAttachPosition();// left is a mirror, so we only need R pos. static const Kinematics::Quat& GetRightNovaPico2ToAttachRotation(); static const Kinematics::Quat& GetLeftNovaPico2ToAttachRotation(); // Quest Pro Controllers a.k.a. Oculus Touch v4?? static const Kinematics::Vect3D& GetRightNovaQuestProToAttachPosition(); static const Kinematics::Quat& GetRightNovaQuestProToAttachRotation(); static const Kinematics::Vect3D& GetLeftNovaQuestProToAttachPosition(); static const Kinematics::Quat& GetLeftNovaQuestProToAttachRotation(); // Vive Focus 3 Tracker (also works with XR Elite) static const Kinematics::Vect3D& GetRightNovaViveFocus3ToAttachPosition(); static const Kinematics::Quat& GetRightNovaViveFocus3ToAttachRotation(); static const Kinematics::Vect3D& GetLeftNovaViveFocus3ToAttachPosition(); static const Kinematics::Quat& GetLeftNovaViveFocus3ToAttachRotation(); // Quest 3 Controller (a.k.a. Quest Touch Plus) static const Kinematics::Vect3D& GetRightNovaQuest3ToAttachPosition(); static const Kinematics::Quat& GetRightNovaQuest3ToAttachRotation(); static const Kinematics::Vect3D& GetLeftNovaQuest3ToAttachPosition(); static const Kinematics::Quat& GetLeftNovaQuest3ToAttachRotation(); /// Returns the Offsets that will bring us from the Nova origin to the wrist position. /// /// /// static void GetNovaGloveWristOffset(bool bRightHanded, Kinematics::Vect3D& out_positionOffset, Kinematics::Quat& out_rotationOffset); /// Retrieves Offsets for a particular device. /// /// /// /// static void GetNovaGloveTrackerOffset(EPositionalTrackingHardware hardware, bool bRightHanded, Kinematics::Vect3D& out_positionOffset, Kinematics::Quat& out_rotationOffset); //--------------------------------------------------------------------------- // Nova 2.0 Related // Nova Hub Origin (Middle of USB port) to Wrist static const Kinematics::Vect3D& GetRightNova2ToWristPositionOffset(); static const Kinematics::Quat& GetRightNova2ToWristRotationOffset(); static const Kinematics::Vect3D& GetLeftNova2ToWristPositionOffset(); static const Kinematics::Quat& GetLeftNova2ToWristRotationOffset(); // Quest 2 Tracker Offsets static const Kinematics::Vect3D& GetRightNova2Quest2ToAttachPosition(); static const Kinematics::Quat& GetRightNova2Quest2ToAttachRotation(); static const Kinematics::Vect3D& GetLeftNova2Quest2ToAttachPosition(); static const Kinematics::Quat& GetLeftNova2Quest2ToAttachRotation(); // Quest Pro Tracker Offsets static const Kinematics::Vect3D& GetRightNova2QuestProToAttachPosition(); static const Kinematics::Quat& GetRightNova2QuestProToAttachRotation(); static const Kinematics::Vect3D& GetLeftNova2QuestProToAttachPosition(); static const Kinematics::Quat& GetLeftNova2QuestProToAttachRotation(); // Vive Trackers (Vive Pro, Valve Index) static const Kinematics::Vect3D& GetRightNova2ViveTrackerToAttachPosition(); static const Kinematics::Quat& GetRightNova2ViveTrackerToAttachRotation(); static const Kinematics::Vect3D& GetLeftNova2ViveTrackerToAttachPosition(); static const Kinematics::Quat& GetLeftNova2ViveTrackerToAttachRotation(); // Vive Focus 3 Tracker (also works with XR Elite) static const Kinematics::Vect3D& GetRightNova2ViveWristTrackerToAttachPosition(); static const Kinematics::Quat& GetRightNova2ViveWristTrackerToAttachRotation(); static const Kinematics::Vect3D& GetLeftNova2ViveWristTrackerToAttachPosition(); static const Kinematics::Quat& GetLeftNova2ViveWristTrackerToAttachRotation(); // Quest 3 Controller (a.k.a. Quest Touch Plus) static const Kinematics::Vect3D& GetRightNova2Quest3ToAttachPosition(); static const Kinematics::Quat& GetRightNova2Quest3ToAttachRotation(); static const Kinematics::Vect3D& GetLeftNova2Quest3ToAttachPosition(); static const Kinematics::Quat& GetLeftNova2Quest3ToAttachRotation(); // Vive Ultimate Trackers (not the mouse-looking one, or the hockey puck one with three 'legs'. This is the flat one with cameras. static const Kinematics::Vect3D& GetRightNova2ViveUltimateToAttachPosition(); static const Kinematics::Quat& GetRightNova2ViveUltimateToAttachRotation(); static const Kinematics::Vect3D& GetLeftNova2ViveUltimateToAttachPosition(); static const Kinematics::Quat& GetLeftNova2ViveUltimateToAttachRotation(); /// Returns the Offsets that will bring us from the Nova origin to the wrist position. /// /// /// static void GetNova2GloveWristOffset(bool bRightHanded, const std::string& hardwareVersion, Kinematics::Vect3D& out_positionOffset, Kinematics::Quat& out_rotationOffset); /// Retrieves Offsets for a particular device. /// /// /// /// static void GetNova2GloveTrackerOffset(EPositionalTrackingHardware hardware, bool bRightHanded, const std::string& hardwareVersion, Kinematics::Vect3D& out_positionOffset, Kinematics::Quat& out_rotationOffset); //--------------------------------------------------------------------------- static std::string ToString(EPositionalTrackingHardware hardware); public: Tracking() = delete; virtual ~Tracking() = delete; };