diff --git a/Content/MoCapMap.umap b/Content/MoCapMap.umap index fa980d12c8ca88674f142a6b60b51c15e1d576a6..80948ac3806f02060b776ea40b45621104e6ac1d 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 542c1c49342220fceeb4665c404f7e1787d561e5..f4f8ac454bc254e0e239bbc86f176ff176fa91f4 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 1ff679fa2aae5f70b15fb50f4c3baa69af11010c..0992e414e6ce5cc809d041a4e1e49bfc16e5a6d8 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 bfdca9bc79f71466211d8b60e1dc48eb008d3530..5c0391ce17ad190aab4f4e3a9f879f9c394c4538 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 86d7f646b574a3ce5b0b14e4de9cad2be2e00d82..792b3ec37ed8be667dbd9be1daa0b3563015ca80 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;