Skip to content
Snippets Groups Projects
Commit 1bfed3a9 authored by Jonathan Ehret's avatar Jonathan Ehret
Browse files

add option to additionally to current gaze, fixate another location with eyes only

parent d11883e6
No related branches found
No related tags found
No related merge requests found
...@@ -162,8 +162,8 @@ void FAnimNode_VHGazing::UpdateRotations(FPoseContext& LocalPoseContext, FCompon ...@@ -162,8 +162,8 @@ void FAnimNode_VHGazing::UpdateRotations(FPoseContext& LocalPoseContext, FCompon
// **************** // ****************
// full rotation required to be inline with the target // full rotation required to be inline with the target
const FRotator FullTargetRotationRightEye = GetRotationToTarget(RightEyeBoneData, LocalPoseContext, CSPoseContext); const FRotator FullTargetRotationRightEye = GetRotationToTarget(RightEyeBoneData, LocalPoseContext, CSPoseContext, true);
const FRotator FullTargetRotationLeftEye = GetRotationToTarget(LeftEyeBoneData, LocalPoseContext, CSPoseContext); const FRotator FullTargetRotationLeftEye = GetRotationToTarget(LeftEyeBoneData, LocalPoseContext, CSPoseContext, true);
//remove the way that the torso and head already made //remove the way that the torso and head already made
FRotator TargetRotationRightEye = FullTargetRotationRightEye - (HeadBoneData.CurrentRotation + TorsoBoneData.CurrentRotation); FRotator TargetRotationRightEye = FullTargetRotationRightEye - (HeadBoneData.CurrentRotation + TorsoBoneData.CurrentRotation);
...@@ -323,7 +323,7 @@ void FAnimNode_VHGazing::ApplyRotation(FGazingBoneData& GazingBoneData, FRotator ...@@ -323,7 +323,7 @@ void FAnimNode_VHGazing::ApplyRotation(FGazingBoneData& GazingBoneData, FRotator
} }
FRotator FAnimNode_VHGazing::GetRotationToTarget(FGazingBoneData& GazingBoneData, FPoseContext& LocalPoseContext, FComponentSpacePoseContext& CSPoseContext) FRotator FAnimNode_VHGazing::GetRotationToTarget(FGazingBoneData& GazingBoneData, FPoseContext& LocalPoseContext, FComponentSpacePoseContext& CSPoseContext, bool bEyes /*= false*/)
{ {
if (!VHGazingData.bIsGazing || GazingBoneData.TargetBone.BoneName == NAME_None) if (!VHGazingData.bIsGazing || GazingBoneData.TargetBone.BoneName == NAME_None)
...@@ -340,8 +340,13 @@ FRotator FAnimNode_VHGazing::GetRotationToTarget(FGazingBoneData& GazingBoneData ...@@ -340,8 +340,13 @@ FRotator FAnimNode_VHGazing::GetRotationToTarget(FGazingBoneData& GazingBoneData
FAnimInstanceProxy* AnimProxy = LocalPoseContext.AnimInstanceProxy; FAnimInstanceProxy* AnimProxy = LocalPoseContext.AnimInstanceProxy;
check(AnimProxy); check(AnimProxy);
FVector TargetLocation = VHGazingData.GazeTargetLocation;
if (bEyes && VHGazingData.EyesOnlyGazeTarget.IsSet()) {
TargetLocation = VHGazingData.EyesOnlyGazeTarget.GetValue();
}
//do everything in component space (so also transform the gaze target into it //do everything in component space (so also transform the gaze target into it
FVector GazeTargeCS = AnimProxy->GetComponentTransform().Inverse().TransformPosition(VHGazingData.GazeTargetLocation); FVector GazeTargeCS = AnimProxy->GetComponentTransform().Inverse().TransformPosition(TargetLocation);
const FVector BoneLocation = TargetBoneTransformCS.GetLocation(); const FVector BoneLocation = TargetBoneTransformCS.GetLocation();
FQuat BoneRotation = TargetBoneTransformCS.GetRotation(); FQuat BoneRotation = TargetBoneTransformCS.GetRotation();
BoneRotation = BoneRotation * GazingBoneData.DefaultTargetBoneTransform.GetRotation().Inverse(); BoneRotation = BoneRotation * GazingBoneData.DefaultTargetBoneTransform.GetRotation().Inverse();
......
...@@ -57,6 +57,10 @@ void UVHGazing::TickComponent(float DeltaTime, ELevelTick TickType, FActorCompon ...@@ -57,6 +57,10 @@ void UVHGazing::TickComponent(float DeltaTime, ELevelTick TickType, FActorCompon
UVHAnimInstance* BodyAnimInstance = VirtualHumanPtr->GetBodyAnimInstance(); UVHAnimInstance* BodyAnimInstance = VirtualHumanPtr->GetBodyAnimInstance();
FaceAnimInstance->VHGazingData.GazeTargetLocation = TargetLocation; FaceAnimInstance->VHGazingData.GazeTargetLocation = TargetLocation;
FaceAnimInstance->VHGazingData.EyesOnlyGazeTarget.Reset();
if (EyesOnlyTargetLocation.IsSet()) {
FaceAnimInstance->VHGazingData.EyesOnlyGazeTarget = EyesOnlyTargetLocation;
}
FaceAnimInstance->VHGazingData.bIsGazing = bIsGazing; FaceAnimInstance->VHGazingData.bIsGazing = bIsGazing;
FaceAnimInstance->VHGazingData.GazeMode = GazeMode; FaceAnimInstance->VHGazingData.GazeMode = GazeMode;
...@@ -102,12 +106,12 @@ void UVHGazing::TickComponent(float DeltaTime, ELevelTick TickType, FActorCompon ...@@ -102,12 +106,12 @@ void UVHGazing::TickComponent(float DeltaTime, ELevelTick TickType, FActorCompon
Blink(DeltaTime); Blink(DeltaTime);
if ((LastTargetLocation - TargetLocation).Size() > 10.0f) if ((LastTargetLocation - (EyesOnlyTargetLocation.IsSet() ? EyesOnlyTargetLocation.GetValue() : TargetLocation)).Size() > 10.0f)
{ {
//force a blink if the target location changed by more than 10cm //force a blink if the target location changed by more than 10cm
ForceBlink(); ForceBlink();
} }
LastTargetLocation = TargetLocation; LastTargetLocation = (EyesOnlyTargetLocation.IsSet() ? EyesOnlyTargetLocation.GetValue() : TargetLocation);
} }
void UVHGazing::UpdateTargetRotations() void UVHGazing::UpdateTargetRotations()
...@@ -234,6 +238,16 @@ void UVHGazing::GazeToUser() ...@@ -234,6 +238,16 @@ void UVHGazing::GazeToUser()
} }
} }
void UVHGazing::GazeToEyesOnly(FVector Target)
{
EyesOnlyTargetLocation = Target;
}
void UVHGazing::StopEyesOnlyGazing()
{
EyesOnlyTargetLocation.Reset();
}
void UVHGazing::StopGazing() void UVHGazing::StopGazing()
{ {
bIsGazing = false; bIsGazing = false;
......
...@@ -37,6 +37,7 @@ struct FVHGazingData ...@@ -37,6 +37,7 @@ struct FVHGazingData
bool bIsGazing; bool bIsGazing;
FVector GazeTargetLocation; FVector GazeTargetLocation;
TOptional<FVector> EyesOnlyGazeTarget;
FRotator AdditionalSaccadeRotation; FRotator AdditionalSaccadeRotation;
EGazeMode GazeMode; EGazeMode GazeMode;
...@@ -157,7 +158,7 @@ private: ...@@ -157,7 +158,7 @@ private:
// works like FindLookAtRotation, but takes the agents view rotation into account, // works like FindLookAtRotation, but takes the agents view rotation into account,
// Get missing rotation to target in component space as yaw and roll only // Get missing rotation to target in component space as yaw and roll only
FRotator GetRotationToTarget(FGazingBoneData& GazingBoneData, FPoseContext& LocalPoseContext, FComponentSpacePoseContext& CSPoseContext); FRotator GetRotationToTarget(FGazingBoneData& GazingBoneData, FPoseContext& LocalPoseContext, FComponentSpacePoseContext& CSPoseContext, bool bEyes = false);
// updates the currentRotation in GazingBoneData using movement dynamics // updates the currentRotation in GazingBoneData using movement dynamics
void UpdateCurrentRotation(FGazingBoneData& GazingBoneData, const FGazingPartData& GazingPartData, const FRotator& TargetRotation); void UpdateCurrentRotation(FGazingBoneData& GazingBoneData, const FGazingPartData& GazingPartData, const FRotator& TargetRotation);
......
...@@ -78,6 +78,16 @@ public: ...@@ -78,6 +78,16 @@ public:
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void StopGazing(); void StopGazing();
// This methods let's only the eyes gaze towards a specific position while the head and torso are
// potentiall oriented towards another gaze target specified with the methods above
// Target: The Target that the agent should gaze towards
UFUNCTION(BlueprintCallable)
void GazeToEyesOnly(FVector Target);
UFUNCTION(BlueprintCallable)
void StopEyesOnlyGazing();
// perform a blink when not currently blinking (only if bEyeBlink is true) // perform a blink when not currently blinking (only if bEyeBlink is true)
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void ForceBlink(); void ForceBlink();
...@@ -197,6 +207,7 @@ private: ...@@ -197,6 +207,7 @@ private:
bool bIsGazing = false; bool bIsGazing = false;
FVector TargetLocation; FVector TargetLocation;
FVector LastTargetLocation; FVector LastTargetLocation;
TOptional<FVector> EyesOnlyTargetLocation;
AActor* TargetActor; AActor* TargetActor;
USceneComponent* TargetComponent; USceneComponent* TargetComponent;
bool bGazingAtUser = false; bool bGazingAtUser = false;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment