public IEnumerator Calibrate(IEyeTracker eyeTracker)
    {
        // Create a calibration object.
        HMDBasedCalibration calibration = new HMDBasedCalibration(eyeTracker);

        // Enter calibration mode.
        calibration.EnterCalibrationMode();
        // Define the points in the HMD space we should calibrate at.
        Point3D[] pointsToCalibrate = new Point3D[] {
            new Point3D(9f, 9f, 20f),
            new Point3D(-9f, 9f, 20f),
            new Point3D(-9f, -9f, 20f),
            new Point3D(9f, -9f, 20f),
            new Point3D(0f, 0f, 20f),
        };
        // Collect data.
        foreach (Point3D point in pointsToCalibrate)
        {
            // Show an image on screen where you want to calibrate.
            Debug.Log("Show point in HMD space at ( " + point.X + " , " + point.Y + " , " + point.Z + " )");
            VRHeadsetDebugDisplay.Instance.SetText("Show point in HMD space at ( " + point.X + " , " + point.Y + " , " + point.Z + " )");
            DisplayImgAtPoint(new Vector3(point.X, point.Y, point.Z));
            // Wait a little for user to focus.
            yield return(new WaitForSeconds(5));

            // Collect data.
            CalibrationStatus status = calibration.CollectData(point);
            if (status != CalibrationStatus.Success)
            {
                // Try again if it didn't go well the first time.
                // Not all eye tracker models will fail at this point, but instead fail on ComputeAndApply.
                calibration.CollectData(point);
                Debug.Log("Calibration point status : " + status);
            }
            VRHeadsetDebugDisplay.Instance.SetText("Ok, next!");
        }
        // Compute and apply the calibration.
        HMDCalibrationResult calibrationResult = calibration.ComputeAndApply();

        Debug.Log("Compute and apply returned : " + calibrationResult.Status);
        // See that you're happy with the result.
        // The calibration is done. Leave calibration mode.


        calibration.LeaveCalibrationMode();
        VRHeadsetDebugDisplay.Instance.SetText("All finished!");
    }
Пример #2
0
        /// <summary>
        /// The thread function that calls the blocking calibration methods.
        /// </summary>
        private void ThreadFunction()
        {
            // Get the eye tracker
            var eyeTracker = VREyeTracker.Instance.EyeTrackerInterface;

            if (eyeTracker == null)
            {
                return;
            }

            Running = true;

            // Create the calibration object.
            var hmd = new HMDBasedCalibration(eyeTracker);

            // Find out how long the calls took using a stopwatch.
            var stopWatch = new System.Diagnostics.Stopwatch();

            // Handle the calibration commands.
            while (Running)
            {
                var currentResult = MethodResult.CurrentResult;
                stopWatch.Reset();
                stopWatch.Start();

                if (currentResult == null)
                {
                    Thread.Sleep(25);
                }
                else
                {
                    switch (currentResult.Command)
                    {
                    case MethodResult.CommandType.Invalid:
                        Thread.Sleep(25);
                        break;

                    case MethodResult.CommandType.Enter:
                        hmd.EnterCalibrationMode();
                        stopWatch.Stop();
                        currentResult.Finished(CalibrationStatus.Success, (int)stopWatch.ElapsedMilliseconds);
                        break;

                    case MethodResult.CommandType.Collect:
                        var collectResult = hmd.CollectData(MethodResult.CurrentPoint);
                        stopWatch.Stop();
                        currentResult.Finished(collectResult, (int)stopWatch.ElapsedMilliseconds);
                        break;

                    case MethodResult.CommandType.Compute:
                        var applyResult = hmd.ComputeAndApply();
                        stopWatch.Stop();
                        currentResult.Finished(applyResult.Status, (int)stopWatch.ElapsedMilliseconds);
                        break;

                    case MethodResult.CommandType.Leave:
                        hmd.LeaveCalibrationMode();
                        stopWatch.Stop();
                        currentResult.Finished(CalibrationStatus.Success, (int)stopWatch.ElapsedMilliseconds);
                        break;

                    default:
                        Thread.Sleep(25);
                        break;
                    }
                }
            }
        }
Пример #3
0
        /// <summary>
        /// The thread function that calls the blocking calibration methods.
        /// </summary>
        private void ThreadFunction()
        {
            var eyeTracker = EyeTrackerIF;

            if (eyeTracker == null)
            {
                return;
            }

            Running = true;

            // Create the calibration object.
            ScreenBasedCalibration screenBasedCalibration = null;
            HMDBasedCalibration    hmdBasedCalibration    = null;

            if (ScreenBased)
            {
                screenBasedCalibration = new ScreenBasedCalibration(eyeTracker);
            }
            else
            {
                hmdBasedCalibration = new HMDBasedCalibration(eyeTracker);
            }

            // Find out how long the calls took using a stopwatch.
            var stopWatch = new System.Diagnostics.Stopwatch();

            // Handle the calibration commands.
            while (Running)
            {
                var currentResult = MethodResult.CurrentResult;
                stopWatch.Reset();
                stopWatch.Start();

                if (currentResult == null)
                {
                    Thread.Sleep(25);
                }
                else
                {
                    switch (currentResult.Command)
                    {
                    case MethodResult.CommandType.Invalid:
                        Thread.Sleep(25);
                        break;

                    case MethodResult.CommandType.Enter:
                        if (screenBasedCalibration != null)
                        {
                            screenBasedCalibration.EnterCalibrationMode();
                        }
                        else
                        {
                            hmdBasedCalibration.EnterCalibrationMode();
                        }

                        stopWatch.Stop();
                        currentResult.Finished(CalibrationStatus.Success, (int)stopWatch.ElapsedMilliseconds);
                        break;

                    case MethodResult.CommandType.Collect:
                        var collectResult = screenBasedCalibration != null?
                                            screenBasedCalibration.CollectData(MethodResult.CurrentPoint) :
                                                hmdBasedCalibration.CollectData(MethodResult.CurrentPoint);

                        stopWatch.Stop();
                        currentResult.Finished(collectResult, (int)stopWatch.ElapsedMilliseconds);
                        break;

                    case MethodResult.CommandType.Compute:
                        CalibrationStatus status = screenBasedCalibration != null?
                                                   screenBasedCalibration.ComputeAndApply().Status:
                                                   hmdBasedCalibration.ComputeAndApply().Status;

                        stopWatch.Stop();
                        currentResult.Finished(status, (int)stopWatch.ElapsedMilliseconds);
                        break;

                    case MethodResult.CommandType.Leave:
                        if (screenBasedCalibration != null)
                        {
                            screenBasedCalibration.LeaveCalibrationMode();
                        }
                        else
                        {
                            hmdBasedCalibration.LeaveCalibrationMode();
                        }

                        stopWatch.Stop();
                        currentResult.Finished(CalibrationStatus.Success, (int)stopWatch.ElapsedMilliseconds);
                        break;

                    default:
                        Thread.Sleep(25);
                        break;
                    }
                }
            }

            if (hmdBasedCalibration != null)
            {
                hmdBasedCalibration.Dispose();
            }

            if (screenBasedCalibration != null)
            {
                screenBasedCalibration.Dispose();
            }
        }
Пример #4
0
        // <BeginExample>
        private IEnumerator Calibrate(Point3D[] calibrationPoints, GameObject target)
        {
            if (_eyeTracker == null)
            {
                yield break;
            }

            _eyeTracker.CalibrationModeEntered += EyeTracker_CalibrationModeEntered;
            _eyeTracker.CalibrationModeLeft    += EyeTracker_CalibrationModeLeft;

            // Create a calibration object.
            var calibration = new HMDBasedCalibration(_eyeTracker);

            // Enter calibration mode.
            calibration.EnterCalibrationMode();

            // Get and set the lens cup separation
            float hmdIpdInMeter;

            if (TobiiPro_Util.TryGetHmdLensCupSeparationInMeter(out hmdIpdInMeter) == false)
            {
                Debug.LogWarning("TobiiPro: Failed to get lens cup separation from HMD. Setting default lens cup separation.");
                hmdIpdInMeter = 0.0635f;
            }

            TobiiPro_Util.SetLensCupSeparation(hmdIpdInMeter);
            // Collect data.
            var index           = 0;
            var remainingPoints = true;

            while (remainingPoints)
            {
                // Play intro animation for the point
                _hasAnimated = false;
                WaitingOnIntroAnimation.Invoke(this, new IntroAnimationArgs(index));

                yield return(StartCoroutine(WaitingForAnimation()));

                var point = calibrationPoints[index];

                point = new Point3D(-point.X, point.Y, point.Z);

                // Show an image on screen where you want to calibrate.
                // target.transform.localPosition = new Vector3(-point.X, point.Y, point.Z) / 1000f;

                // Wait a little for user to focus.
                yield return(new WaitForSeconds(1.5f));


                // Collect data.
                CalibrationStatus status = calibration.CollectData(point);
                if (status != CalibrationStatus.Success)
                {
                    // Try again if it didn't go well the first time.
                    // Not all eye tracker models will fail at this point, but instead fail on ComputeAndApply.
                    Debug.Log("TobiiPro: Calibration for this point wasn't success, try again.");
                    calibration.CollectData(point);
                }

                index++;

                // Outro animation for the point
                _hasAnimated = false;
                WaitingOnOutroAnimation.Invoke(this, null);
                yield return(StartCoroutine(WaitingForAnimation()));

                // Check if there are more points remaining
                if (index > calibrationPoints.Length - 1)
                {
                    remainingPoints = false;
                }
            }
            // Compute and apply the calibration.
            HMDCalibrationResult calibrationResult = calibration.ComputeAndApply();

            Debug.Log(string.Format("Compute and apply returned {0}.", calibrationResult.Status));
            // See that you're happy with the result.
            // The calibration is done. Leave calibration mode.

            OnCalibrationCompleted.Invoke(this, new CalibrationCompletedArgs(calibrationResult.Status));

            if (target != null)
            {
                Destroy(target);
            }

            _eyeTracker.CalibrationModeEntered -= EyeTracker_CalibrationModeEntered;
            calibration.LeaveCalibrationMode();

            _eyeTracker.CalibrationModeLeft -= EyeTracker_CalibrationModeLeft;
        }