Esempio n. 1
0
        /// <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);
            }
        }