internal static void HMDWriteEye(this XmlWriter file, IVRGazeDataEye eye, string name) { file.WriteStartElement(name); file.WriteWithValid("GazeDirection", eye.GazeDirection.ToString(FORMAT_FLOAT), eye.GazeDirectionValid); file.WriteWithValid("GazeOrigin", eye.GazeOrigin.ToString(FORMAT_FLOAT), eye.GazeOriginValid); file.WriteWithValid("PupilDiameter", eye.PupilDiameter.ToString(FORMAT_FLOAT), eye.PupilDiameterValid); file.WriteRay(eye.GazeRayWorld, eye.GazeRayWorldValid, "GazeRayWorld"); file.WriteEndElement(); }
private void WriteTobiiEyeData(string header, IVRGazeDataEye eye) { SaveInfo.AddToNestedDictionary(header, "PupilDiameter", eye.PupilDiameter.ToString(FORMAT_FLOAT)); SaveInfo.AddToNestedDictionary(header, "PupilPosition_X", eye.PupilPosiitionInTrackingArea.x.ToString(FORMAT_FLOAT)); SaveInfo.AddToNestedDictionary(header, "PupilPosition_Y", eye.PupilPosiitionInTrackingArea.y.ToString(FORMAT_FLOAT)); SaveInfo.AddToNestedDictionary(header, "RayOrigin_X", eye.GazeRayWorld.origin.x.ToString(FORMAT_FLOAT)); SaveInfo.AddToNestedDictionary(header, "RayOrigin_Y", eye.GazeRayWorld.origin.y.ToString(FORMAT_FLOAT)); SaveInfo.AddToNestedDictionary(header, "RayOrigin_Z", eye.GazeRayWorld.origin.z.ToString(FORMAT_FLOAT)); SaveInfo.AddToNestedDictionary(header, "RayDirection_X", eye.GazeRayWorld.direction.x.ToString(FORMAT_FLOAT)); SaveInfo.AddToNestedDictionary(header, "RayDirection_Y", eye.GazeRayWorld.direction.y.ToString(FORMAT_FLOAT)); SaveInfo.AddToNestedDictionary(header, "RayDirection_Z", eye.GazeRayWorld.direction.z.ToString(FORMAT_FLOAT)); }
/// <summary> /// Animate facial expression blend shapes. /// </summary> /// <param name="newDirectionL">The gaze direction for the left eye.</param> /// <param name="newDirectionR">The gaze direction for the right eye.</param> /// <param name="eyeDataLeft">Eye data for the left eye.</param> /// <param name="eyeDataRight">Eye data for the right eye.</param> private void AnimateEyeLid(IVRGazeDataEye leftEye, IVRGazeDataEye rightEye) { // Determine if Eyes are closed //var leftEyeClosed = leftEye.PupilPosiitionInTrackingAreaValid ? false : true; //var rightEyeClosed = rightEye.PupilPosiitionInTrackingAreaValid ? false : true; // If eye openness data is invalid use last value.\ //TobiiXR has useful function to determine if eye is blinking. var leftEyeClosed = (TobiiXR.EyeTrackingData.Left.EyeOpennessIsValid) ? (TobiiXR.EyeTrackingData.Left.EyeOpenness < 0.5f) : _leftEyeClosed; var rightEyeClosed = (TobiiXR.EyeTrackingData.Right.EyeOpennessIsValid) ? (TobiiXR.EyeTrackingData.Right.EyeOpenness < 0.5f) : _rightEyeClosed; var leftEyeBlinkValue = leftEyeClosed ? 100 : 0; var rightEyeBlinkValue = rightEyeClosed ? 100 : 0; // If eye openness has changed reset animation curve. if (leftEyeClosed != _leftEyeClosed) { _animationProgressL = 0; } if (rightEyeClosed != _rightEyeClosed) { _animationProgressR = 0; } _blinkL = Mathf.Lerp(_blinkL, leftEyeBlinkValue, _blendShapeAnimationCurve.Evaluate(_animationProgressL)); _blinkR = Mathf.Lerp(_blinkR, rightEyeBlinkValue, _blendShapeAnimationCurve.Evaluate(_animationProgressR)); _bodyBlendShape.SetBlendShapeWeight(BlendShapeLeftEyeLid, _blinkL); _bodyBlendShape.SetBlendShapeWeight(BlendShapeRightEyeLid, _blinkR); _leftEyeClosed = leftEyeClosed; _rightEyeClosed = rightEyeClosed; _animationProgressL += Time.deltaTime / _blendShapeAnimationTimeSeconds; _animationProgressR += Time.deltaTime / _blendShapeAnimationTimeSeconds; }