Skip to content
Snippets Groups Projects

GazeTracking Logging

Merged Malte Christian Kögel requested to merge feature/gaze_logging into 4.26
5 files
+ 69
25
Compare changes
  • Side-by-side
  • Inline

Files

@@ -34,10 +34,11 @@ void USFGazeTracker::Init(EGazeTrackerMode Mode)
@@ -34,10 +34,11 @@ void USFGazeTracker::Init(EGazeTrackerMode Mode)
}
}
}
}
FGazeRay USFGazeTracker::GetGazeDirection()
FGazeRay USFGazeTracker::GetLocalGazeDirection()
{
{
if(!IsTrackingEyes())
if(!IsTrackingEyes())
{
{
 
// if no eye tracker is used we always "look ahead"
FGazeRay GazeRay;
FGazeRay GazeRay;
GazeRay.Origin = FVector::ZeroVector;
GazeRay.Origin = FVector::ZeroVector;
GazeRay.Direction = FVector::ForwardVector;;
GazeRay.Direction = FVector::ForwardVector;;
@@ -54,29 +55,52 @@ FGazeRay USFGazeTracker::GetGazeDirection()
@@ -54,29 +55,52 @@ FGazeRay USFGazeTracker::GetGazeDirection()
return GazeRay;
return GazeRay;
}
}
FString USFGazeTracker::GetCurrentGazeTarget()
FGazeRay USFGazeTracker::GetWorldGazeDirection()
{
{
FString GazedAtTarget = "";
FGazeRay LocalGazeRay = GetLocalGazeDirection();
const float Distance = 1000.0f;
FGazeRay GazeRay = GetGazeDirection();
// if no eye tracker is used we always "look ahead"
// GazeDirection = FVector(1,0,0);
UWorld* World = USFGameInstance::Get()->GetWorld();
UWorld* World = USFGameInstance::Get()->GetWorld();
//the gaze ray is relative to the HMD
//the gaze ray is relative to the HMD
const APlayerCameraManager* CamManager = World->GetFirstPlayerController()->
const APlayerCameraManager* CamManager = World->GetFirstPlayerController()->
PlayerCameraManager;
PlayerCameraManager;
const FVector CameraLocation = CamManager->GetCameraLocation();
const FVector CameraLocation = CamManager->GetCameraLocation();
const FRotator CameraRotation = CamManager->GetCameraRotation();
const FRotator CameraRotation = CamManager->GetCameraRotation();
const FVector RayCastOrigin = CameraLocation + CameraRotation.RotateVector(GazeRay.Origin);
const FVector RayCastEnd = (CameraRotation.RotateVector(GazeRay.Direction) * Distance) + RayCastOrigin;
FGazeRay GazeRay;
 
GazeRay.Origin = CameraLocation + CameraRotation.RotateVector(LocalGazeRay.Origin);
 
GazeRay.Direction = CameraRotation.RotateVector(LocalGazeRay.Direction);
 
 
return GazeRay;
 
}
 
 
FString USFGazeTracker::GetCurrentGazeTarget()
 
{
 
FString GazedAtTarget = "";
 
const float Distance = 1000.0f;
 
 
FGazeRay GazeRay = GetWorldGazeDirection();
 
 
 
const FVector RayCastOrigin = GazeRay.Origin;
 
const FVector RayCastEnd = (GazeRay.Direction * Distance) + RayCastOrigin;
//FSFUtils::Log("Cast Ray from "+RayCastOrigin.ToString()+" to "+RayCastEnd.ToString());
//FSFUtils::Log("Cast Ray from "+RayCastOrigin.ToString()+" to "+RayCastEnd.ToString());
FHitResult HitResult;
FHitResult HitResult;
World->LineTraceSingleByChannel(HitResult, RayCastOrigin, RayCastEnd, EYE_TRACKING_TRACE_CHANNEL);
UWorld* World = USFGameInstance::Get()->GetWorld();
 
FCollisionQueryParams QueryParams;
 
QueryParams.AddIgnoredActor(World->GetFirstPlayerController()->AcknowledgedPawn);
 
QueryParams.AddIgnoredActor(USFGameInstance::Get()->GetHUD()->GetHUDHelper());
 
 
World->LineTraceSingleByChannel(HitResult, RayCastOrigin, RayCastEnd, EYE_TRACKING_TRACE_CHANNEL, QueryParams);
 
 
if (bDebugRenderRayTraces)
 
{
 
//this line trace is more comfortable for debug drawing, however has problems with channel tracing, so we use LineTraceSingleByChannel() above
 
FHitResult TmpHitRes;
 
UKismetSystemLibrary::LineTraceSingle(World, RayCastOrigin, RayCastEnd, ETraceTypeQuery::TraceTypeQuery4, false, {}, EDrawDebugTrace::ForDuration, TmpHitRes, true);
 
}
if (HitResult.bBlockingHit)
if (HitResult.bBlockingHit)
@@ -104,17 +128,20 @@ FString USFGazeTracker::GetCurrentGazeTarget()
@@ -104,17 +128,20 @@ FString USFGazeTracker::GetCurrentGazeTarget()
void USFGazeTracker::LaunchCalibration()
void USFGazeTracker::LaunchCalibration()
{
{
#ifdef WITH_SRANIPAL
#ifdef WITH_SRANIPAL
//TODO: not tested yet!
ViveSR::anipal::Eye::LaunchEyeCalibration(nullptr);
ViveSR::anipal::Eye::LaunchEyeCalibration(nullptr);
#endif
#endif
}
}
bool USFGazeTracker::IsTrackingEyes()
bool USFGazeTracker::IsTrackingEyes()
{
{
//TODO: maybe use
if (!bEyeTrackingStarted)
//#ifdef WITH_SRANIPAL
return false;
//ViveSR::anipal::AnipalStatus Status;
//TODO: this does not seem to work properly!!!! check gaze logs
//int Error = ViveSR::anipal::GetStatus(ViveSR::anipal::Eye::ANIPAL_TYPE_EYE_V2, &Status);
#ifdef WITH_SRANIPAL
//#endif
ViveSR::anipal::AnipalStatus Status;
return bEyeTrackingStarted;
int Error = ViveSR::anipal::GetStatus(ViveSR::anipal::Eye::ANIPAL_TYPE_EYE_V2, &Status);
 
return Status == ViveSR::anipal::AnipalStatus::WORKING;
 
#endif
 
 
return true;
}
}
Loading