/** * @file * * @author Max Lammers * @author Mamadou Babaei * * @section LICENSE * * Copyright (c) 2020 - 2022 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, }; 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 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 Related /// 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(); /// 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); static const Kinematics::Vect3D& GetRightNovaViveToAttachPosition(); static const Kinematics::Quat& GetRightNovaViveToAttachRotation(); static const Kinematics::Vect3D& GetLeftNovaViveToAttachPosition(); static const Kinematics::Quat& GetLeftNovaViveToAttachRotation(); static const Kinematics::Vect3D& GetRightNovaQuest2ToAttachPosition(); static const Kinematics::Quat& GetRightNovaQuest2ToAttachRotation(); static const Kinematics::Vect3D& GetLeftNovaQuest2ToAttachPosition(); static const Kinematics::Quat& GetLeftNovaQuest2ToAttachRotation(); 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(); /// Retrieves Offsets for a particular device. /// /// /// /// static void GetNovaGloveTrackerOffset(EPositionalTrackingHardware hardware, bool bRightHanded, Kinematics::Vect3D& out_positionOffset, Kinematics::Quat& out_rotationOffset); static std::string ToString(EPositionalTrackingHardware hardware); public: Tracking() = delete; virtual ~Tracking() = delete; };