From d2692666b9c25146a9837c535c10d4cd3fb1a1d9 Mon Sep 17 00:00:00 2001
From: Patrick Nossol <patrick.nossol@vr.rwth-aachen.de>
Date: Fri, 10 Feb 2023 16:04:59 +0100
Subject: [PATCH] Added Angle open finger
---
Content/SaveSequenceRig.uasset | 4 +-
Source/MoCapPlugin/Private/MCRigUnits.cpp | 172 ++++++++++++++++------
Source/MoCapPlugin/Public/MCDefines.h | 35 +++++
Source/MoCapPlugin/Public/MCRigUnits.h | 25 +++-
4 files changed, 188 insertions(+), 48 deletions(-)
diff --git a/Content/SaveSequenceRig.uasset b/Content/SaveSequenceRig.uasset
index cc62a67..255653d 100644
--- a/Content/SaveSequenceRig.uasset
+++ b/Content/SaveSequenceRig.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4e140be55357a682f3c7ac027bc8bfa52cdc6458d4442d75231e022321eb320c
-size 5131100
+oid sha256:1270973e8c657ea0f5839472906687bded88448c7400428210b1777db48a655c
+size 5035646
diff --git a/Source/MoCapPlugin/Private/MCRigUnits.cpp b/Source/MoCapPlugin/Private/MCRigUnits.cpp
index 5c0391c..4357c12 100644
--- a/Source/MoCapPlugin/Private/MCRigUnits.cpp
+++ b/Source/MoCapPlugin/Private/MCRigUnits.cpp
@@ -44,71 +44,161 @@ FRigUnit_ApplyFingerData_Execute() {
Scale = FVector(1.f, 1.f, 1.f);
ThumbScale = FVector(1.f, 1.f, 1.f);
}
- FVector ThumbAngles_N = ThumbScale * ThumbAngles;
- FVector IndexAngles_N = Scale * IndexAngles;
- FVector MiddleAngles_N = Scale * MiddleAngles;
- FVector RingAngles_N = Scale * RingAngles;
- FVector PinkyAngles_N = Scale * PinkyAngles;
+ FVector ThumbAnglesClosed_N = ThumbScale * ThumbAnglesClosed;
+ FVector IndexAnglesClosed_N = Scale * IndexAnglesClosed;
+ FVector MiddleAnglesClosed_N = Scale * MiddleAnglesClosed;
+ FVector RingAnglesClosed_N = Scale * RingAnglesClosed;
+ FVector PinkyAnglesClosed_N = Scale * PinkyAnglesClosed;
+ FVector ThumbAnglesOpen_N = ThumbAnglesOpen;
+ FVector IndexAnglesOpen_N = IndexAnglesOpen;
+ FVector MiddleAnglesOpen_N = MiddleAnglesOpen;
+ FVector RingAnglesOpen_N = RingAnglesOpen;
+ FVector PinkyAnglesOpen_N = PinkyAnglesOpen;
float Thumb_Index_Angle_N = Thumb_Index_Angle;
float Index_Middle_Angle_N = Index_Middle_Angle;
float Middle_Ring_Angle_N = Middle_Ring_Angle;
float Ring_Pinky_Angle_N = Ring_Pinky_Angle;
+ float ReverseFactor = 0.5f;
+ FFingerData FingerDataTransformed = FingerData;
+ FingerDataTransformed.LeftHand.Thumb = FingerDataTransformed.LeftHand.Thumb * (1.f + ReverseFactor) - ReverseFactor;
+ FingerDataTransformed.LeftHand.Index = FingerDataTransformed.LeftHand.Index * (1.f + ReverseFactor) - ReverseFactor;
+ FingerDataTransformed.LeftHand.Middle = FingerDataTransformed.LeftHand.Middle * (1.f + ReverseFactor) - ReverseFactor;
+ FingerDataTransformed.LeftHand.Ring = FingerDataTransformed.LeftHand.Ring * (1.f + ReverseFactor) - ReverseFactor;
+ FingerDataTransformed.LeftHand.Pinky = FingerDataTransformed.LeftHand.Pinky * (1.f + ReverseFactor) - ReverseFactor;
+ FingerDataTransformed.RightHand.Thumb = FingerDataTransformed.RightHand.Thumb * (1.f + ReverseFactor) - ReverseFactor;
+ FingerDataTransformed.RightHand.Index = FingerDataTransformed.RightHand.Index * (1.f + ReverseFactor) - ReverseFactor;
+ FingerDataTransformed.RightHand.Middle = FingerDataTransformed.RightHand.Middle * (1.f + ReverseFactor) - ReverseFactor;
+ FingerDataTransformed.RightHand.Ring = FingerDataTransformed.RightHand.Ring * (1.f + ReverseFactor) - ReverseFactor;
+ FingerDataTransformed.RightHand.Pinky = FingerDataTransformed.RightHand.Pinky * (1.f + ReverseFactor) - ReverseFactor;
+
FRigBoneHierarchy* Hierarchy = ExecuteContext.GetBones();
if (Hierarchy) {
//CURLS
- float Thumb01YAngle = ThumbAngles_N.X;
+ float Thumb01YAngleClosed = ThumbAnglesClosed_N.X;
if (AngleScale >= 1.f) {
- Thumb01YAngle = -15.f;
+ Thumb01YAngleClosed = -15.f;
}
- AddRotation("thumb_01_l", FingerData.LeftHand.Thumb * Thumb01YAngle, Hierarchy);
- AddRotation("thumb_01_l", FingerData.LeftHand.Thumb * ThumbAngles_N.X, Hierarchy, "Z");
- AddRotation("thumb_02_l", FingerData.LeftHand.Thumb * ThumbAngles_N.Y, Hierarchy);
- AddRotation("thumb_03_l", FingerData.LeftHand.Thumb * ThumbAngles_N.Z, Hierarchy);
-
- AddRotation("index_01_l", FingerData.LeftHand.Index * IndexAngles_N.X, Hierarchy);
- AddRotation("index_02_l", FingerData.LeftHand.Index * IndexAngles_N.Y, Hierarchy);
- AddRotation("index_03_l", FingerData.LeftHand.Index * IndexAngles_N.Z, Hierarchy);
-
- AddRotation("middle_01_l", FingerData.LeftHand.Middle * MiddleAngles_N.X, Hierarchy);
- AddRotation("middle_02_l", FingerData.LeftHand.Middle * MiddleAngles_N.Y, Hierarchy);
- AddRotation("middle_03_l", FingerData.LeftHand.Middle * MiddleAngles_N.Z, Hierarchy);
+ if (FingerDataTransformed.LeftHand.Thumb >= 0.f) {
+ AddRotation("thumb_01_l", FingerDataTransformed.LeftHand.Thumb * Thumb01YAngleClosed, Hierarchy);
+ AddRotation("thumb_01_l", FingerDataTransformed.LeftHand.Thumb * ThumbAnglesClosed_N.X, Hierarchy, "Z");
+ AddRotation("thumb_02_l", FingerDataTransformed.LeftHand.Thumb * ThumbAnglesClosed_N.Y, Hierarchy);
+ AddRotation("thumb_03_l", FingerDataTransformed.LeftHand.Thumb * ThumbAnglesClosed_N.Z, Hierarchy);
+ }
+ else {
+ //AddRotation("thumb_01_l", FingerDataTransformed.LeftHand.Thumb * Thumb01YAngleClosed, Hierarchy);
+ //AddRotation("thumb_01_l", (FingerDataTransformed.LeftHand.Thumb / ReverseFactor) * -ThumbAnglesOpen_N.X, Hierarchy, "X");
+ AddRotation("thumb_01_l", (FingerDataTransformed.LeftHand.Thumb / ReverseFactor) * -ThumbAnglesOpen_N.X, Hierarchy);
+ AddRotation("thumb_01_l", (FingerDataTransformed.LeftHand.Thumb / ReverseFactor) * ThumbAnglesOpen_N.X, Hierarchy, "Z");
+ AddRotation("thumb_02_l", (FingerDataTransformed.LeftHand.Thumb / ReverseFactor) * ThumbAnglesOpen_N.Y, Hierarchy);
+ AddRotation("thumb_03_l", (FingerDataTransformed.LeftHand.Thumb / ReverseFactor) * ThumbAnglesOpen_N.Z, Hierarchy);
+ }
- AddRotation("ring_01_l", FingerData.LeftHand.Ring * RingAngles_N.X, Hierarchy);
- AddRotation("ring_02_l", FingerData.LeftHand.Ring * RingAngles_N.Y, Hierarchy);
- AddRotation("ring_03_l", FingerData.LeftHand.Ring * RingAngles_N.Z, Hierarchy);
+ if (FingerDataTransformed.LeftHand.Index >= 0.f) {
+ AddRotation("index_01_l", FingerDataTransformed.LeftHand.Index * IndexAnglesClosed_N.X, Hierarchy);
+ AddRotation("index_02_l", FingerDataTransformed.LeftHand.Index * IndexAnglesClosed_N.Y, Hierarchy);
+ AddRotation("index_03_l", FingerDataTransformed.LeftHand.Index * IndexAnglesClosed_N.Z, Hierarchy);
+ }
+ else {
+ AddRotation("index_01_l", FingerDataTransformed.LeftHand.Index * IndexAnglesOpen_N.X / ReverseFactor, Hierarchy);
+ AddRotation("index_02_l", FingerDataTransformed.LeftHand.Index * IndexAnglesOpen_N.Y / ReverseFactor, Hierarchy);
+ AddRotation("index_03_l", FingerDataTransformed.LeftHand.Index * IndexAnglesOpen_N.Z / ReverseFactor, Hierarchy);
+ }
- AddRotation("pinky_01_l", FingerData.LeftHand.Pinky * PinkyAngles_N.X, Hierarchy);
- AddRotation("pinky_02_l", FingerData.LeftHand.Pinky * PinkyAngles_N.Y, Hierarchy);
- AddRotation("pinky_03_l", FingerData.LeftHand.Pinky * PinkyAngles_N.Z, Hierarchy);
+ if (FingerDataTransformed.LeftHand.Middle >= 0.f) {
+ AddRotation("middle_01_l", FingerDataTransformed.LeftHand.Middle * MiddleAnglesClosed_N.X, Hierarchy);
+ AddRotation("middle_02_l", FingerDataTransformed.LeftHand.Middle * MiddleAnglesClosed_N.Y, Hierarchy);
+ AddRotation("middle_03_l", FingerDataTransformed.LeftHand.Middle * MiddleAnglesClosed_N.Z, Hierarchy);
+ }
+ else {
+ AddRotation("middle_01_l", FingerDataTransformed.LeftHand.Middle * MiddleAnglesOpen_N.X / ReverseFactor, Hierarchy);
+ AddRotation("middle_02_l", FingerDataTransformed.LeftHand.Middle * MiddleAnglesOpen_N.Y / ReverseFactor, Hierarchy);
+ AddRotation("middle_03_l", FingerDataTransformed.LeftHand.Middle * MiddleAnglesOpen_N.Z / ReverseFactor, Hierarchy);
+ }
+ if (FingerDataTransformed.LeftHand.Ring >= 0.f) {
+ AddRotation("ring_01_l", FingerDataTransformed.LeftHand.Ring * RingAnglesClosed_N.X, Hierarchy);
+ AddRotation("ring_02_l", FingerDataTransformed.LeftHand.Ring * RingAnglesClosed_N.Y, Hierarchy);
+ AddRotation("ring_03_l", FingerDataTransformed.LeftHand.Ring * RingAnglesClosed_N.Z, Hierarchy);
+ }
+ else {
+ AddRotation("ring_01_l", FingerDataTransformed.LeftHand.Ring * RingAnglesOpen_N.X / ReverseFactor, Hierarchy);
+ AddRotation("ring_02_l", FingerDataTransformed.LeftHand.Ring * RingAnglesOpen_N.Y / ReverseFactor, Hierarchy);
+ AddRotation("ring_03_l", FingerDataTransformed.LeftHand.Ring * RingAnglesOpen_N.Z / ReverseFactor, Hierarchy);
+ }
- AddRotation("thumb_01_r", FingerData.RightHand.Thumb * Thumb01YAngle, Hierarchy);
- AddRotation("thumb_01_r", FingerData.RightHand.Thumb * ThumbAngles_N.X, Hierarchy, "Z");
- AddRotation("thumb_02_r", FingerData.RightHand.Thumb * ThumbAngles_N.Y, Hierarchy);
- AddRotation("thumb_03_r", FingerData.RightHand.Thumb * ThumbAngles_N.Z, Hierarchy);
+ if (FingerDataTransformed.LeftHand.Pinky >= 0.f) {
+ AddRotation("pinky_01_l", FingerDataTransformed.LeftHand.Pinky * PinkyAnglesClosed_N.X, Hierarchy);
+ AddRotation("pinky_02_l", FingerDataTransformed.LeftHand.Pinky * PinkyAnglesClosed_N.Y, Hierarchy);
+ AddRotation("pinky_03_l", FingerDataTransformed.LeftHand.Pinky * PinkyAnglesClosed_N.Z, Hierarchy);
+ }
+ else {
+ AddRotation("pinky_01_l", FingerDataTransformed.LeftHand.Pinky * PinkyAnglesOpen_N.X / ReverseFactor, Hierarchy);
+ AddRotation("pinky_02_l", FingerDataTransformed.LeftHand.Pinky * PinkyAnglesOpen_N.Y / ReverseFactor, Hierarchy);
+ AddRotation("pinky_03_l", FingerDataTransformed.LeftHand.Pinky * PinkyAnglesOpen_N.Z / ReverseFactor, Hierarchy);
+ }
- AddRotation("index_01_r", FingerData.RightHand.Index * IndexAngles_N.X, Hierarchy);
- AddRotation("index_02_r", FingerData.RightHand.Index * IndexAngles_N.Y, Hierarchy);
- AddRotation("index_03_r", FingerData.RightHand.Index * IndexAngles_N.Z, Hierarchy);
+ if (FingerDataTransformed.RightHand.Thumb >= 0.f) {
+ AddRotation("thumb_01_r", FingerDataTransformed.RightHand.Thumb * Thumb01YAngleClosed, Hierarchy);
+ AddRotation("thumb_01_r", FingerDataTransformed.RightHand.Thumb * ThumbAnglesClosed_N.X, Hierarchy, "Z");
+ AddRotation("thumb_02_r", FingerDataTransformed.RightHand.Thumb * ThumbAnglesClosed_N.Y, Hierarchy);
+ AddRotation("thumb_03_r", FingerDataTransformed.RightHand.Thumb * ThumbAnglesClosed_N.Z, Hierarchy);
+ }
+ else {
+ AddRotation("thumb_01_r", FingerDataTransformed.RightHand.Thumb * Thumb01YAngleClosed, Hierarchy);
+ AddRotation("thumb_01_r", FingerDataTransformed.RightHand.Thumb * ThumbAnglesOpen_N.X / ReverseFactor, Hierarchy, "Z");
+ AddRotation("thumb_02_r", FingerDataTransformed.RightHand.Thumb * ThumbAnglesOpen_N.Y / ReverseFactor, Hierarchy);
+ AddRotation("thumb_03_r", FingerDataTransformed.RightHand.Thumb * ThumbAnglesOpen_N.Z / ReverseFactor, Hierarchy);
+ }
- AddRotation("middle_01_r", FingerData.RightHand.Middle * MiddleAngles_N.X, Hierarchy);
- AddRotation("middle_02_r", FingerData.RightHand.Middle * MiddleAngles_N.Y, Hierarchy);
- AddRotation("middle_03_r", FingerData.RightHand.Middle * MiddleAngles_N.Z, Hierarchy);
+ if (FingerDataTransformed.RightHand.Index >= 0.f) {
+ AddRotation("index_01_r", FingerDataTransformed.RightHand.Index * IndexAnglesClosed_N.X, Hierarchy);
+ AddRotation("index_02_r", FingerDataTransformed.RightHand.Index * IndexAnglesClosed_N.Y, Hierarchy);
+ AddRotation("index_03_r", FingerDataTransformed.RightHand.Index * IndexAnglesClosed_N.Z, Hierarchy);
+ }
+ else {
+ AddRotation("index_01_r", FingerDataTransformed.RightHand.Index * IndexAnglesOpen_N.X / ReverseFactor, Hierarchy);
+ AddRotation("index_02_r", FingerDataTransformed.RightHand.Index * IndexAnglesOpen_N.Y / ReverseFactor, Hierarchy);
+ AddRotation("index_03_r", FingerDataTransformed.RightHand.Index * IndexAnglesOpen_N.Z / ReverseFactor, Hierarchy);
+ }
- AddRotation("ring_01_r", FingerData.RightHand.Ring * RingAngles_N.X, Hierarchy);
- AddRotation("ring_02_r", FingerData.RightHand.Ring * RingAngles_N.Y, Hierarchy);
- AddRotation("ring_03_r", FingerData.RightHand.Ring * RingAngles_N.Z, Hierarchy);
+ if (FingerDataTransformed.RightHand.Middle >= 0.f) {
+ AddRotation("middle_01_r", FingerDataTransformed.RightHand.Middle * MiddleAnglesClosed_N.X, Hierarchy);
+ AddRotation("middle_02_r", FingerDataTransformed.RightHand.Middle * MiddleAnglesClosed_N.Y, Hierarchy);
+ AddRotation("middle_03_r", FingerDataTransformed.RightHand.Middle * MiddleAnglesClosed_N.Z, Hierarchy);
+ }
+ else {
+ AddRotation("middle_01_r", FingerDataTransformed.RightHand.Middle * MiddleAnglesOpen_N.X / ReverseFactor, Hierarchy);
+ AddRotation("middle_02_r", FingerDataTransformed.RightHand.Middle * MiddleAnglesOpen_N.Y / ReverseFactor, Hierarchy);
+ AddRotation("middle_03_r", FingerDataTransformed.RightHand.Middle * MiddleAnglesOpen_N.Z / ReverseFactor, Hierarchy);
+ }
- AddRotation("pinky_01_r", FingerData.RightHand.Pinky * PinkyAngles_N.X, Hierarchy);
- AddRotation("pinky_02_r", FingerData.RightHand.Pinky * PinkyAngles_N.Y, Hierarchy);
- AddRotation("pinky_03_r", FingerData.RightHand.Pinky * PinkyAngles_N.Z, Hierarchy);
+ if (FingerDataTransformed.RightHand.Ring >= 0.f) {
+ AddRotation("ring_01_r", FingerDataTransformed.RightHand.Ring * RingAnglesClosed_N.X, Hierarchy);
+ AddRotation("ring_02_r", FingerDataTransformed.RightHand.Ring * RingAnglesClosed_N.Y, Hierarchy);
+ AddRotation("ring_03_r", FingerDataTransformed.RightHand.Ring * RingAnglesClosed_N.Z, Hierarchy);
+ }
+ else {
+ AddRotation("ring_01_r", FingerDataTransformed.RightHand.Ring* RingAnglesOpen_N.X / ReverseFactor, Hierarchy);
+ AddRotation("ring_02_r", FingerDataTransformed.RightHand.Ring* RingAnglesOpen_N.Y / ReverseFactor, Hierarchy);
+ AddRotation("ring_03_r", FingerDataTransformed.RightHand.Ring* RingAnglesOpen_N.Z / ReverseFactor, Hierarchy);
+ }
+ if (FingerDataTransformed.RightHand.Pinky >= 0.f) {
+ AddRotation("pinky_01_r", FingerDataTransformed.RightHand.Pinky * PinkyAnglesClosed_N.X, Hierarchy);
+ AddRotation("pinky_02_r", FingerDataTransformed.RightHand.Pinky * PinkyAnglesClosed_N.Y, Hierarchy);
+ AddRotation("pinky_03_r", FingerDataTransformed.RightHand.Pinky * PinkyAnglesClosed_N.Z, Hierarchy);
+ }
+ else {
+ AddRotation("pinky_01_r", FingerDataTransformed.RightHand.Pinky* PinkyAnglesOpen_N.X / ReverseFactor, Hierarchy);
+ AddRotation("pinky_02_r", FingerDataTransformed.RightHand.Pinky* PinkyAnglesOpen_N.Y / ReverseFactor, Hierarchy);
+ AddRotation("pinky_03_r", FingerDataTransformed.RightHand.Pinky* PinkyAnglesOpen_N.Z / ReverseFactor, Hierarchy);
+ }
//SPLAYS
diff --git a/Source/MoCapPlugin/Public/MCDefines.h b/Source/MoCapPlugin/Public/MCDefines.h
index 49400bf..bf94618 100644
--- a/Source/MoCapPlugin/Public/MCDefines.h
+++ b/Source/MoCapPlugin/Public/MCDefines.h
@@ -374,4 +374,39 @@ public:
UPROPERTY(BlueprintReadWrite)
bool loaded = false;
+};
+
+USTRUCT(BlueprintType)
+struct FFingerAngles {
+ GENERATED_BODY()
+
+public:
+
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ FVector Thumb;
+
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ FVector Index;
+
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ FVector Middle;
+
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ FVector Ring;
+
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ FVector Pinky;
+
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ float Thumb_Index;
+
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ float Index_Middle;
+
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ float Middle_Ring;
+
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ float Ring_Pinky;
+
};
\ No newline at end of file
diff --git a/Source/MoCapPlugin/Public/MCRigUnits.h b/Source/MoCapPlugin/Public/MCRigUnits.h
index 80edb10..06b49ad 100644
--- a/Source/MoCapPlugin/Public/MCRigUnits.h
+++ b/Source/MoCapPlugin/Public/MCRigUnits.h
@@ -45,19 +45,34 @@ struct FRigUnit_ApplyFingerData : public FRigUnitMutable
FFingerData FingerData;
UPROPERTY(meta = (Input))
- FVector ThumbAngles;
+ FVector ThumbAnglesOpen;
UPROPERTY(meta = (Input))
- FVector IndexAngles;
+ FVector IndexAnglesOpen;
UPROPERTY(meta = (Input))
- FVector MiddleAngles;
+ FVector MiddleAnglesOpen;
UPROPERTY(meta = (Input))
- FVector RingAngles;
+ FVector RingAnglesOpen;
UPROPERTY(meta = (Input))
- FVector PinkyAngles;
+ FVector PinkyAnglesOpen;
+
+ UPROPERTY(meta = (Input))
+ FVector ThumbAnglesClosed;
+
+ UPROPERTY(meta = (Input))
+ FVector IndexAnglesClosed;
+
+ UPROPERTY(meta = (Input))
+ FVector MiddleAnglesClosed;
+
+ UPROPERTY(meta = (Input))
+ FVector RingAnglesClosed;
+
+ UPROPERTY(meta = (Input))
+ FVector PinkyAnglesClosed;
UPROPERTY(meta = (Input))
float Thumb_Index_Angle;
--
GitLab