private EyeValidationData GetEyeValidationData() { EyeValidationData eyeValidationData = new EyeValidationData(); Ray ray; eyeValidationData.ValidationTrial = validationTrial; eyeValidationData.ValidationPointIdx = validationPointIdx; //block und participant ID fehlen aktuell var debText = ""; eyeValidationData.UnixTimestamp = GetCurrentTimestamp(); eyeValidationData.Timestamp = Time.realtimeSinceStartup; eyeValidationData.HeadTransform = _hmdTransform.transform; eyeValidationData.PointToFocus = transform.position; if (SRanipal_Eye.GetGazeRay(GazeIndex.LEFT, out ray)) { var angles = Quaternion.FromToRotation((transform.position - _hmdTransform.position).normalized, _hmdTransform.rotation * ray.direction) .eulerAngles; eyeValidationData.LeftEyeAngleOffset = angles; } if (SRanipal_Eye.GetGazeRay(GazeIndex.RIGHT, out ray)) { var angles = Quaternion.FromToRotation((transform.position - _hmdTransform.position).normalized, _hmdTransform.rotation * ray.direction) .eulerAngles; debText += "Right Eye: " + angles + "\n"; eyeValidationData.RightEyeAngleOffset = angles; } if (SRanipal_Eye.GetGazeRay(GazeIndex.COMBINE, out ray)) { var angles = Quaternion.FromToRotation((transform.position - _hmdTransform.position).normalized, _hmdTransform.rotation * ray.direction) .eulerAngles; debText += "Combined Eye: " + angles + "\n"; eyeValidationData.CombinedEyeAngleOffset = angles; } return(eyeValidationData); }
public void StoreEyeValidationData(EyeValidationData data) { _eyeValidationData = data; }
private IEnumerator Validate(float delay) { yield return(new WaitForSeconds(delay)); List <float> anglesX = new List <float>(); List <float> anglesY = new List <float>(); List <float> anglesZ = new List <float>(); validationTrial += 1; float startTime = Time.time; for (int i = 1; i < keyPositions.Count; i++) { startTime = Time.time; float timeDiff = 0; while (timeDiff < 1f) { transform.position = _hmdTransform.position + _hmdTransform.rotation * Vector3.Lerp(keyPositions[i - 1], keyPositions[i], timeDiff / 1f); transform.LookAt(_hmdTransform); yield return(new WaitForEndOfFrame()); timeDiff = Time.time - startTime; } validationPointIdx = i; startTime = Time.time; timeDiff = 0; while (timeDiff < 3f) { transform.position = _hmdTransform.position + _hmdTransform.rotation * keyPositions[i]; transform.LookAt(_hmdTransform); EyeValidationData validationData = GetEyeValidationData(); if (validationData != null) { anglesX.Add(validationData.CombinedEyeAngleOffset.x); anglesY.Add(validationData.CombinedEyeAngleOffset.y); anglesZ.Add(validationData.CombinedEyeAngleOffset.z); validationData.ValidationResults.x = CalculateValidationError(anglesX); validationData.ValidationResults.y = CalculateValidationError(anglesY); validationData.ValidationResults.z = CalculateValidationError(anglesZ); _eyeValidationData = validationData; EyetrackingManager.Instance.StoreEyeValidationData(_eyeValidationData); //validationSample.validationData.ValidationTrial); } yield return(new WaitForEndOfFrame()); timeDiff = Time.time - startTime; } } string validationResult = "(" + CalculateValidationError(anglesX).ToString("0.00") + ", " + CalculateValidationError(anglesY).ToString("0.00") + ", " + CalculateValidationError(anglesZ).ToString("0.00") + ")"; Debug.Log("<color=yellow> Validation Results" + validationResult + "(</color>"); gameObject.transform.position = Vector3.zero; if (CalculateValidationError(anglesX) > _errorThreshold || CalculateValidationError(anglesY) > _errorThreshold || CalculateValidationError(anglesZ) > _errorThreshold) { _isRunning = false; NotifyEyeValidationObservers?.Invoke(false, _eyeValidationData.ValidationResults); Debug.LogWarning("<color=red>Validation Error is too big (error angles >1) , please relaunch a calibration first </color>"); } else { _isRunning = false; NotifyEyeValidationObservers?.Invoke(true, _eyeValidationData.ValidationResults); } gameObject.SetActive(false); }