/// <summary> /// Determine whether the user is looking away from the preview. /// </summary> /// <returns></returns> private bool IsLookingAwayFromPreview() { if (prevPreviewPos == null || EyeTrackingProvider == null) { return(true); } Vector3 eyes2PrevPreview = prevPreviewPos.Value - EyeTrackingProvider.GazeOrigin; Vector3 eye2HitPos = EyeTrackingProvider.GazeDirection; float angle = Vector3.Angle(eyes2PrevPreview, eye2HitPos); float distance = EyeTrackingDemoUtils.VisAngleInDegreesToMeters(Vector3.Angle(eyes2PrevPreview, eye2HitPos), eye2HitPos.magnitude); if (distance < previewPlacemDistThresh) { return(false); } // Check if the target is still hit by the eye gaze cursor if (EyeTrackingProvider.GazeTarget == previewGameObject) { return(false); } // Check whether the user is still looking within the proximity of the target float distanceBetweenTargetAndCurrHitPos = Angle_ToCurrHitTarget(previewGameObject); if (distanceBetweenTargetAndCurrHitPos > minLookAwayDistToEnableEyeWarp) { return(true); } return(false); }
/// <summary> /// Instantiates a new target and transforms it according to the given parameters. /// </summary> /// <param name="radius">Radius of the ring in which the target is placed in.</param> /// <param name="viewingDist">The distance between the target group and the camera.</param> /// <param name="iTarget">The index of the target within the current ring.</param> private void InstantiateRadialLayoutedTarget(float radius, float viewingDist, int iTarget) { GameObject _target = Instantiate(GetRandomTemplate()); // Position float xnew = transform.position.x + EyeTrackingDemoUtils.VisAngleInDegreesToMeters(radius, viewingDist) * Mathf.Cos(Mathf.Deg2Rad * iTarget * 360 / radialLayout_nTargets); float ynew = transform.position.y + EyeTrackingDemoUtils.VisAngleInDegreesToMeters(radius, viewingDist) * Mathf.Sin(Mathf.Deg2Rad * iTarget * 360 / radialLayout_nTargets); _target.transform.localPosition = new Vector3(xnew, ynew, transform.position.z); // Scale float dist2 = Vector3.Distance(CameraCache.Main.transform.position, _target.transform.position); Vector3 tmpTargetSizeInMeters = EyeTrackingDemoUtils.VisAngleInDegreesToMeters(targetSizeInVisAngle, dist2); _target.transform.localScale = tmpTargetSizeInMeters; // Name it _target.name = string.Format("target_r{0}_t{1}", radius, iTarget); // Assign parent _target.transform.SetParent(transform); _target.gameObject.SetActive(true); // Add it to our list of instantiated targets instantiatedTargets.Add(_target); }
/// <summary> /// Keeps the target size in visual angle constant. /// </summary> private void KeepConstantVisAngleTargetSize() { // Note: We could improve performance by checking the delta camera movement. If below thresh -> Don't update. foreach (GameObject gobj in instantiatedTargets) { if (gobj != null) { float distObjToCam = Vector3.Distance(CameraCache.Main.transform.position, gobj.transform.position); gobj.transform.localScale = EyeTrackingDemoUtils.VisAngleInDegreesToMeters(targetSizeInVisAngle, distObjToCam); } } }
/// <summary> /// Creates a group of instantiated targets in a radial layout. /// </summary> private void CreateNewTargets_RadialLayout() { instantiatedTargets = new List <GameObject>(); // Set target size float dist = Vector3.Distance(CameraCache.Main.transform.position, transform.position); targetSizeInMeters = EyeTrackingDemoUtils.VisAngleInDegreesToMeters(targetSizeInVisAngle, dist); // Let's store the local rotation and reset it for now to rotate it later with all children Vector3 rotate = transform.localRotation.eulerAngles; transform.localRotation = Quaternion.Euler(Vector3.zero); // Let's make sure we have some templates to work with if ((templates != null) && (templates.Length > 0)) { // Show a target at the center of the target group if (showTargetAtGroupCenter) { InstantiateRadialLayoutedTarget(0, dist, 0); } // Instantiate and place the remaining targets // Create different number of rings based on the amount of given radii for (int ir = 0; ir < radialLayout_radiusInVisAngle.Length; ir++) { // Per ring create a given number of targets for (int it = 0; it < radialLayout_nTargets; it++) { InstantiateRadialLayoutedTarget(radialLayout_radiusInVisAngle[ir], dist, it); } } // Rotate the target family transform.Rotate(rotate); } }