Esempio n. 1
0
 static bool EyePositionDataChanged(EyePositionData now, EyePositionData prev)
 {
     if (now.HasLeftEyePosition != prev.HasLeftEyePosition)
     {
         return(true);
     }
     if (now.HasRightEyePosition != prev.HasRightEyePosition)
     {
         return(true);
     }
     return(false);
 }
Esempio n. 2
0
 internal void OnInputHasEyes(EyePositionData eyePos)
 {
     m_HasLeftEye  = eyePos.HasLeftEyePosition;
     m_HasRightEye = eyePos.HasRightEyePosition;
 }
Esempio n. 3
0
        private void EyeDataStreamOnNext(object sender, StreamData <EyePositionData> eyePositionStream)
        {
            EyePositionData data = eyePositionStream.Data;

            LastEyePositionData = data;
            UpdateReason        = UpdateReason.EyeDataChanged;
            TrackStatus         = TrackStatus.NoEyes;

            var rightEyePositionMm   = new Vector3((float)data.RightEye.X, (float)data.RightEye.Y, (float)data.RightEye.Z);
            var leftEyePositionMm    = new Vector3((float)data.LeftEye.X, (float)data.LeftEye.Y, (float)data.LeftEye.Z);
            var rightEyePositionNorm = new Vector3((float)data.RightEyeNormalized.X, (float)data.RightEyeNormalized.Y, (float)data.RightEyeNormalized.Z);
            var leftEyePositionNorm  = new Vector3((float)data.LeftEyeNormalized.X, (float)data.LeftEyeNormalized.Y, (float)data.LeftEyeNormalized.Z);

            if (data.HasLeftEyePosition && data.HasRightEyePosition)
            {
                TrackStatus   = TrackStatus.BothEyes;
                eyeOffsetMm   = (SubtractableVector3)rightEyePositionMm - leftEyePositionMm;
                eyeOffsetNorm = (SubtractableVector3)rightEyePositionNorm - leftEyePositionNorm;
            }
            else if (data.HasLeftEyePosition)
            {
                TrackStatus = TrackStatus.OnlyLeftEye;
            }
            else if (data.HasRightEyePosition)
            {
                TrackStatus = TrackStatus.OnlyRightEye;
            }

            switch (TrackStatus)
            {
            case TrackStatus.BothEyes:
                targetAverageHeadPositionMm   = (SubtractableVector3)((SubtractableVector3)rightEyePositionMm + leftEyePositionMm) / 2f;
                targetAverageHeadPositionNorm = (SubtractableVector3)((SubtractableVector3)rightEyePositionNorm + leftEyePositionNorm) / 2f;
                break;

            case TrackStatus.OnlyLeftEye:
                targetAverageHeadPositionMm   = (SubtractableVector3)leftEyePositionMm + (SubtractableVector3)eyeOffsetMm / 2f;
                targetAverageHeadPositionNorm = (SubtractableVector3)leftEyePositionNorm + (SubtractableVector3)eyeOffsetNorm / 2f;
                break;

            case TrackStatus.OnlyRightEye:
                targetAverageHeadPositionMm   = (SubtractableVector3)rightEyePositionMm - (SubtractableVector3)eyeOffsetMm / 2f;
                targetAverageHeadPositionNorm = (SubtractableVector3)rightEyePositionNorm - (SubtractableVector3)eyeOffsetNorm / 2f;
                break;

            case TrackStatus.NoEyes:
            default:
                //Don't update D:
                break;
            }

            targetRoll = (float)Math.Atan2(eyeOffsetMm.Y, eyeOffsetMm.X);
            targetYaw  = -(float)Math.Atan2(eyeOffsetMm.Z, eyeOffsetMm.X);

            Roll = Lerp(Roll, targetRoll, 0.6f);
            Yaw  = Lerp(Yaw, targetYaw, 0.6f);

            AverageHeadPositionMm   = Lerp(AverageHeadPositionMm, targetAverageHeadPositionMm, 0.6f);
            AverageHeadPositionNorm = Lerp(AverageHeadPositionNorm, targetAverageHeadPositionNorm, 0.6f);

            //OnUpdate();
        }
Esempio n. 4
0
        public void Eval(EyePositionData eyePosition)
        {
            DateTime now = DateTime.Now;

            ///a blink is only valid if the blinked eye is closed for a duration within the min and max values, and the other eye remains open
            ///for the duration of the blink.
            if (lasteye != null)
            {
                if (EyePositionDataChanged(eyePosition, lasteye))
                {
                    if (eyePosition.HasLeftEyePosition != lasteye.HasLeftEyePosition)
                    {
                        if (eyePosition.HasLeftEyePosition)
                        {
                            if (states[EyeSide.Left].bs == BlinkState.Closed)
                            {
                                TimeSpan elapsed = now - states[EyeSide.Left].time;
                                if ((elapsed.TotalMilliseconds > min_blink_msec) && (elapsed.TotalMilliseconds < max_blink_msec))
                                {
                                    //did a blink!
                                    //Console.WriteLine("Blinked Left");
                                    pendingBlinkLeft = new BlinkInfo(EyeSide.Left, now);
                                }
                                else
                                {
                                    //invalid blink
                                }
                            }
                        }

                        states[EyeSide.Left].time = now;
                        states[EyeSide.Left].bs   = eyePosition.HasLeftEyePosition ? BlinkState.Opened : BlinkState.Closed;
                    }
                    if (eyePosition.HasRightEyePosition != lasteye.HasRightEyePosition)
                    {
                        if (eyePosition.HasRightEyePosition)
                        {
                            if (states[EyeSide.Right].bs == BlinkState.Closed)
                            {
                                TimeSpan elapsed = now - states[EyeSide.Right].time;
                                if ((elapsed.TotalMilliseconds > min_blink_msec) && (elapsed.TotalMilliseconds < max_blink_msec))
                                {
                                    //did a blink!
                                    //Console.WriteLine("Blinked Right");
                                    pendingBlinkRight = new BlinkInfo(EyeSide.Right, now);
                                }
                                else
                                {
                                    //invalid blink
                                }
                            }
                        }

                        states[EyeSide.Right].time = now;
                        states[EyeSide.Right].bs   = eyePosition.HasRightEyePosition ? BlinkState.Opened : BlinkState.Closed;
                    }
                    //Console.WriteLine("Left eye position: X:{0} Y:{1} Z:{2}",
                    //    eyePosition.LeftEye.X, eyePosition.LeftEye.Y, eyePosition.LeftEye.Z);
                    //Console.WriteLine("Left eye position (normalized): X:{0} Y:{1} Z:{2}",
                    //    eyePosition.LeftEyeNormalized.X, eyePosition.LeftEyeNormalized.Y, eyePosition.LeftEyeNormalized.Z);

                    //Console.WriteLine("Has Right eye position: {0}", eyePosition.HasRightEyePosition);
                    //Console.WriteLine("Right eye position: X:{0} Y:{1} Z:{2}",
                    //    eyePosition.RightEye.X, eyePosition.RightEye.Y, eyePosition.RightEye.Z);
                    //Console.WriteLine("Right eye position (normalized): X:{0} Y:{1} Z:{2}",
                    //    eyePosition.RightEyeNormalized.X, eyePosition.RightEyeNormalized.Y, eyePosition.RightEyeNormalized.Z);
                    //Console.WriteLine();
                }
            }
            lasteye = eyePosition;

            if ((pendingBlinkLeft != null) && (pendingBlinkRight != null))
            {
                ///pendingBlinkLeft = null;
                //pendingBlinkRight = null;
            }
            if (pendingBlinkLeft != null)
            {
                TimeSpan elapsed = now - pendingBlinkLeft.timestamp;
                if (elapsed.TotalMilliseconds > post_blink_msec)
                {
                    // Console.WriteLine("Blinked Left");
                    pendingBlinkLeft = null;
                }
            }
            if (pendingBlinkRight != null)
            {
                TimeSpan elapsed = now - pendingBlinkRight.timestamp;
                if (elapsed.TotalMilliseconds > post_blink_msec)
                {
                    //Console.WriteLine("Blinked Right");
                    pendingBlinkRight = null;
                }
            }
        }