From 9e168acb2fae4675c4068ef5e69063a7e9f36d45 Mon Sep 17 00:00:00 2001 From: Denys Kuznietsov <animdenys@gmail.com> Date: Tue, 12 Oct 2021 17:27:53 +0200 Subject: [PATCH] OVRBridge now supports MetaHuman Models --- .../Private/VHFacialExpressions.cpp | 2 +- .../CharacterPlugin/Private/VHOVRBridge.cpp | 8 +++++++- Source/CharacterPlugin/Private/VHSaccades.cpp | 19 ++++++++++++------- .../Public/VHFacialExpressions.h | 4 +++- Source/CharacterPlugin/Public/VHSaccades.h | 3 ++- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/Source/CharacterPlugin/Private/VHFacialExpressions.cpp b/Source/CharacterPlugin/Private/VHFacialExpressions.cpp index 0a62ad8e..8eb9c5de 100644 --- a/Source/CharacterPlugin/Private/VHFacialExpressions.cpp +++ b/Source/CharacterPlugin/Private/VHFacialExpressions.cpp @@ -269,7 +269,7 @@ bool UVHFacialExpressions::UpdateFACS(Emotions Emotion, float DeltaTime) return isInterpolationFinished; } -const TMap<FName, float>& UVHFacialExpressions::GetCurrentAnimationValues() const +TMap<FName, float>& UVHFacialExpressions::GetCurrentAnimationValues() { return CurrentAnimationValues; } diff --git a/Source/CharacterPlugin/Private/VHOVRBridge.cpp b/Source/CharacterPlugin/Private/VHOVRBridge.cpp index 16162987..c1491122 100644 --- a/Source/CharacterPlugin/Private/VHOVRBridge.cpp +++ b/Source/CharacterPlugin/Private/VHOVRBridge.cpp @@ -41,6 +41,8 @@ void UVHOVRBridge::SetPredictions(TArray<float> PredictedVisemeWeights) TArray<FSmartName> BlendshapeNames = Mapping->GetCurveNames(); TArray<TArray<float>> BlendshapeValues; TArray<float> TargetBlendshapeValues; + if(owner->GetComponentByClass(UVHFacialExpressions::StaticClass())!=nullptr) + UVHFacialExpressions *FacialExpressions = Cast<UVHFacialExpressions>(owner->GetComponentByClass(UVHFacialExpressions::StaticClass())); for(FSmartName PoseName : Mapping->GetPoseNames()) { BlendshapeValues.Add(Mapping->GetCurveValues(Mapping->GetPoseIndexByName(PoseName.DisplayName))); @@ -67,7 +69,11 @@ void UVHOVRBridge::SetPredictions(TArray<float> PredictedVisemeWeights) for (int i = 0; i < BlendshapeNames.Num(); ++i) { // SetMorphTarget if(owner->GetBodyType()==BodyType::CC3) AnimInstance->SetMorphTarget(BlendshapeNames[i].DisplayName, TargetBlendshapeValues[i]); - else if(owner->GetBodyType()==BodyType::MetaHuman) AnimInstance->SetMorphTarget(BlendshapeNames[i].DisplayName, TargetBlendshapeValues[i]); + else if(owner->GetBodyType()==BodyType::MetaHuman && owner->GetComponentByClass(USkeletalMeshComponent::StaticClass())!=nullptr) + { + UVHFacialExpressions *FacialExpressions = Cast<UVHFacialExpressions>(owner->GetComponentByClass(UVHFacialExpressions::StaticClass())); + FacialExpressions->GetCurrentAnimationValues().Emplace(BlendshapeNames[i].DisplayName, TargetBlendshapeValues[i]); + } } // OUT: accumulate all values from all weighted poses and apply them on mesh; diff --git a/Source/CharacterPlugin/Private/VHSaccades.cpp b/Source/CharacterPlugin/Private/VHSaccades.cpp index db647a33..897dacf9 100644 --- a/Source/CharacterPlugin/Private/VHSaccades.cpp +++ b/Source/CharacterPlugin/Private/VHSaccades.cpp @@ -77,21 +77,21 @@ void UVHSaccades::TickComponent(float DeltaTime, ELevelTick TickType, FActorComp // UE_LOG(LogTemp, Display, TEXT("[Blinking]: Start blinking")); // UE_LOG(LogTemp, Display, TEXT("[Blinking]: Current blendshape value %f"), cur_value); // UE_LOG(LogTemp, Display, TEXT("[Blinking]: BlinkAnimationTimerValue %i"), BlinkAnimationTimer); - if(cur_value<=1.0 && !bEyesClosed) + if(BlinkValue<=1.0 && !bEyesClosed) { UE_LOG(LogTemp, Display, TEXT("[Blinking]: closing")); - cur_value = FMath::FInterpConstantTo(cur_value, 1.0, DeltaTime, 8); + BlinkValue = FMath::FInterpConstantTo(BlinkValue, 1.0, DeltaTime, 8); // if(owner->GetBodyType()==BodyType::CC3) AnimInstance->SetMorphTarget(FName("Eye_Blink"), cur_value); // else AnimInstance->EyeBlink = cur_value; - if(cur_value==1.0) bEyesClosed = true; + if(BlinkValue==1.0) bEyesClosed = true; } else { UE_LOG(LogTemp, Display, TEXT("[Blinking]: opening")); - cur_value = FMath::FInterpConstantTo(cur_value, 0.0, DeltaTime, 8); + BlinkValue = FMath::FInterpConstantTo(BlinkValue, 0.0, DeltaTime, 8); // if(owner->GetBodyType()==BodyType::CC3) AnimInstance->SetMorphTarget(FName("Eye_Blink"), cur_value); // else AnimInstance->EyeBlink = cur_value; - if(cur_value==0) + if(BlinkValue==0) { UE_LOG(LogTemp, Display, TEXT("[Blinking]: done")); std::normal_distribution<float> gBlink(intervalBlink, intervalBlinkStD); @@ -104,8 +104,13 @@ void UVHSaccades::TickComponent(float DeltaTime, ELevelTick TickType, FActorComp } } - if(owner->GetBodyType()==BodyType::CC3) AnimInstance->SetMorphTarget(FName("Eye_Blink"), cur_value); - else AnimInstance->EyeBlink = cur_value; + if(owner->GetBodyType()==BodyType::CC3) + { + AnimInstance->SetMorphTarget(FName("Eye_Blink"), BlinkValue); + // change brow values accordingly + // AnimInstance->SetMorphTarget(FName("Eye_Blink"), BrowValue); + } + else AnimInstance->EyeBlink = BlinkValue; } if(timeInState%15==0) diff --git a/Source/CharacterPlugin/Public/VHFacialExpressions.h b/Source/CharacterPlugin/Public/VHFacialExpressions.h index a9e6cd57..20147e27 100644 --- a/Source/CharacterPlugin/Public/VHFacialExpressions.h +++ b/Source/CharacterPlugin/Public/VHFacialExpressions.h @@ -93,7 +93,7 @@ public: // Used to "call" an update of already selected pose on demand UPROPERTY(BlueprintReadWrite,EditAnywhere) bool isPoseDirty = false; - const TMap<FName, float>& GetCurrentAnimationValues() const; + TMap<FName, float>& GetCurrentAnimationValues(); protected: virtual void BeginPlay() override; @@ -113,5 +113,7 @@ private: TMap<Emotions, TArray<FACSValue>> FACSExpressionsLibrary; TMap<int, FAUPose> AUPoses; TMap<FName, float> CurrentAnimationValues; + +private: TSet<FString> EvaluatedNames; }; diff --git a/Source/CharacterPlugin/Public/VHSaccades.h b/Source/CharacterPlugin/Public/VHSaccades.h index 5113c360..7763065a 100644 --- a/Source/CharacterPlugin/Public/VHSaccades.h +++ b/Source/CharacterPlugin/Public/VHSaccades.h @@ -45,7 +45,8 @@ private: const float intervalBlink = 3.4; //in ms const float intervalBlinkStD = 0.8; //in ms float nextBlink = 0; //ms - float cur_value = 0; + float BlinkValue = 0; + float BrowValue = 0; bool bEyesClosed = false; FRotator EyeOrientation; AVirtualHuman* owner = nullptr; -- GitLab