static bool EyePositionDataChanged(EyePositionData now, EyePositionData prev) { if (now.HasLeftEyePosition != prev.HasLeftEyePosition) { return(true); } if (now.HasRightEyePosition != prev.HasRightEyePosition) { return(true); } return(false); }
internal void OnInputHasEyes(EyePositionData eyePos) { m_HasLeftEye = eyePos.HasLeftEyePosition; m_HasRightEye = eyePos.HasRightEyePosition; }
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(); }
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; } } }