From b309dcc2db582d5fde72f8c3d1fe1535d2a6b0cf Mon Sep 17 00:00:00 2001 From: pnossol <patrick.nossol@gmail.com> Date: Thu, 19 Jan 2023 16:23:46 +0100 Subject: [PATCH] added chest control --- Content/MoCapMap.umap | 4 +- Content/SaveSequenceRig.uasset | 4 +- Source/MoCapPlugin/Private/MCController.cpp | 71 ++++++++++++++++++--- Source/MoCapPlugin/Public/MCController.h | 9 +++ 4 files changed, 75 insertions(+), 13 deletions(-) diff --git a/Content/MoCapMap.umap b/Content/MoCapMap.umap index dab8489..14a7dbb 100644 --- a/Content/MoCapMap.umap +++ b/Content/MoCapMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4b9087088e29bf1943a925f5ba241b0551795079c0b28ec3327ebefaf1902100 -size 88539 +oid sha256:e411c0cd1771015cf525991322daa708792baa510251ad631d8241e420363934 +size 88754 diff --git a/Content/SaveSequenceRig.uasset b/Content/SaveSequenceRig.uasset index fbdc77b..cc62a67 100644 --- a/Content/SaveSequenceRig.uasset +++ b/Content/SaveSequenceRig.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ac6d20858a789b86ebb648cd252b56127fa3ffd700170f9e052c8c82abd2365 -size 5134196 +oid sha256:4e140be55357a682f3c7ac027bc8bfa52cdc6458d4442d75231e022321eb320c +size 5131100 diff --git a/Source/MoCapPlugin/Private/MCController.cpp b/Source/MoCapPlugin/Private/MCController.cpp index 5530f3e..05e8468 100644 --- a/Source/MoCapPlugin/Private/MCController.cpp +++ b/Source/MoCapPlugin/Private/MCController.cpp @@ -380,13 +380,6 @@ bool AMCController::PreprocessRecording(float StartHaltingPoint, float EndHaltin return false; } - //found no end -> add one - /*if (!AnimSaveState.AnimData.Last().IsEnd) { - AnimSaveState.AnimData.Push(FProcessedAnimData()); - AnimSaveState.AnimData.Last().Timestamp = LastStamp + FTimespan::FromMilliseconds(10); - AnimSaveState.AnimData.Last().IsEnd = true; - }*/ - //----process the anim data---- //---Sensor turned off -> interpolate @@ -577,10 +570,70 @@ bool AMCController::PreprocessRecording(float StartHaltingPoint, float EndHaltin } } + //---Controlling Chest Position--- + if (ChestControlFactor > 0.f) { + + FVector AvgChestPos; + FVector AvgHipPos; + FVector MoveChest; + for (int i = 0; i < AnimSaveState.AnimData.Num(); i++) { + + FProcessedAnimData& AnimData = AnimSaveState.AnimData[i]; + + if (AnimData.IsMarker || AnimData.IsEnd) { + //average chest position + AvgChestPos = FVector::ZeroVector; + int Num = 0; + for (int j = i + 1; j < AnimSaveState.AnimData.Num(); j++) { + if (AnimSaveState.AnimData[j].IsMarker || AnimSaveState.AnimData[j].IsEnd) { + break; + } + Num++; + } + for (int j = i + 1; j <= i + Num; j++) { + AvgChestPos += AnimSaveState.AnimData[j].SensorData.GetEntry(EBodyPart::UpperBody)->Pos / (float)Num; + } + //average hip position + AvgHipPos = FVector::ZeroVector; + for (int j = i + 1; j <= i + Num; j++) { + AvgHipPos += AnimSaveState.AnimData[j].SensorData.GetEntry(EBodyPart::LowerBody)->Pos / (float)Num; + } + MoveChest = ChestControlFactor * (AvgHipPos + ChestControlCenter - AvgChestPos); + MoveChest.X = 0.f; + MoveChest.Z = 0.f; + continue; + } + + FSensorData& SensorData = AnimData.SensorData; + + //move chest + FSensorDataEntry* ChestEntry = SensorData.GetEntry(EBodyPart::UpperBody); + ChestEntry->Pos += MoveChest; + if (ChestKeepLength) { + FSensorDataEntry* HipEntry = SensorData.GetEntry(EBodyPart::LowerBody); + FVector OldPos = ChestEntry->Pos; + ChestEntry->Pos = HipEntry->Pos + (AvgHipPos - AvgChestPos).Size() * (ChestEntry->Pos - HipEntry->Pos).Normalize(); + MoveChest += ChestEntry->Pos - OldPos; + } + + //move upper body parts to fit chest + for (int j = 0; j < EBodyPart::LAST; j++) { + + EBodyPart Type = EBodyPart(j); + if (Type == EBodyPart::UpperBody || Type == EBodyPart::LowerBody || Type == EBodyPart::FootL || Type == EBodyPart::FootR) { + continue; + } + + FSensorDataEntry* Entry = SensorData.GetEntry(Type); + Entry->Pos += MoveChest; + + } + + } + } + //---return to default pose at start and end--- - FSensorData DefaultPose; - //float DefaultPoseTakingTime = 0.3f; if (ReturnToDefaultPose) { //Take default pose from time or file diff --git a/Source/MoCapPlugin/Public/MCController.h b/Source/MoCapPlugin/Public/MCController.h index e800cae..2dfdd3e 100644 --- a/Source/MoCapPlugin/Public/MCController.h +++ b/Source/MoCapPlugin/Public/MCController.h @@ -203,6 +203,15 @@ public: UPROPERTY(EditAnywhere, meta = (DisplayName = "Default Pose Time To Interpolate To It", Category = "MotionCapture Anim")) float DefaultPoseTakingTime = 0.6f; + UPROPERTY(EditAnywhere, meta = (DisplayName = "Chest Control Center", Category = "MotionCapture Anim")) + FVector ChestControlCenter; + + UPROPERTY(EditAnywhere, meta = (DisplayName = "Chest Control Factor", Category = "MotionCapture Anim")) + float ChestControlFactor = 0.0; + + //UPROPERTY(EditAnywhere, meta = (DisplayName = "Chest Control Keep Length", Category = "MotionCapture Anim")) + bool ChestKeepLength = false; + UPROPERTY(EditAnywhere, meta = (DisplayName = "Hip Reducing Center", Category = "MotionCapture Anim")) FVector HipReducingCenter; -- GitLab