diff --git a/Content/MoCapMap.umap b/Content/MoCapMap.umap index 3a130633790a52cf2098f82ea526f22a54d7b645..fa980d12c8ca88674f142a6b60b51c15e1d576a6 100644 --- a/Content/MoCapMap.umap +++ b/Content/MoCapMap.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a1540b30dea1f08211b890e124aba4d3bef862ea82618770c9118f567cb2e8d -size 35280 +oid sha256:c991a894a005d173fbb1cae58880ae8ba8db5eb42cb65fad7bb81bca9cd119a4 +size 35283 diff --git a/Content/SaveSequenceAnimBP.uasset b/Content/SaveSequenceAnimBP.uasset index 7bc7422aa8cfdec64e066f412aec4ee49d20e50b..a0fd833ee3dee7011f0ebccb37372b340ecf274a 100644 --- a/Content/SaveSequenceAnimBP.uasset +++ b/Content/SaveSequenceAnimBP.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:05c883fe924dd31377fef6dec79b577739c1f2e050048659540953e6f30d2851 -size 206275 +oid sha256:1cc6fe736ef960476d55b66fb8dec90628b3c630dc384c80409c6d0dd4649058 +size 210290 diff --git a/Content/SaveSequenceRig.uasset b/Content/SaveSequenceRig.uasset index 3f03ff9082ba6b67cd90341f5a2efe2199fed8ee..542c1c49342220fceeb4665c404f7e1787d561e5 100644 --- a/Content/SaveSequenceRig.uasset +++ b/Content/SaveSequenceRig.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ccbeedce4980c6a425a2500298b6f7424dfe0fc1ebe811591bf064c85d62981c -size 4552248 +oid sha256:3d4d1fcbf2205b1f12b9963bfd74175a6abc8de389cf2085455519671f9d70de +size 4922933 diff --git a/Content/bein2.uasset b/Content/bein2.uasset new file mode 100644 index 0000000000000000000000000000000000000000..ed9f8b4d2080159633fde4c424c9f317a8e285e2 --- /dev/null +++ b/Content/bein2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:974a53a571ca234c46f45dbe6478d6ceb5ca6c4febfcb90f223e5b93abc1c12d +size 4894386 diff --git a/Source/MoCapPlugin/Private/MCController.cpp b/Source/MoCapPlugin/Private/MCController.cpp index 5da59f83dd55f46f708b0f9dcee63bd267db1158..1ff679fa2aae5f70b15fb50f4c3baa69af11010c 100644 --- a/Source/MoCapPlugin/Private/MCController.cpp +++ b/Source/MoCapPlugin/Private/MCController.cpp @@ -529,6 +529,75 @@ void AMCController::PreprocessRecording() { } + //---Smoothing of legs--- + int smoothTimes = 5; + for (int l = 0; l < smoothTimes; l++) { + + TArray<FProcessedAnimData> OldAnimData = AnimSaveState.AnimData; + + for (int i = 0; i < AnimSaveState.AnimData.Num(); i++) { + + FProcessedAnimData& AnimData = AnimSaveState.AnimData[i]; + if (AnimData.IsMarker || AnimData.IsEnd) { + continue; + } + + TArray<EBodyPart> BodyParts = { EBodyPart::LowerBody, EBodyPart::FootL, EBodyPart::FootR }; + for (EBodyPart BodyPart : BodyParts) { + + FVector PosRes; + FQuat RotRes = OldAnimData[i].SensorData.GetEntry(BodyPart)->Rot; + int RotNum = 1; + + int window = 3; + int sum = 2 * window + 1; + + FVector LastPos = OldAnimData[i].SensorData.GetEntry(BodyPart)->Pos; + FQuat LastRot = OldAnimData[i].SensorData.GetEntry(BodyPart)->Rot; + for (int k = 1; k < window; k++) { + int j = i - k; + if (j < 0 || OldAnimData[j].IsMarker) { + PosRes += ((window - k) / (float)sum) * LastPos; + RotRes = FQuat::Slerp(RotRes, LastRot, (float)RotNum / (float)(RotNum + (window - k))); + break; + } + else { + LastPos = OldAnimData[j].SensorData.GetEntry(BodyPart)->Pos; + PosRes += LastPos / (float)sum; + LastRot = OldAnimData[j].SensorData.GetEntry(BodyPart)->Rot; + RotRes = FQuat::Slerp(RotRes, LastRot, (float)RotNum / (RotNum + 1.f)); + RotNum++; + } + } + + LastPos = OldAnimData[i].SensorData.GetEntry(BodyPart)->Pos; + LastRot = OldAnimData[i].SensorData.GetEntry(BodyPart)->Rot; + for (int k = 0; k < window; k++) { + int j = i + k; + if (j >= OldAnimData.Num() || OldAnimData[j].IsMarker || OldAnimData[j].IsEnd) { + PosRes += ((window - k) / (float)sum) * LastPos; + RotRes = FQuat::Slerp(RotRes, LastRot, (float)RotNum / (float)(RotNum + (window - k))); + break; + } + else { + LastPos = OldAnimData[j].SensorData.GetEntry(BodyPart)->Pos; + PosRes += LastPos / (float)sum; + LastRot = OldAnimData[j].SensorData.GetEntry(BodyPart)->Rot; + RotRes = FQuat::Slerp(RotRes, LastRot, (float)RotNum / (RotNum + 1.f)); + RotNum++; + } + } + + if (BodyPart != EBodyPart::LowerBody) { + AnimSaveState.AnimData[i].SensorData.GetEntry(BodyPart)->Pos = PosRes; + } + AnimSaveState.AnimData[i].SensorData.GetEntry(BodyPart)->Rot = RotRes; + + } + + } + } + //---find last slow part of the gesture and scale it up--- TArray<float> GestureSpeed; @@ -971,6 +1040,8 @@ void AMCController::SaveAnimation() { IsSavingToAnim = true; AnimSaveState.WaitForAnimInstance = true; + AnimSaveState.Pawn->GetAnimInstance()->AdditionalOffsets = AdditionalOffsets; + PreprocessRecording(); AnimSaveState.Pawn->GetAnimInstance()->DoRig = true; diff --git a/Source/MoCapPlugin/Private/MCRigUnits.cpp b/Source/MoCapPlugin/Private/MCRigUnits.cpp index 29158ecd5ca6141cf6f2ef4cc564186ca5c777ae..bfdca9bc79f71466211d8b60e1dc48eb008d3530 100644 --- a/Source/MoCapPlugin/Private/MCRigUnits.cpp +++ b/Source/MoCapPlugin/Private/MCRigUnits.cpp @@ -240,4 +240,45 @@ FRigUnit_FromXYZW_Execute() { Quat = FQuat(X, Y, Z, W); +} + +FRigUnit_AdditionalOffsets::FRigUnit_AdditionalOffsets() { + +} + +struct OffsetHelperEntry { + FName name; + const FRotator* rot; + const FVector* pos; + OffsetHelperEntry() { } + OffsetHelperEntry(const FName& name, const FRotator* rot, const FVector* pos) + : name(name), rot(rot), pos(pos) {} +}; + +FRigUnit_AdditionalOffsets_Execute() { + DECLARE_SCOPE_HIERARCHICAL_COUNTER_RIGUNIT() + + FRigControlHierarchy* Hierarchy = ExecuteContext.GetControls(); + + if (Hierarchy) { + + OffsetHelperEntry Offsets[] = { + OffsetHelperEntry("Head", &AdditionalOffsets.HeadRotOffset, &AdditionalOffsets.HeadPosOffset), + OffsetHelperEntry("HandL", &AdditionalOffsets.HandLRotOffset, &AdditionalOffsets.HandLPosOffset), + OffsetHelperEntry("HandR", &AdditionalOffsets.HandRRotOffset, &AdditionalOffsets.HandRPosOffset), + OffsetHelperEntry("CalfL", &AdditionalOffsets.LowerLegLRotOffset, &AdditionalOffsets.LowerLegLPosOffset), + OffsetHelperEntry("CalfR", &AdditionalOffsets.LowerLegRRotOffset, &AdditionalOffsets.LowerLegRPosOffset), + OffsetHelperEntry("LowerArmL", &AdditionalOffsets.LowerArmLRotOffset, &AdditionalOffsets.LowerArmLPosOffset), + OffsetHelperEntry("LowerArmR", &AdditionalOffsets.LowerArmRRotOffset, &AdditionalOffsets.LowerArmRPosOffset), + OffsetHelperEntry("Hip", &AdditionalOffsets.LowerBodyRotOffset, &AdditionalOffsets.LowerBodyPosOffset), + OffsetHelperEntry("Spine03", &AdditionalOffsets.UpperBodyRotOffset, &AdditionalOffsets.UpperBodyPosOffset) + }; + + for (const auto& Offset : Offsets) { + FTransform Transform = Hierarchy->GetGlobalTransform(Offset.name); + Transform.SetRotation((Transform.GetRotation().Rotator() + *Offset.rot).Quaternion()); + Hierarchy->SetGlobalTransform(Offset.name, Transform); + } + + } } \ No newline at end of file diff --git a/Source/MoCapPlugin/Public/MCAnimInstance.h b/Source/MoCapPlugin/Public/MCAnimInstance.h index 0fbe3289dbb352e4a5b90d2687cac08dadce4c61..afd444d25ab8fb167cdcc8f632db63e3233dac46 100644 --- a/Source/MoCapPlugin/Public/MCAnimInstance.h +++ b/Source/MoCapPlugin/Public/MCAnimInstance.h @@ -32,6 +32,9 @@ public: UPROPERTY(BlueprintReadWrite) FSensorOffsets SensorOffsets; + UPROPERTY(BlueprintReadWrite) + FAdditionalOffsets AdditionalOffsets; + UPROPERTY(BlueprintReadWrite) FBodyProportionStruct Measurements; diff --git a/Source/MoCapPlugin/Public/MCController.h b/Source/MoCapPlugin/Public/MCController.h index 0f4dab36d9ace3269e4ef48cd23584a6a035d98a..86d7f646b574a3ce5b0b14e4de9cad2be2e00d82 100644 --- a/Source/MoCapPlugin/Public/MCController.h +++ b/Source/MoCapPlugin/Public/MCController.h @@ -142,4 +142,7 @@ public: UPROPERTY(EditAnywhere, meta = (DisplayName = "Gesture Hold Scale Excess Time", Category = "MotionCapture")) float GestureHoldExcessTime = 0.f; + UPROPERTY(EditAnywhere, meta = (DisplayName = "Additional Post Processing Offsets", Category = "MotionCapture")) + FAdditionalOffsets AdditionalOffsets; + }; diff --git a/Source/MoCapPlugin/Public/MCDefines.h b/Source/MoCapPlugin/Public/MCDefines.h index 226ab52450d4b9fc1d7f44724355aa12c72dbf50..49400bf80a8135f10e0f4e2aa4052aab9cfacf47 100644 --- a/Source/MoCapPlugin/Public/MCDefines.h +++ b/Source/MoCapPlugin/Public/MCDefines.h @@ -262,6 +262,66 @@ struct FSensorOffsets { }; +USTRUCT(BlueprintType) +struct FAdditionalOffsets { + GENERATED_BODY() + + UPROPERTY(EditAnywhere) + FRotator HeadRotOffset = FRotator::ZeroRotator; + + UPROPERTY(EditAnywhere) + FRotator HandLRotOffset = FRotator::ZeroRotator; + + UPROPERTY(EditAnywhere) + FRotator HandRRotOffset = FRotator::ZeroRotator; + + UPROPERTY(EditAnywhere) + FRotator LowerLegLRotOffset = FRotator::ZeroRotator; + + UPROPERTY(EditAnywhere) + FRotator LowerLegRRotOffset = FRotator::ZeroRotator; + + UPROPERTY(EditAnywhere) + FRotator LowerArmLRotOffset = FRotator::ZeroRotator; + + UPROPERTY(EditAnywhere) + FRotator LowerArmRRotOffset = FRotator::ZeroRotator; + + UPROPERTY(EditAnywhere) + FRotator LowerBodyRotOffset = FRotator::ZeroRotator; + + UPROPERTY(EditAnywhere) + FRotator UpperBodyRotOffset = FRotator::ZeroRotator; + + UPROPERTY(EditAnywhere) + FVector HeadPosOffset = FVector::ZeroVector; + + UPROPERTY(EditAnywhere) + FVector HandLPosOffset = FVector::ZeroVector; + + UPROPERTY(EditAnywhere) + FVector HandRPosOffset = FVector::ZeroVector; + + UPROPERTY(EditAnywhere) + FVector LowerLegLPosOffset = FVector::ZeroVector; + + UPROPERTY(EditAnywhere) + FVector LowerLegRPosOffset = FVector::ZeroVector; + + UPROPERTY(EditAnywhere) + FVector LowerArmLPosOffset = FVector::ZeroVector; + + UPROPERTY(EditAnywhere) + FVector LowerArmRPosOffset = FVector::ZeroVector; + + UPROPERTY(EditAnywhere) + FVector LowerBodyPosOffset = FVector::ZeroVector; + + UPROPERTY(EditAnywhere) + FVector UpperBodyPosOffset = FVector::ZeroVector; + +}; + struct FMCAppliedLength { float applied = 1; float original = 1; diff --git a/Source/MoCapPlugin/Public/MCRigUnits.h b/Source/MoCapPlugin/Public/MCRigUnits.h index 0e803b94157ea63a4d19217117f198e4d24cac6a..80edb1031f3ee31b25dbde7fb66ece2b54e7fb17 100644 --- a/Source/MoCapPlugin/Public/MCRigUnits.h +++ b/Source/MoCapPlugin/Public/MCRigUnits.h @@ -131,4 +131,19 @@ struct FRigUnit_FromXYZW : public FRigUnit UPROPERTY(meta = (Output)) FQuat Quat; +}; + +USTRUCT(meta = (DisplayName = "AdditionalOffsets", PrototypeName = "AdditionalOffsets", Category = "Hierarchy", NodeColor = "0.05 0.25 0.05")) +struct FRigUnit_AdditionalOffsets : public FRigUnitMutable +{ + GENERATED_BODY() + + FRigUnit_AdditionalOffsets(); + + RIGVM_METHOD() + virtual void Execute(const FRigUnitContext& Context) override; + + UPROPERTY(meta = (Input)) + FAdditionalOffsets AdditionalOffsets; + }; \ No newline at end of file