translate senseglove/unreal angles/directions

This commit is contained in:
Mamadou Babaei
2022-11-18 15:01:53 +01:00
parent aac0bb8a05
commit b683aa22af
15 changed files with 283 additions and 98 deletions
@@ -39,6 +39,7 @@
#include "SGBuildHacks/SGInclude_Core_Vect3D.h"
#include "SGCoreImpl/SGVect3DImpl.h"
#include "SGUtils/SGArrayUtils.h"
#include "SGUtils/SGCoordinates.h"
float FSGAnatomyImpl::GetTotalFingerFlexion()
{
@@ -63,13 +64,15 @@ float FSGAnatomyImpl::GetTotalThumbExtension()
float FSGAnatomyImpl::GetFingerJointLimit(
const bool bRightHanded, const int32 Joint, const int32 Movement, const bool bMax)
{
return FAnatomyType::GetFingerJointLimit(bRightHanded, Joint, Movement, bMax);
return FSGCoordinates::TransformToUnreal(
Movement, FAnatomyType::GetFingerJointLimit(bRightHanded, Joint, Movement, bMax));
}
float FSGAnatomyImpl::GetThumbJointLimit(
const bool bRightHanded, const int32 Joint, const int32 Movement, const bool bMax)
{
return FAnatomyType::GetThumbJointLimit(bRightHanded, Joint, Movement, bMax);
return FSGCoordinates::TransformToUnreal(
Movement, FAnatomyType::GetThumbJointLimit(bRightHanded, Joint, Movement, bMax));
}
float FSGAnatomyImpl::NormalizeFingerFlexion(const float FlexionInRadians)
@@ -85,35 +88,35 @@ float FSGAnatomyImpl::NormalizeThumbFlexion(const float FlexionInRadians)
TArray<TArray<FVector>> FSGAnatomyImpl::GetDefaultHandAngles(const bool bRightHanded)
{
TArray<TArray<FVector>> DefaultHandAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
FAnatomyType::GetDefaultHandAngles(bRightHanded))
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FAnatomyType::GetDefaultHandAngles(bRightHanded))
};
return DefaultHandAngles;
return MoveTemp(DefaultHandAngles);
}
TArray<TArray<FVector>> FSGAnatomyImpl::GetFlatHandAngles(const bool bRightHanded)
{
TArray<TArray<FVector>> FlatHandAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
FAnatomyType::GetFlatHandAngles(bRightHanded))
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FAnatomyType::GetFlatHandAngles(bRightHanded))
};
return FlatHandAngles;
return MoveTemp(FlatHandAngles);
}
TArray<TArray<FVector>> FSGAnatomyImpl::GetThumbsUpHandAngles(const bool bRightHanded)
{
TArray<TArray<FVector>> ThumbsUpHandAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
FAnatomyType::GetThumbsUpHandAngles(bRightHanded))
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FAnatomyType::GetThumbsUpHandAngles(bRightHanded))
};
return ThumbsUpHandAngles;
return MoveTemp(ThumbsUpHandAngles);
}
TArray<TArray<FVector>> FSGAnatomyImpl::GetFistHandAngles(const bool bRightHanded)
{
TArray<TArray<FVector>> FistHandAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
FAnatomyType::GetFistHandAngles(bRightHanded))
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FAnatomyType::GetFistHandAngles(bRightHanded))
};
return FistHandAngles;
return MoveTemp(FistHandAngles);
}
@@ -49,6 +49,7 @@
#include "SGCoreImpl/SGQuatImpl.h"
#include "SGCoreImpl/SGVect3DImpl.h"
#include "SGUtils/SGArrayUtils.h"
#include "SGUtils/SGCoordinates.h"
struct FSGHandInterpolatorImpl::FImpl
{
@@ -81,53 +82,53 @@ struct FSGHandInterpolatorImpl::FImpl
FSGHandInterpolatorImpl FSGHandInterpolatorImpl::Default(const bool bRightHanded)
{
const FSGHandInterpolatorImpl HandInterpolatorImpl(FHandInterpolatorType::Default(bRightHanded));
return HandInterpolatorImpl;
FSGHandInterpolatorImpl HandInterpolatorImpl(FHandInterpolatorType::Default(bRightHanded));
return MoveTemp(HandInterpolatorImpl);
}
FSGHandInterpolatorImpl FSGHandInterpolatorImpl::Deserialize(const FString& SerializedString)
{
std::string Serialized(TCHAR_TO_UTF8(*SerializedString));
const FSGHandInterpolatorImpl GlovePose(FHandInterpolatorType::Deserialize(MoveTemp(Serialized)));
return GlovePose;
FSGHandInterpolatorImpl GlovePose(FHandInterpolatorType::Deserialize(MoveTemp(Serialized)));
return MoveTemp(GlovePose);
}
TArray<FVector> FSGHandInterpolatorImpl::InterpolateFingerAngles(
ESGFinger Finger, const FSGHandInterpolatorImpl& Interpolator, const FVector& TotalGloveAngles)
const ESGFinger Finger, const FSGHandInterpolatorImpl& Interpolator, const FVector& TotalGloveAngles)
{
const TArray<FVector> Angles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
TArray<FVector> Angles{
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FHandInterpolatorType::InterpolateFingerAngles(
FSGCoreEnumCast::ToEFinger(Finger), Interpolator.ToHandInterpolator(),
FSGVect3DImpl(TotalGloveAngles).ToVect3D()))
FSGCoordinates::TransformToSenseGlove<FSGVect3DImpl::FVect3DType>(TotalGloveAngles)))
};
return Angles;
return MoveTemp(Angles);
}
TArray<FVector> FSGHandInterpolatorImpl::InterpolateThumbAngles(const FSGHandInterpolatorImpl& Interpolator,
const FVector& TotalGloveAngles)
{
const TArray<FVector> Angles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
TArray<FVector> Angles{
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FHandInterpolatorType::InterpolateThumbAngles(
Interpolator.ToHandInterpolator(), FSGVect3DImpl(TotalGloveAngles).ToVect3D()))
Interpolator.ToHandInterpolator(),
FSGCoordinates::TransformToSenseGlove<FSGVect3DImpl::FVect3DType>(TotalGloveAngles)))
};
return Angles;
return MoveTemp(Angles);
}
TArray<TArray<FVector>> FSGHandInterpolatorImpl::InterpolateHandAngles(const FSGHandInterpolatorImpl& Interpolator,
const TArray<FVector>& TotalAngles)
{
std::vector<FSGVect3DImpl::FVect3DType> TotalAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
TotalAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(TotalAngles)
};
const TArray<TArray<FVector>> Angles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
TArray<TArray<FVector>> Angles{
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
FHandInterpolatorType::InterpolateHandAngles(
Interpolator.ToHandInterpolator(), MoveTemp(TotalAnglesVector)))
};
return Angles;
return MoveTemp(Angles);
}
FSGHandInterpolatorImpl::FSGHandInterpolatorImpl()
@@ -242,28 +243,33 @@ void FSGHandInterpolatorImpl::SetCmcStartRotation(const FQuat& CmcStartRotation)
float FSGHandInterpolatorImpl::CalculateAngle(const ESGFinger Finger, const int32 Movement, const float Value) const
{
return Pimpl->HandInterpolator.CalculateAngle(FSGCoreEnumCast::ToEFinger(Finger), Movement, Value);
return FSGCoordinates::TransformToUnreal(
Movement, Pimpl->HandInterpolator.CalculateAngle(FSGCoreEnumCast::ToEFinger(Finger), Movement, Value));
}
float FSGHandInterpolatorImpl::CalculateAngle(const ESGFinger Finger, const ESGFingerMovement Movement,
const float Value) const
{
return Pimpl->HandInterpolator.CalculateAngle(
FSGCoreEnumCast::ToEFinger(Finger), FSGCoreEnumCast::ToEFingerMovement(Movement), Value);
return FSGCoordinates::TransformToUnreal(
Movement, Pimpl->HandInterpolator.CalculateAngle(FSGCoreEnumCast::ToEFinger(Finger),
FSGCoreEnumCast::ToEFingerMovement(Movement), Value));
}
float FSGHandInterpolatorImpl::CalculateAngle(const ESGFinger Finger, const ESGThumbMovement Movement,
const float Value) const
{
return Pimpl->HandInterpolator.CalculateAngle(
FSGCoreEnumCast::ToEFinger(Finger), FSGCoreEnumCast::ToEThumbMovement(Movement), Value);
return FSGCoordinates::TransformToUnreal(
Movement, Pimpl->HandInterpolator.CalculateAngle(FSGCoreEnumCast::ToEFinger(Finger),
FSGCoreEnumCast::ToEThumbMovement(Movement), Value));
}
void FSGHandInterpolatorImpl::SetInterpolation(
const int32 Finger, const int32 Movement,
const float InputAt0, const float InputAt1, const float AngleAt0, const float AngleAt1)
{
Pimpl->HandInterpolator.SetInterpolation(Finger, Movement, InputAt0, InputAt1, AngleAt0, AngleAt1);
Pimpl->HandInterpolator.SetInterpolation(Finger, Movement, InputAt0, InputAt1,
FSGCoordinates::TransformToUnreal(Movement, AngleAt0),
FSGCoordinates::TransformToUnreal(Movement, AngleAt1));
}
void FSGHandInterpolatorImpl::SetInterpolation(
@@ -272,7 +278,9 @@ void FSGHandInterpolatorImpl::SetInterpolation(
{
Pimpl->HandInterpolator.SetInterpolation(
FSGCoreEnumCast::ToEFinger(Finger), FSGCoreEnumCast::ToEFingerMovement(Movement),
InputAt0, InputAt1, AngleAt0, AngleAt1);
InputAt0, InputAt1,
FSGCoordinates::TransformToUnreal(Movement, AngleAt0),
FSGCoordinates::TransformToUnreal(Movement, AngleAt1));
}
void FSGHandInterpolatorImpl::SetInterpolation(
@@ -280,7 +288,9 @@ void FSGHandInterpolatorImpl::SetInterpolation(
const float InputAt0, const float InputAt1, const float AngleAt0, const float AngleAt1)
{
Pimpl->HandInterpolator.SetInterpolation(FSGCoreEnumCast::ToEThumbMovement(Movement),
InputAt0, InputAt1, AngleAt0, AngleAt1);
InputAt0, InputAt1,
FSGCoordinates::TransformToUnreal(Movement, AngleAt0),
FSGCoordinates::TransformToUnreal(Movement, AngleAt1));
}
FSGInterpolationSetImpl FSGHandInterpolatorImpl::GetInterpolation(const int32 Finger, const int32 Movement) const
@@ -48,6 +48,7 @@
#include "SGCoreImpl/SGQuatImpl.h"
#include "SGCoreImpl/SGVect3DImpl.h"
#include "SGUtils/SGArrayUtils.h"
#include "SGUtils/SGCoordinates.h"
struct FSGHandPoseImpl::FImpl
{
@@ -89,8 +90,7 @@ FSGHandPoseImpl FSGHandPoseImpl::FromHandAngles(const TArray<TArray<FVector>>& H
const FSGBasicHandModelImpl& HandDimensions)
{
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
HandAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(HandAngles)
};
return FSGHandPoseImpl(FHandPoseType::FromHandAngles(
MoveTemp(HandAnglesVector), bRightHanded, HandDimensions.ToBasicHandModel()));
@@ -99,8 +99,7 @@ FSGHandPoseImpl FSGHandPoseImpl::FromHandAngles(const TArray<TArray<FVector>>& H
FSGHandPoseImpl FSGHandPoseImpl::FromHandAngles(const TArray<TArray<FVector>>& HandAngles, const bool bRightHanded)
{
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
HandAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(HandAngles)
};
return FSGHandPoseImpl(FHandPoseType::FromHandAngles(MoveTemp(HandAnglesVector), bRightHanded));
}
@@ -173,8 +172,7 @@ FSGHandPoseImpl::FSGHandPoseImpl(const bool bRightHanded, const TArray<TArray<FV
};
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
HandAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(HandAngles)
};
Pimpl->HandPose = FHandPoseType(
@@ -271,8 +269,7 @@ void FSGHandPoseImpl::SetJointRotations(const TArray<TArray<FQuat>>& JointRotati
TArray<TArray<FVector>> FSGHandPoseImpl::GetHandAngles() const
{
TArray<TArray<FVector>> HandAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
Pimpl->HandPose.GetHandAngles())
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(Pimpl->HandPose.GetHandAngles())
};
return MoveTemp(HandAngles);
}
@@ -280,8 +277,7 @@ TArray<TArray<FVector>> FSGHandPoseImpl::GetHandAngles() const
void FSGHandPoseImpl::SetHandAngles(const TArray<TArray<FVector>>& HandAngles) const
{
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
HandAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(HandAngles)
};
Pimpl->HandPose.SetHandAngles(MoveTemp(HandAnglesVector));
}
@@ -46,6 +46,7 @@
#include "SGCoreImpl/SGSensorRangeImpl.h"
#include "SGCoreImpl/SGVect3DImpl.h"
#include "SGUtils/SGArrayUtils.h"
#include "SGUtils/SGCoordinates.h"
struct FSGHapticGloveCalibrationCheckImpl::FImpl
{
@@ -88,6 +89,8 @@ float FSGHapticGloveCalibrationCheckImpl::GetNovaGloveThreshold()
float FSGHapticGloveCalibrationCheckImpl::GetSenseGloveMinFlexion()
{
/// TODO
/// Though flexion should not be translated, should we still call the translation function?
return FHapticGloveCalibrationCheckType::GetSenseGloveMinFlexion();
}
@@ -98,11 +101,15 @@ float FSGHapticGloveCalibrationCheckImpl::GetNovaGloveMinFlexion()
float FSGHapticGloveCalibrationCheckImpl::GetSenseGloveMinAbduction()
{
return FHapticGloveCalibrationCheckType::GetSenseGloveMinAbduction();
/// TODO
/// Maybe use enums?
return FSGCoordinates::TransformToUnreal(2, FHapticGloveCalibrationCheckType::GetSenseGloveMinAbduction());
}
float FSGHapticGloveCalibrationCheckImpl::GetNovaGloveMinAbduction()
{
/// NOTE
/// Nova abduction translation is redundant.
return FHapticGloveCalibrationCheckType::GetNovaGloveMinAbduction();
}
@@ -57,8 +57,7 @@ bool FSGJointKinematicsImpl::ForwardKinematics(const FVector& StartPosition, con
};
std::vector<FSGVect3DImpl::FVect3DType> JointAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
JointAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(JointAngles)
};
std::vector<FSGVect3DImpl::FVect3DType> NewPositions;
@@ -81,8 +80,7 @@ bool FSGJointKinematicsImpl::ForwardKinematics(const FSGBasicHandModelImpl& Prof
TArray<FVector>& OutNewPositions, TArray<FQuat>& OutNewRotations)
{
std::vector<FSGVect3DImpl::FVect3DType> JointAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
JointAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(JointAngles)
};
std::vector<FSGVect3DImpl::FVect3DType> NewPositions;
@@ -77,13 +77,11 @@ void FSGNovaGloveCalibrationImpl::ApplyInterpolationValues(const TArray<FVector>
};
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> RetractedAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
RetractedAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(RetractedAngles)
};
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> ExtendedAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
ExtendedAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(ExtendedAngles)
};
FNovaGloveCalibrationType::ApplyInterpolationValues(
@@ -246,7 +246,7 @@ FSGNovaGloveImpl::FSGNovaGloveImpl()
{
}
FSGNovaGloveImpl::FSGNovaGloveImpl(const FSGNovaGloveInfoImpl DeviceInfo)
FSGNovaGloveImpl::FSGNovaGloveImpl(const FSGNovaGloveInfoImpl& DeviceInfo)
: FSGHapticGloveImpl(FSGNovaGloveImpl(std::make_shared<FNovaGloveType>((DeviceInfo.ToNovaGloveInfo())))),
#if ENGINE_MAJOR_VERSION == 5 || ( ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 22 )
Pimpl(TUniquePtr<FImpl, FImplDeleter>(new FImpl{this}, PimplDeleter))
@@ -119,8 +119,7 @@ FSGSenseGlovePoseImpl FSGSenseGloveImpl::CalculateGlovePose(const TArray<TArray<
const FSGSenseGloveInfoImpl& GloveModel)
{
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> GloveAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
GloveAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(GloveAngles)
};
FSGSenseGlovePoseImpl Pose{
FSenseGloveType::CalculateGlovePose(MoveTemp(GloveAnglesVector), GloveModel.ToSenseGloveInfo())
@@ -352,9 +352,13 @@ TArray<FVector> FSGSenseGloveInfoImpl::GetGloveLengths(const ESGFinger Finger) c
TArray<TArray<FVector>> FSGSenseGloveInfoImpl::ToGloveAngles(const TArray<TArray<float>>& SensorAngles) const
{
std::vector<std::vector<float>> SensorAnglesVector{FSGArrayUtils::ToStdVector<float>(SensorAngles)};
/// TODO
/// Does the nested float TArray requires translation? If so, how to do that without a Movement value?
std::vector<std::vector<float>> SensorAnglesVector{
FSGArrayUtils::ToStdVector<float>(SensorAngles)
};
TArray<TArray<FVector>> GloveAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
Pimpl->SenseGloveInfo.ToGloveAngles(MoveTemp((SensorAnglesVector))))
};
return MoveTemp(GloveAngles);
@@ -81,15 +81,15 @@ struct FSGSenseGlovePoseImpl::FImpl
FSGSenseGlovePoseImpl FSGSenseGlovePoseImpl::IdlePose(const FSGSenseGloveInfoImpl& GloveInfo)
{
const FSGSenseGlovePoseImpl GlovePoseImpl(FSenseGlovePoseType::IdlePose(GloveInfo.ToSenseGloveInfo()));
return GlovePoseImpl;
FSGSenseGlovePoseImpl GlovePoseImpl(FSenseGlovePoseType::IdlePose(GloveInfo.ToSenseGloveInfo()));
return MoveTemp(GlovePoseImpl);
}
FSGSenseGlovePoseImpl FSGSenseGlovePoseImpl::Deserialize(const FString& SerializedString)
{
std::string Serialized(TCHAR_TO_UTF8(*SerializedString));
const FSGSenseGlovePoseImpl GlovePose(FSenseGlovePoseType::Deserialize(MoveTemp(Serialized)));
return GlovePose;
FSGSenseGlovePoseImpl GlovePose(FSenseGlovePoseType::Deserialize(MoveTemp(Serialized)));
return MoveTemp(GlovePose);
}
FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl()
@@ -102,7 +102,7 @@ FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl()
{
}
FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl(bool bRightHanded, const TArray<TArray<FVector>>& JointPositions,
FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl(const bool bRightHanded, const TArray<TArray<FVector>>& JointPositions,
const TArray<TArray<FQuat>>& JointRotations,
const TArray<TArray<FVector>>& GloveAngles)
:
@@ -116,12 +116,10 @@ FSGSenseGlovePoseImpl::FSGSenseGlovePoseImpl(bool bRightHanded, const TArray<TAr
FSGArrayUtils::ToMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(JointPositions)
};
std::vector<std::vector<FSGQuatImpl::FQuatType>> JointRotationsVector{
FSGArrayUtils::ToStdVector<FQuat, FSGQuatImpl::FQuatType, FSGQuatImpl, &FSGQuatImpl::ToQuat>(
JointRotations)
FSGArrayUtils::ToStdVector<FQuat, FSGQuatImpl::FQuatType, FSGQuatImpl, &FSGQuatImpl::ToQuat>(JointRotations)
};
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> GloveAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
GloveAngles)
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(GloveAngles)
};
Pimpl->SenseGlovePose = FSenseGlovePoseType(bRightHanded,
@@ -182,11 +180,11 @@ void FSGSenseGlovePoseImpl::SetIsRight(const bool bRightHanded) const
TArray<TArray<FVector>> FSGSenseGlovePoseImpl::GetJointPositions() const
{
const TArray<TArray<FVector>> JointPositions{
TArray<TArray<FVector>> JointPositions{
FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(
Pimpl->SenseGlovePose.GetJointPositions())
};
return JointPositions;
return MoveTemp(JointPositions);
}
void FSGSenseGlovePoseImpl::SetJointPositions(const TArray<TArray<FVector>>& JointPositions) const
@@ -199,11 +197,11 @@ void FSGSenseGlovePoseImpl::SetJointPositions(const TArray<TArray<FVector>>& Joi
TArray<TArray<FQuat>> FSGSenseGlovePoseImpl::GetJointRotations() const
{
const TArray<TArray<FQuat>> JointRotations{
TArray<TArray<FQuat>> JointRotations{
FSGArrayUtils::FromStdVector<FSGQuatImpl::FQuatType, FQuat, FSGQuatImpl, &FSGQuatImpl::ToFQuat>(
Pimpl->SenseGlovePose.GetJointRotations())
};
return JointRotations;
return MoveTemp(JointRotations);
}
void FSGSenseGlovePoseImpl::SetJointRotations(const TArray<TArray<FQuat>>& JointRotations) const
@@ -217,17 +215,17 @@ void FSGSenseGlovePoseImpl::SetJointRotations(const TArray<TArray<FQuat>>& Joint
TArray<TArray<FVector>> FSGSenseGlovePoseImpl::GetGloveAngles() const
{
const TArray<TArray<FVector>> GloveAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
TArray<TArray<FVector>> GloveAngles{
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
Pimpl->SenseGlovePose.GetGloveAngles())
};
return GloveAngles;
return MoveTemp(GloveAngles);
}
void FSGSenseGlovePoseImpl::SetGloveAngles(const TArray<TArray<FVector>>& GloveAngles) const
{
std::vector<std::vector<FSGVect3DImpl::FVect3DType>> HandAnglesVector{
FSGArrayUtils::ToStdVector<FVector, FSGVect3DImpl::FVect3DType, FSGVect3DImpl, &FSGVect3DImpl::ToVect3D>(
FSGArrayUtils::ToSenseGloveAngles<FSGVect3DImpl::FVect3DType>(
GloveAngles)
};
Pimpl->SenseGlovePose.SetGloveAngles(MoveTemp(HandAnglesVector));
@@ -235,39 +233,38 @@ void FSGSenseGlovePoseImpl::SetGloveAngles(const TArray<TArray<FVector>>& GloveA
TArray<FVector> FSGSenseGlovePoseImpl::GetThimblePositions() const
{
const TArray<FVector> ThimblePositions{
TArray<FVector> ThimblePositions{
FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(
Pimpl->SenseGlovePose.GetThimblePositions())
};
return ThimblePositions;
return MoveTemp(ThimblePositions);
}
TArray<FQuat> FSGSenseGlovePoseImpl::GetThimbleRotations() const
{
const TArray<FQuat> ThimbleRotations{
TArray<FQuat> ThimbleRotations{
FSGArrayUtils::FromStdVector<FSGQuatImpl::FQuatType, FQuat, FSGQuatImpl, &FSGQuatImpl::ToFQuat>(
Pimpl->SenseGlovePose.GetThimbleRotations())
};
return ThimbleRotations;
return MoveTemp(ThimbleRotations);
}
TArray<FVector> FSGSenseGlovePoseImpl::GetTotalGloveAngles() const
{
const TArray<FVector> TotalGloveAngles{
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
Pimpl->SenseGlovePose.GetTotalGloveAngles())
TArray<FVector> TotalGloveAngles{
FSGArrayUtils::FromSenseGloveAngles<FSGVect3DImpl::FVect3DType>(Pimpl->SenseGlovePose.GetTotalGloveAngles())
};
return TotalGloveAngles;
return MoveTemp(TotalGloveAngles);
}
TArray<FVector> FSGSenseGlovePoseImpl::CalculateFingerTips(
const FSGSenseGloveHandProfileImpl& SenseGloveHandProfileImpl) const
{
const TArray<FVector> FingerTips{
TArray<FVector> FingerTips{
FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(
Pimpl->SenseGlovePose.CalculateFingerTips(SenseGloveHandProfileImpl.ToSenseGloveHandProfile()))
};
return FingerTips;
return MoveTemp(FingerTips);
}
TArray<FVector> FSGSenseGlovePoseImpl::CalculateFingerTips(const TArray<FVector>& FingerOffsets) const
@@ -279,7 +276,7 @@ TArray<FVector> FSGSenseGlovePoseImpl::CalculateFingerTips(const TArray<FVector>
FSGArrayUtils::FromMillimeters<FSGVect3DImpl::FVect3DType, FSGVect3DImpl>(
Pimpl->SenseGlovePose.CalculateFingerTips(MoveTemp(FingerOffsetsVector)))
};
return FingerTips;
return MoveTemp(FingerTips);
}
bool FSGSenseGlovePoseImpl::Equals(const FSGSenseGlovePoseImpl& SenseGlovePoseImpl) const
@@ -289,14 +286,14 @@ bool FSGSenseGlovePoseImpl::Equals(const FSGSenseGlovePoseImpl& SenseGlovePoseIm
FString FSGSenseGlovePoseImpl::ToString(bool bShortFormat) const
{
const FString String(UTF8_TO_TCHAR(Pimpl->SenseGlovePose.ToString(bShortFormat).c_str()));
return String;
FString String(UTF8_TO_TCHAR(Pimpl->SenseGlovePose.ToString(bShortFormat).c_str()));
return MoveTemp(String);
}
FString FSGSenseGlovePoseImpl::Serialize() const
{
const FString Serialized(UTF8_TO_TCHAR(Pimpl->SenseGlovePose.Serialize().c_str()));
return Serialized;
FString Serialized(UTF8_TO_TCHAR(Pimpl->SenseGlovePose.Serialize().c_str()));
return MoveTemp(Serialized);
}
FSGSenseGlovePoseImpl::FImpl::FImpl(FSGSenseGlovePoseImpl* InOwner)
@@ -135,7 +135,7 @@ private:
public:
FSGNovaGloveImpl();
explicit FSGNovaGloveImpl(const FSGNovaGloveInfoImpl DeviceInfo);
explicit FSGNovaGloveImpl(const FSGNovaGloveInfoImpl& DeviceInfo);
public:
/**
@@ -37,6 +37,7 @@
#include <vector>
#include "SGCoordinates.h"
#include "Containers/Array.h"
#include "Templates/UnrealTemplate.h"
@@ -609,6 +610,60 @@ public:
return MoveTemp(NestedVector);
}
template<typename V3D>
static std::vector<V3D> ToSenseGloveAngles(const TArray<FVector>& Array)
{
std::vector<V3D> Vector;
for (const FVector& Value: Array)
{
Vector.emplace_back(FSGCoordinates::TransformToSenseGlove<V3D>(Value));
}
return MoveTemp(Vector);
}
template<typename V3D>
static std::vector<std::vector<V3D>> ToSenseGloveAngles(const TArray<TArray<FVector>>& NestedArray)
{
std::vector<std::vector<V3D>> NestedVector;
for (const TArray<FVector>& InnerArray: NestedArray)
{
std::vector<V3D> InnerVector{ToSenseGloveAngles<V3D>(InnerArray)};
NestedVector.emplace_back(MoveTemp(InnerVector));
}
return MoveTemp(NestedVector);
}
template<typename V3D>
static TArray<FVector> FromSenseGloveAngles(const std::vector<V3D>& Vector)
{
TArray<FVector> Array;
for (const V3D& Value: Vector)
{
Array.Add(FSGCoordinates::TransformToUnreal<V3D>(Value));
}
return MoveTemp(Array);
}
template<typename V3D>
static TArray<TArray<FVector>> FromSenseGloveAngles(const std::vector<std::vector<V3D>>& NestedVector)
{
TArray<TArray<FVector>> NestedArray;
for (const std::vector<V3D>& InnerVector: NestedVector)
{
TArray<FVector> InnerArray{FromSenseGloveAngles<V3D>(InnerVector)};
NestedArray.Add(MoveTemp(InnerArray));
}
return MoveTemp(NestedArray);
}
public:
FSGArrayUtils() = delete;
virtual ~FSGArrayUtils() = delete;
@@ -0,0 +1,117 @@
/**
* @file
*
* @author Mamadou Babaei <mamadou@senseglove.com>
*
* @section LICENSE
*
* (The MIT License)
*
* Copyright (c) 2020 - 2022 SenseGlove
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED To THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ToRT OR OTHERWISE, ARISING From,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @section DESCRIPTION
*
*
*/
#pragma once
#include "Math/Vector.h"
#include "SGTypes/SGCoreTypes.h"
class SENSEGLOVEUTILS_API FSGCoordinates final
{
public:
static FORCEINLINE constexpr float TransformToSenseGlove(const int32 Movement, const float Direction)
{
// 0 = twist, 1 = flexion/extension, 2 = abduction
return Movement != 1 ? Direction * -1.0f : Direction;
}
static FORCEINLINE FVector TransformToSenseGlove(const FVector& Vector)
{
return FVector(Vector.X * -1.0f, Vector.Y, Vector.Z * -1.0f);
}
template<typename V>
static FORCEINLINE V TransformToSenseGlove(const FVector& Vector)
{
return V(Vector.X * -1.0f, Vector.Y, Vector.Z * -1.0f);
}
static FORCEINLINE constexpr float TransformToUnreal(const int32 Movement, const float Direction)
{
/// TODO
/// values require validation.
// 0 = twist, 1 = flexion/extension, 2 = abduction
return Movement != 1 ? Direction * -1.0f : Direction;
}
static FORCEINLINE constexpr float TransformToUnreal(const ESGFingerMovement Movement, const float Direction)
{
ensureAlwaysMsgf(Movement != ESGFingerMovement::None, TEXT("none is not a valid value!"));
/// TODO
/// values require validation.
// 0 = twist, 1 = flexion/extension, 2 = abduction
/// TODO
/// Which flexions should be ignored?
return (Movement != ESGFingerMovement::McpFlexion && Movement != ESGFingerMovement::PipFlexion && Movement !=
ESGFingerMovement::PipFlexion)
? Direction * -1.0f
: Direction;
}
static FORCEINLINE constexpr float TransformToUnreal(const ESGThumbMovement Movement, const float Direction)
{
ensureAlwaysMsgf(Movement != ESGThumbMovement::None, TEXT("none is not a valid value!"));
/// TODO
/// values require validation.
// 0 = twist, 1 = flexion/extension, 2 = abduction
/// TODO
/// Which flexions should be ignored?
return (Movement != ESGThumbMovement::CmcFlexion && Movement != ESGThumbMovement::McpFlexion && Movement !=
ESGThumbMovement::IpFlexion)
? Direction * -1.0f
: Direction;
}
static FORCEINLINE FVector TransformToUnreal(const FVector& Vector)
{
return FVector(Vector.X * -1.0f, Vector.Y, Vector.Z * -1.0f);
}
template<typename V>
static FORCEINLINE FVector TransformToUnreal(const V& Vector)
{
return FVector(Vector.GetX() * -1.0f, Vector.GetY(), Vector.GetZ() * -1.0f);
}
public:
FSGCoordinates() = delete;
virtual ~FSGCoordinates() = delete;
};
@@ -54,6 +54,7 @@ public class SenseGloveUtils : ModuleRules
{
"CoreUObject",
"SenseGloveLog",
"SenseGloveTypes",
}
);
}