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