Esempio n. 1
0
    public virtual void Update(GazeData frame)
    {
        _GazeFrameCache.Enqueue(frame);

        // update valid gazedata based on store
        Eye      right = null, left = null;
        Point2D  gazeCoords       = null;
        Point2D  gazeCoordsSmooth = null;
        Point2D  userPos          = null;
        double   userDist         = 0d;
        Point2D  eyeDistVecHalf   = null;
        GazeData gd;

        lock (_GazeFrameCache)
        {
            for (int i = _GazeFrameCache.Count; --i >= 0;)
            {
                gd = _GazeFrameCache.ElementAt(i);

                // if no tracking problems, then cache eye data
                if ((gd.State & NO_TRACKING_MASK) == 0)
                {
                    if (null == userPos &&
                        !gd.LeftEye.PupilCenterCoordinates.Equals(Point2D.zero) &&
                        !gd.RightEye.PupilCenterCoordinates.Equals(Point2D.zero))
                    {
                        userPos        = (gd.LeftEye.PupilCenterCoordinates + gd.RightEye.PupilCenterCoordinates) / 2;
                        eyeDistVecHalf = (gd.RightEye.PupilCenterCoordinates - gd.LeftEye.PupilCenterCoordinates) / 2;
                        userDist       = UnityGazeUtils.getDistancePoint2D(gd.LeftEye.PupilCenterCoordinates, gd.RightEye.PupilCenterCoordinates);

                        left  = gd.LeftEye;
                        right = gd.RightEye;
                    }
                    else if (null == userPos && left == null && !gd.LeftEye.PupilCenterCoordinates.Equals(Point2D.zero))
                    {
                        left = gd.LeftEye;
                    }
                    else if (null == userPos && right == null && !gd.RightEye.PupilCenterCoordinates.Equals(Point2D.zero))
                    {
                        right = gd.RightEye;
                    }

                    // if gaze coordinates available, cache both raw and smoothed
                    if (/*(gd.State & GazeData.STATE_TRACKING_GAZE) != 0 && */ null == gazeCoords && !gd.RawCoordinates.Equals(Point2D.zero))
                    {
                        gazeCoords       = gd.RawCoordinates;
                        gazeCoordsSmooth = gd.SmoothedCoordinates;
                    }
                }

                // break loop if valid values found
                if (null != userPos && null != gazeCoords)
                {
                    break;
                }
            }

            if (null != gazeCoords)
            {
                _LastValidRawGazeCoords      = gazeCoords;
                _LastValidSmoothedGazeCoords = gazeCoordsSmooth;
            }

            if (null != eyeDistVecHalf)
            {
                _LastValidEyesDistHalfVec = eyeDistVecHalf;
            }

            //Update user position values if needed data is valid
            if (null != userPos)
            {
                _LastValidLeftEye  = left;
                _LastValidRightEye = right;

                //update 'depth' measure
                if (userDist < _MinimumEyesDistance)
                {
                    _MinimumEyesDistance = userDist;
                }

                if (userDist > _MaximumEyesDistance)
                {
                    _MaximumEyesDistance = userDist;
                }

                //_LastValidEyeDistance = _LastValidEyeDistance / (_MaximumEyesDistance - _MinimumEyesDistance);
                _LastValidEyeDistance = 1 - (userDist / _MaximumEyesDistance);

                //update user position
                _LastValidUserPosition = new Point3D(userPos.X, userPos.Y, _LastValidEyeDistance);

                //map to normalized 3D space
                _LastValidUserPosition.X = (_LastValidUserPosition.X * 2) - 1;
                _LastValidUserPosition.Y = (_LastValidUserPosition.Y * 2) - 1;

                //update angle
                _LastValidEyeAngle = ((180 / Math.PI * Math.Atan2(_LastValidRightEye.PupilCenterCoordinates.Y - _LastValidLeftEye.PupilCenterCoordinates.Y,
                                                                  _LastValidRightEye.PupilCenterCoordinates.X - _LastValidLeftEye.PupilCenterCoordinates.X)));
            }
            else if (null != left)
            {
                _LastValidLeftEye  = left;
                _LastValidRightEye = null;
                Point2D newPos = _LastValidLeftEye.PupilCenterCoordinates + _LastValidEyesDistHalfVec;
                _LastValidUserPosition = new Point3D(newPos.X, newPos.Y, _LastValidEyeDistance);

                //map to normalized 3D space
                _LastValidUserPosition.X = (_LastValidUserPosition.X * 2) - 1;
                _LastValidUserPosition.Y = (_LastValidUserPosition.Y * 2) - 1;
            }
            else if (null != right)
            {
                _LastValidRightEye = right;
                _LastValidLeftEye  = null;
                Point2D newPos = _LastValidRightEye.PupilCenterCoordinates - _LastValidEyesDistHalfVec;
                _LastValidUserPosition = new Point3D(newPos.X, newPos.Y, _LastValidEyeDistance);

                //map to normalized 3D space
                _LastValidUserPosition.X = (_LastValidUserPosition.X * 2) - 1;
                _LastValidUserPosition.Y = (_LastValidUserPosition.Y * 2) - 1;
            }
            else
            {
                _LastValidRightEye = null;
                _LastValidLeftEye  = null;
            }
        }
    }