From 3b85f3489f17c64c8101aa11f43c75134eee6655 Mon Sep 17 00:00:00 2001 From: pnossol <patrick.nossol@gmail.com> Date: Sun, 14 Aug 2022 10:50:04 +0200 Subject: [PATCH] Changed Save Sequence Rig (not majorly) fixed offsets, configurable smoothing parameters --- Content/MoCapMap.umap | 4 +- Content/SaveSequenceRig.uasset | 4 +- Source/MoCapPlugin/Private/MCController.cpp | 121 +------------------- Source/MoCapPlugin/Private/MCRigUnits.cpp | 8 +- Source/MoCapPlugin/Public/MCController.h | 9 +- 5 files changed, 18 insertions(+), 128 deletions(-) diff --git a/Content/MoCapMap.umap b/Content/MoCapMap.umap index fa980d1..80948ac 100644 --- a/Content/MoCapMap.umap +++ b/Content/MoCapMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c991a894a005d173fbb1cae58880ae8ba8db5eb42cb65fad7bb81bca9cd119a4 -size 35283 +oid sha256:ad2b88803d2034732601fe2e6868c8f8599ecb347bf41b58e7a86ce6dbd739a4 +size 35369 diff --git a/Content/SaveSequenceRig.uasset b/Content/SaveSequenceRig.uasset index 542c1c4..f4f8ac4 100644 --- a/Content/SaveSequenceRig.uasset +++ b/Content/SaveSequenceRig.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d4d1fcbf2205b1f12b9963bfd74175a6abc8de389cf2085455519671f9d70de -size 4922933 +oid sha256:f9dbb0d293961c9daa5bd3a30d51d058e9590892fd0b1f60b4ecae1f23492c69 +size 4927211 diff --git a/Source/MoCapPlugin/Private/MCController.cpp b/Source/MoCapPlugin/Private/MCController.cpp index 1ff679f..0992e41 100644 --- a/Source/MoCapPlugin/Private/MCController.cpp +++ b/Source/MoCapPlugin/Private/MCController.cpp @@ -338,19 +338,6 @@ void AMCController::PreprocessRecording() { } - //----pull down hip amount---- - - float PullDownHip = 0; - { - FVector OffsetPos = AnimSaveState.AnimData[0].SensorData.LowerBody.Pos; - float diff = OffsetPos.Z; - FQuat OffsetRot = AnimSaveState.AnimData[0].SensorData.LowerBody.Rot; - OffsetRot = OffsetRot * FQuat(FVector(0, 0, 1), FMath::DegreesToRadians(180)); - AnimSaveState.Pawn->OffsetSensorData(EBodyPart::LowerBody, OffsetPos, OffsetRot); - diff = OffsetPos.Z - diff; - PullDownHip = diff; - } - //----process the anim data---- //---Sensor turned off -> interpolate @@ -437,100 +424,8 @@ void AMCController::PreprocessRecording() { } - //---other processing--- - for (int i = 0; i < AnimSaveState.AnimData.Num(); i++) { - - FProcessedAnimData& AnimData = AnimSaveState.AnimData[i]; - - if (AnimData.IsMarker || AnimData.IsEnd) { - continue; - } - - //process sensor data - FSensorData& SensorData = AnimData.SensorData; - for (int j = 0; j < EBodyPart::LAST; j++) { - - EBodyPart Type = EBodyPart(j); - FSensorDataEntry* Entry = SensorData.GetEntry(Type); - - //pull down hip - if (Type == EBodyPart::LowerBody) { - FQuat Swing, Twist; - Entry->Rot.ToSwingTwist(FVector(0, 0, 1), Swing, Twist); - float angle = FMath::RadiansToDegrees(Swing.GetAngle()); - if (angle > 180) { - angle -= 360; - } - //Entry.Pos.Z += PullDownHip * FMath::Abs(angle / 180.f); - } - - //analyse z pos of feet - if (Type == EBodyPart::LowerLegL) { - - int window = 5; - bool isMin = true; - for (int w = 1; w <= window; w++) { - if (i + w < AnimSaveState.AnimData.Num()) { - FVector Pos = AnimSaveState.AnimData[i + w].SensorData.LowerLegL.Pos; - if (Entry->Pos.Z <= Pos.Z) { - isMin = false; - break; - } - } - if (i - w >= 0) { - FVector Pos = AnimSaveState.AnimData[i - w].SensorData.LowerLegL.Pos; - if (Entry->Pos.Z <= Pos.Z) { - isMin = false; - break; - } - } - } - - if (isMin) { - AnimSaveState.LowestPoints.Push(Entry->Pos.Z); - } - - //offset - - FVector OffsetPos = Entry->Pos; - FQuat OffsetRot = Entry->Rot; - AnimSaveState.Pawn->OffsetSensorData(Type, OffsetPos, OffsetRot); - - isMin = true; - for (int w = 1; w <= window; w++) { - if (i + w < AnimSaveState.AnimData.Num()) { - FVector Pos = AnimSaveState.AnimData[i + w].SensorData.LowerLegL.Pos; - if (OffsetPos.Z <= Pos.Z) { - isMin = false; - break; - } - } - if (i - w >= 0) { - FVector Pos = AnimSaveState.AnimData[i - w].SensorData.LowerLegL.Pos; - if (OffsetPos.Z <= Pos.Z) { - isMin = false; - break; - } - } - } - - if (isMin) { - AnimSaveState.LowestPointsOffset.Push(OffsetPos.Z); - } - - } - - } - - //process finger data - if (bFingerTrackingEnabled) { - - } - - } - //---Smoothing of legs--- - int smoothTimes = 5; + int smoothTimes = LegSmoothTimes; for (int l = 0; l < smoothTimes; l++) { TArray<FProcessedAnimData> OldAnimData = AnimSaveState.AnimData; @@ -549,7 +444,7 @@ void AMCController::PreprocessRecording() { FQuat RotRes = OldAnimData[i].SensorData.GetEntry(BodyPart)->Rot; int RotNum = 1; - int window = 3; + int window = LegSmoothWindow; int sum = 2 * window + 1; FVector LastPos = OldAnimData[i].SensorData.GetEntry(BodyPart)->Pos; @@ -604,8 +499,6 @@ void AMCController::PreprocessRecording() { if (GestureHoldExcessTime > 0.f) { - - for (int i = 1; i < AnimSaveState.AnimData.Num(); i++) { FProcessedAnimData& AnimData = AnimSaveState.AnimData[i]; @@ -704,21 +597,11 @@ void AMCController::PreprocessRecording() { //debugging things std::string speed = ""; - std::string lp = ""; - std::string lpo = ""; for (int i = 0; i < GestureSpeed.Num(); i++) { speed += "\n" + std::to_string(GestureSpeed[i]); } - for (int i = 0; i < AnimSaveState.LowestPoints.Num(); i++) { - lp += "\n" + std::to_string(AnimSaveState.LowestPoints[i]); - } - - for (int i = 0; i < AnimSaveState.LowestPointsOffset.Num(); i++) { - lpo += "\n" + std::to_string(AnimSaveState.LowestPointsOffset[i]); - } - } diff --git a/Source/MoCapPlugin/Private/MCRigUnits.cpp b/Source/MoCapPlugin/Private/MCRigUnits.cpp index bfdca9b..5c0391c 100644 --- a/Source/MoCapPlugin/Private/MCRigUnits.cpp +++ b/Source/MoCapPlugin/Private/MCRigUnits.cpp @@ -276,8 +276,12 @@ FRigUnit_AdditionalOffsets_Execute() { for (const auto& Offset : Offsets) { FTransform Transform = Hierarchy->GetGlobalTransform(Offset.name); - Transform.SetRotation((Transform.GetRotation().Rotator() + *Offset.rot).Quaternion()); - Hierarchy->SetGlobalTransform(Offset.name, Transform); + + FQuat NormOffsetRot = (*Offset.rot).Quaternion(); + NormOffsetRot.Normalize(); + FTransform OffsetTransform(NormOffsetRot, *Offset.pos); + + Hierarchy->SetGlobalTransform(Offset.name, OffsetTransform * Transform); } } diff --git a/Source/MoCapPlugin/Public/MCController.h b/Source/MoCapPlugin/Public/MCController.h index 86d7f64..792b3ec 100644 --- a/Source/MoCapPlugin/Public/MCController.h +++ b/Source/MoCapPlugin/Public/MCController.h @@ -28,9 +28,6 @@ USTRUCT() struct FAnimSaveState { GENERATED_BODY() - TArray<float> LowestPoints; - TArray<float> LowestPointsOffset; - TArray<FString> StringData; TArray<FProcessedAnimData> AnimData; int CurrentEntryIndex; @@ -142,6 +139,12 @@ public: UPROPERTY(EditAnywhere, meta = (DisplayName = "Gesture Hold Scale Excess Time", Category = "MotionCapture")) float GestureHoldExcessTime = 0.f; + UPROPERTY(EditAnywhere, meta = (DisplayName = "Nr of Leg Smoothing Iterations", Category = "MotionCapture")) + int LegSmoothTimes = 5; + + UPROPERTY(EditAnywhere, meta = (DisplayName = "Leg Smoothing Neighbor Window", Category = "MotionCapture")) + int LegSmoothWindow = 3; + UPROPERTY(EditAnywhere, meta = (DisplayName = "Additional Post Processing Offsets", Category = "MotionCapture")) FAdditionalOffsets AdditionalOffsets; -- GitLab